@mnaoumov/typescript-dev-toolkit 3.13.0 → 4.0.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.
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +1 -1
- package/dist/lib/cjs/docs-site/api-doc-settings.cjs +1 -1
- package/dist/lib/cjs/docs-site/api-doc-types.cjs +1 -1
- package/dist/lib/cjs/docs-site/api-doc-types.d.cts +57 -57
- package/dist/lib/cjs/docs-site/link-check.cjs +1 -1
- package/dist/lib/cjs/docs-site/link-check.d.cts +8 -8
- package/dist/lib/cjs/docs-site/og-images.cjs +1 -1
- package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +1 -1
- package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +1 -1
- package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +1 -1
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-config.cjs +2 -2
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +1 -1
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -3
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +4 -4
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +1 -1
- package/dist/lib/cjs/linters/eslint-rules/readonly-interface-members.cjs +68 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-interface-members.d.cts +18 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +1 -1
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +1 -1
- package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +1 -1
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +279 -279
- package/dist/lib/cjs/linters/over-exposure.cjs +1 -1
- package/dist/lib/cjs/linters/over-exposure.d.cts +6 -6
- package/dist/lib/cjs/npm.cjs +1 -1
- package/dist/lib/cjs/npm.d.cts +1 -1
- package/dist/lib/cjs/upstream-sync.cjs +1 -1
- package/dist/lib/cjs/upstream-sync.d.cts +31 -31
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +1 -1
- package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +1 -1
- package/dist/lib/esm/docs-site/api-doc-settings.mjs +1 -1
- package/dist/lib/esm/docs-site/api-doc-types.d.mts +57 -57
- package/dist/lib/esm/docs-site/link-check.d.mts +8 -8
- package/dist/lib/esm/docs-site/link-check.mjs +1 -1
- package/dist/lib/esm/docs-site/og-images.mjs +1 -1
- package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +1 -1
- package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +2 -2
- package/dist/lib/esm/docs-site/unrendered-alerts.mjs +1 -1
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +2 -2
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +1 -1
- package/dist/lib/esm/linters/eslint-config.mjs +2 -2
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +2 -2
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +1 -1
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -3
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/index.mjs +3 -3
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +1 -1
- package/dist/lib/esm/linters/eslint-rules/readonly-interface-members.d.mts +18 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-interface-members.mjs +43 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +1 -1
- package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +1 -1
- package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +1 -1
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +279 -279
- package/dist/lib/esm/linters/over-exposure.d.mts +6 -6
- package/dist/lib/esm/linters/over-exposure.mjs +1 -1
- package/dist/lib/esm/npm.d.mts +1 -1
- package/dist/lib/esm/npm.mjs +1 -1
- package/dist/lib/esm/upstream-sync.d.mts +31 -31
- package/dist/lib/esm/upstream-sync.mjs +1 -1
- package/linters/eslint-rules/readonly-interface-members/package.json +6 -0
- package/package.json +3 -3
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +0 -103
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +0 -20
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +0 -20
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +0 -78
- package/linters/eslint-rules/readonly-params-options-result-members/package.json +0 -6
|
@@ -177,27 +177,27 @@ export interface OverExposureFileSystem {
|
|
|
177
177
|
* @param path - Directory path.
|
|
178
178
|
* @returns `true` when the directory exists.
|
|
179
179
|
*/
|
|
180
|
-
directoryExists: (path: string) => boolean;
|
|
180
|
+
readonly directoryExists: (path: string) => boolean;
|
|
181
181
|
/**
|
|
182
182
|
* Checks whether a file exists.
|
|
183
183
|
*
|
|
184
184
|
* @param path - File path.
|
|
185
185
|
* @returns `true` when the file exists.
|
|
186
186
|
*/
|
|
187
|
-
fileExists: (path: string) => boolean;
|
|
187
|
+
readonly fileExists: (path: string) => boolean;
|
|
188
188
|
/**
|
|
189
189
|
* Resolves the directory that relative paths are resolved against.
|
|
190
190
|
*
|
|
191
191
|
* @returns The current working directory.
|
|
192
192
|
*/
|
|
193
|
-
getCurrentDirectory: () => string;
|
|
193
|
+
readonly getCurrentDirectory: () => string;
|
|
194
194
|
/**
|
|
195
195
|
* Lists the immediate subdirectories of a directory.
|
|
196
196
|
*
|
|
197
197
|
* @param path - Directory path.
|
|
198
198
|
* @returns The immediate subdirectory names.
|
|
199
199
|
*/
|
|
200
|
-
getDirectories: (path: string) => string[];
|
|
200
|
+
readonly getDirectories: (path: string) => string[];
|
|
201
201
|
/**
|
|
202
202
|
* Lists the files under a directory, filtered by extension and include/exclude patterns.
|
|
203
203
|
*
|
|
@@ -208,14 +208,14 @@ export interface OverExposureFileSystem {
|
|
|
208
208
|
* @param depth - Maximum recursion depth.
|
|
209
209
|
* @returns The matching file paths.
|
|
210
210
|
*/
|
|
211
|
-
readDirectory: (path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number) => string[];
|
|
211
|
+
readonly readDirectory: (path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number) => string[];
|
|
212
212
|
/**
|
|
213
213
|
* Reads a file as text.
|
|
214
214
|
*
|
|
215
215
|
* @param path - File path.
|
|
216
216
|
* @returns The file contents, or `undefined` when absent.
|
|
217
217
|
*/
|
|
218
|
-
readFile: (path: string) => string | undefined;
|
|
218
|
+
readonly readFile: (path: string) => string | undefined;
|
|
219
219
|
}
|
|
220
220
|
/**
|
|
221
221
|
* A single over-exposed declaration.
|
|
@@ -660,4 +660,4 @@ export {
|
|
|
660
660
|
findOverExposure,
|
|
661
661
|
formatOverExposureFindings
|
|
662
662
|
};
|
|
663
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE92ZXItZXhwb3N1cmUgYW5hbHl6ZXIuXG4gKlxuICogRmluZHMgZGVjbGFyYXRpb25zIGV4cG9zZWQgbW9yZSBicm9hZGx5IHRoYW4gdGhlaXIgcmVmZXJlbmNlcyByZXF1aXJlLCBzbyB0aGUgZXhwb3N1cmUgY2FuIGJlXG4gKiB0aWdodGVuZWQ6XG4gKlxuICogLSBgZXhwb3J0YGVkIHN5bWJvbHMgcmVmZXJlbmNlZCBvbmx5IHdpdGhpbiB0aGVpciBvd24gZmlsZSDigJQgdGhlIGBleHBvcnRgIGNhbiBiZSBkcm9wcGVkLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIOKAlCB0aGV5IGNhbiBiZSBgcHJpdmF0ZWAuXG4gKiAtIGBwdWJsaWNgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIOKAlCB0aGV5IGNhbiBiZVxuICogICBgcHJvdGVjdGVkYC5cbiAqIC0gYHByb3RlY3RlZGAgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyDigJQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICpcbiAqIFRoZSBhbmFseXNpcyBpcyB3aG9sZS1wcm9ncmFtIGFuZCB0eXBlLWF3YXJlOiBpdCB1c2VzIHRoZSBUeXBlU2NyaXB0IGxhbmd1YWdlIHNlcnZpY2Unc1xuICogZmluZC1hbGwtcmVmZXJlbmNlcyB0byBsb2NhdGUgZXZlcnkgdXNlIG9mIGVhY2ggZGVjbGFyYXRpb24sIHRoZW4gY2xhc3NpZmllcyB0aGUgdGlnaHRlc3RcbiAqIGV4cG9zdXJlIHRoYXQgc3RpbGwgY292ZXJzIGFsbCByZWZlcmVuY2VzLiBCZWNhdXNlIGBmaW5kUmVmZXJlbmNlc2AgZG9lcyBub3QgbGluayBhIHN0cmluZy1saXRlcmFsXG4gKiBhcmd1bWVudCBiYWNrIHRvIGEgbWVtYmVyIGRlY2xhcmF0aW9uIHdoZW4gdGhlIHBhcmFtZXRlciBpcyBhIGNvbmRpdGlvbmFsL21hcHBlZCBrZXkgdHlwZSAoZS5nLlxuICogYGJpbmQoY29tcG9uZW50LCAnc29tZVNldHRpbmcnKWAgd2hlcmUgdGhlIGtleSBpcyB0eXBlZCBgQ29uZGl0aW9uYWxLZXlzPFNldHRpbmdzLCDigKY+YCksIG1lbWJlclxuICogYW5hbHlzaXMgYWRkaXRpb25hbGx5IHRyZWF0cyBhIHN0cmluZyBsaXRlcmFsIHdob3NlIHRleHQgZXF1YWxzIHRoZSBtZW1iZXIgbmFtZSBhcyBhIHJlZmVyZW5jZSDigJRcbiAqIGJ1dCBvbmx5IHdoZW4gaXRzIGNvbnRleHR1YWwgdHlwZSBpcyBhIHN0cmluZy1saXRlcmFsIHR5cGUgKG9yIHVuaW9uIG9mIHRoZW0pIGFsbCBvZiB3aG9zZSBtZW1iZXJzXG4gKiBhcmUga2V5cyBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzLCBzbyBpbmNpZGVudGFsIHNhbWUtbmFtZWQgc3RyaW5ncyAoYGNvbnNvbGUubG9nKCduYW1lJylgKSBhcmUgbm90XG4gKiBtaXNjb3VudGVkLiBNZW1iZXJzIGludm9rZWQgYnkgdGhlIGZyYW1ld29yayB2aWEgcmVnaXN0cmF0aW9uXG4gKiByYXRoZXIgdGhhbiBieSB2aXNpYmxlIHJlZmVyZW5jZXMgKE9ic2lkaWFuIGxpZmVjeWNsZSBob29rcywgc2V0dGluZ3MtdGFiIGBkaXNwbGF5YCwgZXRjLikgYXJlXG4gKiBleGNsdWRlZCB2aWEge0BsaW5rIExJRkVDWUNMRV9BTExPV0xJU1R9LCBhcyBhcmUgYG92ZXJyaWRlYCBhbmQgYHN0YXRpY2AgbWVtYmVycyB3aG9zZSBleHBvc3VyZSBpc1xuICogY29uc3RyYWluZWQgYnkgYSBiYXNlIGRlY2xhcmF0aW9uLiBFQ01BU2NyaXB0IGhhcmQtcHJpdmF0ZSBtZW1iZXJzIChgI25hbWVgKSBhcmUgYWxzbyBleGNsdWRlZCDigJRcbiAqIHRoZXkgYXJlIGFscmVhZHkgbWF4aW1hbGx5IHByaXZhdGUgYW5kIGNhbm5vdCBjYXJyeSBhIHZpc2liaWxpdHkgbW9kaWZpZXIuIEEgZGVjbGFyYXRpb24gY2FycnlpbmdcbiAqIGEgVFNEb2MgKGAvKiog4oCmICpcXC9gKSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgaXMgbGlrZXdpc2UgZXhjbHVkZWQg4oCUIHdoZXRoZXIgYSB0b3AtbGV2ZWwgYGV4cG9ydGAgb3JcbiAqIGEgY2xhc3MgbWVtYmVyLCBkb2N1bWVudGluZyBpdCBpcyBhIGRlbGliZXJhdGUgc2lnbmFsIHRoYXQgaXQgaXMgcGFydCBvZiB0aGUgaW50ZW5kZWQgcHVibGljIEFQSSxcbiAqIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgY3VycmVudGx5IGhhcHBlbnMgdG8gYmUgcmVmZXJlbmNlZC5cbiAqXG4gKiBBIG1lbWJlciByZWZlcmVuY2VkIG9ubHkgZnJvbSB0ZXN0IGZpbGVzIGlzIHJlcG9ydGVkIHdpdGgge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5fVxuICogc2V0LCBzdXJmYWNpbmcgbWVtYmVycyB3aWRlbmVkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkg4oCUIHRoZSBjYW5vbmljYWwgY2FzZSBmb3IgZXh0cmFjdGluZyBsb2dpY1xuICogaW50byBhbiBpbmRlcGVuZGVudGx5IHRlc3RhYmxlIGNvbXBvbmVudCBpbnN0ZWFkLlxuICpcbiAqIEJleW9uZCByZXBvcnRpbmcsIHBhc3NpbmcgYHNob3VsZEZpeGAgdG8ge0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9IC8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9XG4gKiByZXdyaXRlcyB0aGUgc291cmNlIGluIHBsYWNlOiBkcm9wcGluZyB0aGUgYGV4cG9ydGAga2V5d29yZCwgb3IgcmVwbGFjaW5nL2luc2VydGluZyBhIGBwcml2YXRlYFxuICogb3IgYHByb3RlY3RlZGAgbW9kaWZpZXIuIEVhY2ggZmluZGluZyB0aGVuIGNhcnJpZXMge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBDaGFuZ2VzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQg4oCUIHRob3NlIGZvcmNlZFxuICogb25seSBieSB0ZXN0IHJlZmVyZW5jZXMsIGRlY29yYXRlZCBtZW1iZXJzLCBvciBhbiBgZXhwb3J0YCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcg4oCUXG4gKiBhcmUgcmVwb3J0ZWQgYXMgc2tpcHBlZCBhbmQgbGVmdCB1bnRvdWNoZWQuXG4gKlxuICogQWRkaXRpb25hbGx5IHBhc3NpbmcgYHNob3VsZEZvcmNlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGggYHNob3VsZEZpeGApIHRpZ2h0ZW5zIHRoZVxuICogZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnkgdGVzdCByZWZlcmVuY2VzIHRvbyDigJQgdGhlIHByb2R1Y3Rpb24gaGFsZiBvZiB0aGUgY2Fub25pY2FsXG4gKiB0ZXN0LW9ubHkgbWlncmF0aW9uOiB0aGUgbWVtYmVyIGJlY29tZXMgYHByaXZhdGVgIC8gdGhlIGBleHBvcnRgIGlzIGRyb3BwZWQsIGxlYXZpbmcgb25seSB0aGVcbiAqIHRlc3QgdG8gc3dpdGNoIHRvIGEgY2FzdC1iYXNlZCBhY2Nlc3MuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWRcbiAqIHNpYmxpbmcgc3RheSBza2lwcGVkIGV2ZW4gdW5kZXIgYHNob3VsZEZvcmNlYCwgYmVjYXVzZSBubyBlZGl0IGNhbiBiZSBhcHBsaWVkIHNhZmVseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIENsYXNzRGVjbGFyYXRpb24sXG4gIENsYXNzTGlrZURlY2xhcmF0aW9uLFxuICBDb21waWxlck9wdGlvbnMsXG4gIEVudW1EZWNsYXJhdGlvbixcbiAgRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIElTY3JpcHRTbmFwc2hvdCxcbiAgTGFuZ3VhZ2VTZXJ2aWNlLFxuICBMYW5ndWFnZVNlcnZpY2VIb3N0LFxuICBNZXRob2REZWNsYXJhdGlvbixcbiAgTm9kZSxcbiAgUHJvZ3JhbSxcbiAgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgUmVmZXJlbmNlZFN5bWJvbCxcbiAgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgU291cmNlRmlsZSxcbiAgU3RyaW5nTGl0ZXJhbExpa2UsXG4gIFR5cGUsXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVTdGF0ZW1lbnRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGNhbkhhdmVNb2RpZmllcnMsXG4gIGNyZWF0ZURvY3VtZW50UmVnaXN0cnksXG4gIGNyZWF0ZUxhbmd1YWdlU2VydmljZSxcbiAgZ2V0RGVjb3JhdG9ycyxcbiAgZ2V0RGVmYXVsdExpYkZpbGVQYXRoLFxuICBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyxcbiAgZ2V0TW9kaWZpZXJzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzQ2xhc3NMaWtlLFxuICBpc0VudW1EZWNsYXJhdGlvbixcbiAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzSWRlbnRpZmllcixcbiAgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNQcml2YXRlSWRlbnRpZmllcixcbiAgaXNQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzU291cmNlRmlsZSxcbiAgaXNTdHJpbmdMaXRlcmFsTGlrZSxcbiAgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgaXNWYXJpYWJsZVN0YXRlbWVudCxcbiAgU2NyaXB0U25hcHNob3QsXG4gIFN5bnRheEtpbmQsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGJlZm9yZSB0aGF0IGZpbGUgaXMgcHJvY2Vzc2VkLiBUaGVcbiAgICogd2hvbGUtcHJvZ3JhbSByZWZlcmVuY2UgYW5hbHlzaXMgaXMgc2xvdywgc28gdGhpcyBsZXRzIGNhbGxlcnMgcmVwb3J0IGxpdmUgcHJvZ3Jlc3MgaW5zdGVhZCBvZlxuICAgKiBhcHBlYXJpbmcgdG8gaGFuZy5cbiAgICovXG4gIHJlYWRvbmx5IG9uUHJvZ3Jlc3M/OiAocHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgdGlnaHRlbmVkIGluIHBsYWNlIHZpYSB7QGxpbmsgd3JpdGVGaWxlfSAod2hpY2ggbXVzdCB0aGVuXG4gICAqIGJlIHByb3ZpZGVkKSwgYW5kIHRoZSByZXR1cm5lZCBmaW5kaW5ncyBjYXJyeSB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gL1xuICAgKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZpeD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIChvbmx5IG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCB7QGxpbmsgc2hvdWxkRml4fSksIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5XG4gICAqIHRlc3QgcmVmZXJlbmNlcyBhcmUgdGlnaHRlbmVkIHRvbywgaW5zdGVhZCBvZiBiZWluZyBza2lwcGVkIHdpdGggYSBgdGVzdC1vbmx5YFxuICAgKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gRGVjb3JhdGVkIG1lbWJlcnMgYW5kIGV4cG9ydHMgc2hhcmVkIHdpdGggYVxuICAgKiBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIHN0YXkgc2tpcHBlZCByZWdhcmRsZXNzLCBiZWNhdXNlIG5vIGVkaXQgY2FuIGJlIGFwcGxpZWQgc2FmZWx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVGaWxlPzogKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJPcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gIFRoZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwcm9ncmFtLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuXG4gICAqL1xuICByZWFkb25seSBmaWxlU3lzdGVtOiBPdmVyRXhwb3N1cmVGaWxlU3lzdGVtO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuXG4gICAqL1xuICByZWFkb25seSB0c0NvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjdXJyZW50bHkgaGFzLlxuICovXG5leHBvcnQgdHlwZSBDdXJyZW50RXhwb3N1cmUgPSAnZXhwb3J0JyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgZm9yIGxpdmUgcHJvZ3Jlc3MgcmVwb3J0aW5nLiBGb3J3YXJkZWRcbiAgICogdG8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgcmVhZG9ubHkgb25Qcm9ncmVzcz86IChwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpID0+IHZvaWQ7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZml4YWJsZSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIGluIHBsYWNlIG9uIGRpc2sgKHRoZSBgZXhwb3J0YCBrZXl3b3JkIGlzIGRyb3BwZWQsXG4gICAqIG9yIGEgYHByaXZhdGVgIC8gYHByb3RlY3RlZGAgbW9kaWZpZXIgaXMgaW5zZXJ0ZWQvcmVwbGFjZWQpLiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlXG4gICAqIHByb2plY3QgaXMgb25seSBhbmFseXplZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkaXJlY3RvcnkgZXhpc3RzLlxuICAgKi9cbiAgZGlyZWN0b3J5RXhpc3RzOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGZpbGUgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgZmlsZUV4aXN0czogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGRpcmVjdG9yeSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZXNvbHZlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdHMgdGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcmllcyBvZiBhIGRpcmVjdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICBnZXREaXJlY3RvcmllczogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSwgZmlsdGVyZWQgYnkgZXh0ZW5zaW9uIGFuZCBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeTogKHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpID0+IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBSZWFkcyBhIGZpbGUgYXMgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRGaWxlOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKipcbiAgMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbC5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGRlY2xhcmluZyB0aGUgc3ltYm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gd291bGQgcXVhbGlmeSBmb3IgYSB0aWdodGVyIGV4cG9zdXJlIGlmIG5vdCBmb3IgcmVmZXJlbmNlcyBjb21pbmdcbiAgICogZXhjbHVzaXZlbHkgZnJvbSB0ZXN0IGZpbGVzIOKAlCBpLmUuIGl0IGlzIGV4cG9zZWQgcHVyZWx5IGZvciB0ZXN0YWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRm9yY2VkQnlUZXN0T25seTogYm9vbGVhbjtcblxuICAvKipcbiAgYHRydWVgIGZvciBhIGNsYXNzIG1lbWJlciwgYGZhbHNlYCBmb3IgYSB0b3AtbGV2ZWwgZXhwb3J0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNNZW1iZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gIDEtYmFzZWQgbGluZSBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGVjbGFyZWQgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogSW4gYSBmaXggcnVuLCB3aHkgdGhpcyBmaW5kaW5nIHdhcyBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIHRpZ2h0ZW5lZDsgYG51bGxgIHdoZW4gaXQgd2FzXG4gICAqIGZpeGVkIG9yIHdoZW4gdGhlIGFuYWx5c2lzIG9ubHkgcmVwb3J0ZWQgKGBzaG91bGRGaXhgIG9mZikuXG4gICAqL1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbjtcblxuICAvKipcbiAgVGhlIGV4cG9zdXJlIHRoZSBkZWNsYXJhdGlvbiBjb3VsZCBiZSB0aWdodGVuZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG5cbiAgLyoqXG4gIGB0cnVlYCB3aGVuIGEgZml4IHJ1biB0aWdodGVuZWQgdGhpcyBkZWNsYXJhdGlvbiBpbiBwbGFjZS4gQWx3YXlzIGBmYWxzZWAgaW4gYSByZXBvcnQgcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKlxuICBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgYW5hbHl6ZWRGaWxlQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgc291cmNlIGZpbGUgYWJvdXQgdG8gYmUgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAg4oCUIHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCDigJQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIOKAlCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhcHBseU92ZXJFeHBvc3VyZUZpeGVzfS5cbiAqL1xuaW50ZXJmYWNlIEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIHByb2dyYW0gd2hvc2Ugc291cmNlIGZpbGVzIHN1cHBseSB0aGUgb3JpZ2luYWwgdGV4dCB0aGUgZWRpdHMgYXJlIGFwcGxpZWQgdG87IGB1bmRlZmluZWRgIHdoZW4gbm8gcHJvZ3JhbSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgcmVzdWx0IHdob3NlIGZpbmRpbmdzIGFuZCBlZGl0cyBhcmUgdHVybmVkIGludG8gaW4tcGxhY2UgZml4ZXMuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IEFuYWx5c2lzUmVzdWx0O1xuXG4gIC8qKlxuICBXaGVuIGB0cnVlYCwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnkgdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suXG4gICAqL1xuICByZWFkb25seSB3cml0ZUZpbGU6IChwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRGaW5kaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEJ1aWxkRmluZGluZ1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbCBvZiB0aGUgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKipcbiAgRmxhZ3MgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gcmVmZXJlbmNlcyBhdCBhbGwgb3IgaXMgZm9yY2VkIHdpZGUgYnkgdGVzdC1vbmx5IHJlZmVyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBmbGFnczogRmluZGluZ0ZsYWdzO1xuXG4gIC8qKlxuICBUaGUgZGVjbGFyYXRpb24ncyBuYW1lIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgcG9zaXRpb24gYW5kIHRleHQuXG4gICAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcblxuICAvKipcbiAgVGhlIGRlY2xhcmF0aW9uIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgc291cmNlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuXG4gIC8qKlxuICBUaGUgdGlnaHRlciBleHBvc3VyZSBsZXZlbCB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZTtcbn1cblxudHlwZSBDbGFzc01lbWJlckRlY2xhcmF0aW9uID0gR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb247XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlc30uXG4gKi9cbmludGVyZmFjZSBDb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIGFuYWx5c2lzIGNvbnRleHQgcHJvdmlkaW5nIHRoZSBzdHJpbmctbGl0ZXJhbCBpbmRleCBhbmQgdHlwZSBjaGVja2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKlxuICBUaGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZW1iZXIgd2hvc2UgbmFtZSB0aGUgc3RyaW5nIGxpdGVyYWxzIG1pZ2h0IHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgVGhlIG1lbWJlcidzIG5hbWUgbm9kZSwgd2hvc2UgdGV4dCBpcyBtYXRjaGVkIGFnYWluc3Qgc3RyaW5nLWxpdGVyYWwgb2NjdXJyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29tcHV0ZU5lZWRlZEV4cG9zdXJlfS5cbiAqL1xuaW50ZXJmYWNlIENvbXB1dGVOZWVkZWRFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgY29udGV4dCBwcm92aWRpbmcgdGhlIHByb2dyYW0gYW5kIHR5cGUgY2hlY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKipcbiAgVGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWVtYmVyIHdob3NlIG5lZWRlZCBleHBvc3VyZSBpcyBjb21wdXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgVGhlIHJlZmVyZW5jZSBsb2NhdGlvbnMgdGhhdCBtdXN0IHJlbWFpbiByZWFjaGFibGUgYXQgdGhlIGNvbXB1dGVkIGV4cG9zdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlczogcmVhZG9ubHkgUmVmZXJlbmNlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGV0ZXJtaW5lU2tpcFJlYXNvbn0uXG4gKi9cbmludGVyZmFjZSBEZXRlcm1pbmVTa2lwUmVhc29uUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSB0ZXh0IGVkaXQgdGhhdCB3b3VsZCB0aWdodGVuIHRoZSBmaW5kaW5nLCBvciBgbnVsbGAgd2hlbiBubyBzYWZlIGVkaXQgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0O1xuXG4gIC8qKlxuICBUaGUgZmluZGluZyB1bmRlciBjb25zaWRlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcblxuICAvKipcbiAgV2hlbiBgdHJ1ZWAsIHRlc3Qtb25seSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIHJhdGhlciB0aGFuIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZTogYm9vbGVhbjtcbn1cblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldENsYXNzQXRQb3NpdGlvbn0uXG4gKi9cbmludGVyZmFjZSBHZXRDbGFzc0F0UG9zaXRpb25QYXJhbXMge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwb3NpdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIDAtYmFzZWQgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgcmVmZXJlbmNlIHdpdGhpbiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBwcm9ncmFtIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0Rlcml2ZWRGcm9tfS5cbiAqL1xuaW50ZXJmYWNlIElzRGVyaXZlZEZyb21QYXJhbXMge1xuICAvKipcbiAgVGhlIGNhbmRpZGF0ZSBiYXNlIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZTogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG5cbiAgLyoqXG4gIFRoZSB0eXBlIGNoZWNrZXIgdXNlZCB0byByZXNvbHZlIGhlcml0YWdlIHN5bWJvbHMuXG4gICAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKipcbiAgVGhlIGNhbmRpZGF0ZSBkZXJpdmVkIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzS2V5UmVmZXJlbmNlVG9DbGFzc30uXG4gKi9cbmludGVyZmFjZSBJc0tleVJlZmVyZW5jZVRvQ2xhc3NQYXJhbXMge1xuICAvKipcbiAgVGhlIHR5cGUgY2hlY2tlciB1c2VkIHRvIHJlc29sdmUgdGhlIGxpdGVyYWwncyBjb250ZXh0dWFsIHR5cGUuXG4gICAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKipcbiAgVGhlIHNldCBvZiBwcm9wZXJ0eSBrZXlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGtleVNldDogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgVGhlIHN0cmluZy1saXRlcmFsIG5vZGUgYmVpbmcgdGVzdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZTogU3RyaW5nTGl0ZXJhbExpa2U7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzT3duU291cmNlRmlsZX0uXG4gKi9cbmludGVyZmFjZSBJc093blNvdXJjZUZpbGVQYXJhbXMge1xuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgZmlsZSB1bmRlciB0ZXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG50eXBlIE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcgfCAncHVibGljJztcblxuLyoqXG4gKiBBIHNpbmdsZSBpbi1wbGFjZSB0ZXh0IHJlcGxhY2VtZW50IHRoYXQgdGlnaHRlbnMgYSBkZWNsYXJhdGlvbidzIGV4cG9zdXJlLiBBIHplcm8tbGVuZ3RoIGVkaXQgaXNcbiAqIGFuIGluc2VydGlvbiAoZS5nLiBhZGRpbmcgYW4gZXhwbGljaXQgYHByaXZhdGVgIG1vZGlmaWVyIHRvIGFuIGltcGxpY2l0bHktYHB1YmxpY2AgbWVtYmVyKS5cbiAqL1xuaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5ld1RleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVjb3JkfS5cbiAqL1xuaW50ZXJmYWNlIFJlY29yZFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgY29udGV4dCB3aG9zZSBmaW5kaW5ncyBhbmQgZWRpdHMgYXJlIGFwcGVuZGVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKlxuICBUaGUgdGV4dCBlZGl0IHRoYXQgd291bGQgdGlnaHRlbiB0aGUgZmluZGluZywgb3IgYG51bGxgIHdoZW4gbm8gc2FmZSBlZGl0IGV4aXN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdDtcblxuICAvKipcbiAgVGhlIGZpbmRpbmcgdG8gcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcbn1cblxuaW50ZXJmYWNlIFJlZmVyZW5jZUxvY2F0aW9uIHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNvdXJjZUZpbGVUZXh0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2Uge1xuICByZWFkb25seSBub2RlOiBTdHJpbmdMaXRlcmFsTGlrZTtcbiAgcmVhZG9ubHkgc291cmNlRmlsZTogU291cmNlRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9EaXNwbGF5UGF0aH0uXG4gKi9cbmludGVyZmFjZSBUb0Rpc3BsYXlQYXRoUGFyYW1zIHtcbiAgLyoqXG4gIFdoZW4gc2V0LCB0aGUgcGF0aCBpcyByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlcjsgcGF0aHMgb3V0c2lkZSBpdCBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIHRvIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8vIEEgSlNEb2MvVFNEb2MgY29tbWVudCBvcGVucyB3aXRoIGAvKipgOiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAyIGlzIHRoZSBzZWNvbmQgYCpgLCBhbmQgdG8gZXhjbHVkZSB0aGUgZW1wdHkgYC8qKi9gIGNvbW1lbnQgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMyBtdXN0IG5vdCBiZSB0aGUgY2xvc2luZyBgL2AuXG5jb25zdCBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUID0gMjtcbmNvbnN0IEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUID0gMztcbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIOKAlFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCDigJQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkIOKAlCB1bmxlc3NcbiAqIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZvcmNlfSBpcyBzZXQsIHdoaWNoIGFkZGl0aW9uYWxseSB0aWdodGVucyB0aGUgdGVzdC1vbmx5XG4gKiBmaW5kaW5ncyAoZGVjb3JhdGVkIGFuZCBzaGFyZWQtZXhwb3J0IG9uZXMgc3RpbGwgc3RheSBza2lwcGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtcyk7XG4gIGlmICghcGFyYW1zLnNob3VsZEZpeCkge1xuICAgIHJldHVybiBbLi4ucmVzdWx0LmZpbmRpbmdzXTtcbiAgfVxuXG4gIGNvbnN0IHsgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGFzc2VydE5vbk51bGxhYmxlKHdyaXRlRmlsZSwgJ3dyaXRlRmlsZSBpcyByZXF1aXJlZCB3aGVuIHNob3VsZEZpeCBpcyB0cnVlLicpO1xuICByZXR1cm4gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyh7XG4gICAgcHJvZ3JhbTogcGFyYW1zLmxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCksXG4gICAgcmVzdWx0LFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UsXG4gICAgd3JpdGVGaWxlXG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgJiYgeyBvblByb2dyZXNzOiBwYXJhbXMub25Qcm9ncmVzcyB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydCwgdXNpbmcgdGhlIGdyb3VwZWQgbGF5b3V0IG9mIEVTTGludCdzXG4gKiBgc3R5bGlzaGAgZm9ybWF0dGVyLiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBzb3J0ZWQgYnkgbGluZTogZWFjaCBmaWxlIGlzIHJlbmRlcmVkIGFzIGFcbiAqIGBwYXRoYCBoZWFkZXIgbGluZSwgZm9sbG93ZWQgYnkgb25lIGluZGVudGVkIGAgIGxpbmU6Y29sdW1uICBjaGFuZ2UgLS0gcmVhc29uYCByb3cgcGVyIGZpbmRpbmcgKHRoZVxuICogYGxpbmU6Y29sdW1uYCBpcyByaWdodC1wYWRkZWQgc28gdGhlIHJvd3MgYWxpZ24gd2l0aGluIGEgZmlsZSkuIFRlcm1pbmFscyBzdWNoIGFzIFZTIENvZGUgcmVuZGVyXG4gKiBlYWNoIGluZGVudGVkIGBsaW5lOmNvbHVtbmAgYXMgYSBjbGlja2FibGUgbGluayDigJQgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZmlsZSBoZWFkZXIgYWJvdmUgaXQg4oCUIHRoYXRcbiAqIGp1bXBzIHN0cmFpZ2h0IHRvIHRoZSBkZWNsYXJhdGlvbi4gRmlsZSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEluIGEgZml4IHJ1biAoZmluZGluZ3NcbiAqIGNhcnJ5aW5nIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259KSBlYWNoIGNoYW5nZVxuICogcm93IGlzIHN1ZmZpeGVkIHdpdGggYFtmaXhlZF1gIG9yIGBbc2tpcHBlZDog4oCmXWAsIGFuZCB0aGUgdHJhaWxpbmcgc3VtbWFyeSBhcHBlbmRzIHRoZSBmaXhlZC9za2lwcGVkXG4gKiBjb3VudHMuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcbiAgY29uc3QgbGluZXMgPSBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzLCBiYXNlRm9sZGVyKTtcbiAgbGluZXMucHVzaChmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzKSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZSk7XG4gIGlmICghZGVjbGFyYXRpb24gfHwgaGFzVHNEb2NDb21tZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbGFyYXRpb25GaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyh7XG4gICAgICAgICAgY3VycmVudEV4cG9zdXJlOiAnZXhwb3J0JyxcbiAgICAgICAgICBmbGFnczogeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoe1xuICAgICAgICAgIGN1cnJlbnRFeHBvc3VyZTogJ2V4cG9ydCcsXG4gICAgICAgICAgZmxhZ3M6IHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbkRyb3BFeHBvcnQgPSBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gbmFtZU5vZGVzLmxlbmd0aCAmJiBjYW5kaWRhdGVzLmV2ZXJ5KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pc1BsYWluRmlsZUxvY2FsIHx8IGNvbnRleHQuc2hvdWxkRm9yY2UpO1xuICBjb25zdCBleHBvcnRFZGl0ID0gY2FuRHJvcEV4cG9ydCA/IGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbikgOiBudWxsO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgcmVjb3JkKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBlZGl0OiBleHBvcnRFZGl0LFxuICAgICAgZmluZGluZzogY2FuZGlkYXRlLmZpbmRpbmdcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhbmFseXplTWVtYmVyKG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBtZW1iZXIgPSBhc0NsYXNzTWVtYmVyKG5vZGUpO1xuICBpZiAoIW1lbWJlciB8fCAhaXNDbGFzc0xpa2Uobm9kZS5wYXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gbWVtYmVyLm5hbWU7XG4gIGNvbnN0IGRlY2xhcmluZ0NsYXNzID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKGlzUHJpdmF0ZUlkZW50aWZpZXIobmFtZU5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kaWZpZXJLaW5kcyA9IGdldE1vZGlmaWVyS2luZHMobWVtYmVyKTtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgfHwgbW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5PdmVycmlkZUtleXdvcmQpIHx8IExJRkVDWUNMRV9BTExPV0xJU1QuaGFzKG5hbWVOb2RlLmdldFRleHQoKSkgfHwgaGFzVHNEb2NDb21tZW50KG1lbWJlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50RXhwb3N1cmUgPSBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kcyk7XG4gIGlmIChjdXJyZW50RXhwb3N1cmUgPT09ICdwcml2YXRlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBkaXJlY3RSZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+IGlzQ29kZVJlZmVyZW5jZShjb250ZXh0LCByZWZlcmVuY2UpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgbmFtZU5vZGUgfSldO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgcmVmZXJlbmNlczogbm9uVGVzdFJlZmVyZW5jZXMgfSk7XG5cbiAgaWYgKChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB8fCAocmFua0V4cG9zdXJlKG5lZWRlZEZvclNyYykgPj0gcmFua0V4cG9zdXJlKGN1cnJlbnRFeHBvc3VyZSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXMgfSk7XG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcoe1xuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmbGFnczoge1xuICAgICAgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICAgIH0sXG4gICAgbmFtZU5vZGUsXG4gICAgbm9kZTogbWVtYmVyLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlOiBuZWVkZWRGb3JTcmNcbiAgfSk7XG4gIHJlY29yZCh7XG4gICAgY29udGV4dCxcbiAgICBlZGl0OiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlciwgbmVlZGVkRm9yU3JjKSxcbiAgICBmaW5kaW5nXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhwYXJhbXM6IEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCB7IHByb2dyYW0sIHJlc3VsdCwgc2hvdWxkRm9yY2UsIHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbih7IGVkaXQsIGZpbmRpbmcsIHNob3VsZEZvcmNlIH0pO1xuICAgIGlmIChza2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uLCB3YXNGaXhlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZWRpdCwgJ0EgZml4YWJsZSBmaW5kaW5nIG11c3QgY2FycnkgYSB0ZXh0IGVkaXQuJyk7XG4gICAgY29uc3QgZmlsZUVkaXRzID0gZWRpdHNCeUZpbGUuZ2V0KGVkaXQuZmlsZU5hbWUpID8/IFtdO1xuICAgIGZpbGVFZGl0cy5wdXNoKGVkaXQpO1xuICAgIGVkaXRzQnlGaWxlLnNldChlZGl0LmZpbGVOYW1lLCBmaWxlRWRpdHMpO1xuICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb246IG51bGwsIHdhc0ZpeGVkOiB0cnVlIH07XG4gIH0pO1xuXG4gIGlmIChlZGl0c0J5RmlsZS5zaXplID4gMCkge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdBIHByb2dyYW0gaXMgZXhwZWN0ZWQgd2hlbiB0aGVyZSBhcmUgZWRpdHMgdG8gYXBwbHkuJyk7XG4gICAgY29uc3Qgc291cmNlVGV4dEJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlVGV4dD4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICBzb3VyY2VUZXh0QnlGaWxlLnNldCh0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSwgeyBmaWxlTmFtZTogc291cmNlRmlsZS5maWxlTmFtZSwgdGV4dDogc291cmNlRmlsZS50ZXh0IH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjYW5vbmljYWxGaWxlTmFtZSwgZmlsZUVkaXRzXSBvZiBlZGl0c0J5RmlsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlVGV4dEJ5RmlsZS5nZXQoY2Fub25pY2FsRmlsZU5hbWUpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7Y2Fub25pY2FsRmlsZU5hbWV9YCk7XG4gICAgICB3cml0ZUZpbGUoc291cmNlLmZpbGVOYW1lLCBhcHBseUVkaXRzKHNvdXJjZS50ZXh0LCBmaWxlRWRpdHMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmluZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFzQ2xhc3NNZW1iZXIobm9kZTogTm9kZSk6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSA/IG5vZGUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpXG4gICAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICAgIHx8IGlzSW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSlcbiAgICAgIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSlcbiAgICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgICB8fCBpc1ZhcmlhYmxlU3RhdGVtZW50KG5vZGUpXG4gICAgPyBub2RlXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluZGluZyhwYXJhbXM6IEJ1aWxkRmluZGluZ1BhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICBjb25zdCB7IGN1cnJlbnRFeHBvc3VyZSwgZmxhZ3MsIG5hbWVOb2RlLCBub2RlLCBzdWdnZXN0ZWRFeHBvc3VyZSB9ID0gcGFyYW1zO1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHsgY2hhcmFjdGVyLCBsaW5lIH0gPSBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKG5hbWVOb2RlLmdldFN0YXJ0KCkpO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY2hhcmFjdGVyICsgMSxcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGhhc05vUmVmZXJlbmNlczogZmxhZ3MuaGFzTm9SZWZlcmVuY2VzLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogZmxhZ3MuaXNGb3JjZWRCeVRlc3RPbmx5LFxuICAgIGlzTWVtYmVyOiBjdXJyZW50RXhwb3N1cmUgIT09ICdleHBvcnQnLFxuICAgIGxpbmU6IGxpbmUgKyAxLFxuICAgIG5hbWU6IG5hbWVOb2RlLmdldFRleHQoKSxcbiAgICBza2lwUmVhc29uOiBudWxsLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgIHdhc0ZpeGVkOiBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFN0cmluZ0xpdGVyYWxJbmRleChwcm9ncmFtOiBQcm9ncmFtKTogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlW10+KCk7XG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbGxlY3RJbk5vZGUoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RJbk5vZGUobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGlmIChpc1N0cmluZ0xpdGVyYWxMaWtlKG5vZGUpKSB7XG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGluZGV4LmdldChub2RlLnRleHQpID8/IFtdO1xuICAgICAgb2NjdXJyZW5jZXMucHVzaCh7IG5vZGUsIHNvdXJjZUZpbGU6IG5vZGUuZ2V0U291cmNlRmlsZSgpIH0pO1xuICAgICAgaW5kZXguc2V0KG5vZGUudGV4dCwgb2NjdXJyZW5jZXMpO1xuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZChjb2xsZWN0SW5Ob2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VkU3ltYm9sczogUmVmZXJlbmNlZFN5bWJvbFtdIHwgdW5kZWZpbmVkKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkU3ltYm9sIG9mIHJlZmVyZW5jZWRTeW1ib2xzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZFN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBzdGFydDogcmVmZXJlbmNlLnRleHRTcGFuLnN0YXJ0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzKHBhcmFtczogQ29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzUGFyYW1zKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIG5hbWVOb2RlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9jY3VycmVuY2VzID0gY29udGV4dC5zdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQuZ2V0KG5hbWVOb2RlLmdldFRleHQoKSk7XG4gIGlmICghb2NjdXJyZW5jZXMgfHwgb2NjdXJyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qga2V5U2V0ID0gZ2V0Q2xhc3NLZXlTZXQoZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQuY2hlY2tlcik7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBvY2N1cnJlbmNlIG9mIG9jY3VycmVuY2VzKSB7XG4gICAgaWYgKGlzS2V5UmVmZXJlbmNlVG9DbGFzcyh7IGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlciwga2V5U2V0LCBub2RlOiBvY2N1cnJlbmNlLm5vZGUgfSkpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiBvY2N1cnJlbmNlLnNvdXJjZUZpbGUuZmlsZU5hbWUsIHN0YXJ0OiBvY2N1cnJlbmNlLm5vZGUuZ2V0U3RhcnQoKSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoZGVjbGFyYXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShtb2RpZmllcnMsICdNb2RpZmllcnMgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IGV4cG9ydE1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQpO1xuICBhc3NlcnROb25OdWxsYWJsZShleHBvcnRNb2RpZmllciwgJ0V4cG9ydCBtb2RpZmllciBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgeyB0ZXh0IH0gPSBzb3VyY2VGaWxlO1xuICBsZXQgZW5kID0gZXhwb3J0TW9kaWZpZXIuZ2V0RW5kKCk7XG4gIHdoaWxlIChlbmQgPCB0ZXh0Lmxlbmd0aCAmJiBXSElURVNQQUNFX1BBVFRFUk4udGVzdCh0ZXh0LmNoYXJBdChlbmQpKSkge1xuICAgIGVuZCsrO1xuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWU6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGxlbmd0aDogZW5kIC0gZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICBuZXdUZXh0OiAnJyxcbiAgICBzdGFydDogZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlcjogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiwgc3VnZ2VzdGVkRXhwb3N1cmU6ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnKTogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgaWYgKChnZXREZWNvcmF0b3JzKG1lbWJlcikgPz8gW10pLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmaWxlTmFtZSA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMobWVtYmVyKSA/PyBbXTtcbiAgY29uc3QgdmlzaWJpbGl0eU1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTLmhhcyhtb2RpZmllci5raW5kKSk7XG4gIGlmICh2aXNpYmlsaXR5TW9kaWZpZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBsZW5ndGg6IHZpc2liaWxpdHlNb2RpZmllci5nZXRFbmQoKSAtIHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpLFxuICAgICAgbmV3VGV4dDogc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgICBzdGFydDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KClcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZmlyc3RNb2RpZmllciA9IG1vZGlmaWVyc1swXTtcbiAgY29uc3QgaW5zZXJ0U3RhcnQgPSBmaXJzdE1vZGlmaWVyID8gZmlyc3RNb2RpZmllci5nZXRTdGFydCgpIDogbWVtYmVyLmdldFN0YXJ0KCk7XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWUsXG4gICAgbGVuZ3RoOiAwLFxuICAgIG5ld1RleHQ6IGAke3N1Z2dlc3RlZEV4cG9zdXJlfSBgLFxuICAgIHN0YXJ0OiBpbnNlcnRTdGFydFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTmVlZGVkRXhwb3N1cmUocGFyYW1zOiBDb21wdXRlTmVlZGVkRXhwb3N1cmVQYXJhbXMpOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGNvbnN0IHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXMgfSA9IHBhcmFtcztcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuXG4gIGxldCBuZWVkZWQ6IE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlQ2xhc3MgPSBnZXRDbGFzc0F0UG9zaXRpb24oeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBwb3NpdGlvbjogcmVmZXJlbmNlLnN0YXJ0LCBwcm9ncmFtOiBjb250ZXh0LnByb2dyYW0gfSk7XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzID09PSBkZWNsYXJpbmdDbGFzcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VDbGFzcyAmJiBpc0Rlcml2ZWRGcm9tKHsgYmFzZTogZGVjbGFyaW5nQ2xhc3MsIGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlciwgZGVyaXZlZDogcmVmZXJlbmNlQ2xhc3MgfSkpIHtcbiAgICAgIG5lZWRlZCA9ICdwcm90ZWN0ZWQnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiAncHVibGljJztcbiAgfVxuICByZXR1cm4gbmVlZGVkO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmcud2FzRml4ZWQpIHtcbiAgICByZXR1cm4gJyBbZml4ZWRdJztcbiAgfVxuICByZXR1cm4gZmluZGluZy5za2lwUmVhc29uID09PSBudWxsID8gJycgOiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gYHJlZmVyZW5jZWQgb25seSAke1NDT1BFX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmVdfWA7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSkge1xuICAgIHJldHVybiBgJHtiYXNlfSAoZXhwb3NlZCBvbmx5IGZvciB0ZXN0cylgO1xuICB9XG4gIHJldHVybiBmaW5kaW5nLmhhc05vUmVmZXJlbmNlcyA/IGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgIDogYmFzZTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lU2tpcFJlYXNvbihwYXJhbXM6IERldGVybWluZVNraXBSZWFzb25QYXJhbXMpOiBudWxsIHwgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbiB7XG4gIGNvbnN0IHsgZWRpdCwgZmluZGluZywgc2hvdWxkRm9yY2UgfSA9IHBhcmFtcztcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWdyb3VwLWJ5IC0tIGBNYXAuZ3JvdXBCeWAgaXMgRVMyMDI0LCBhbmQgdGhlIHNoYXJlZCBgdHNjb25maWcuanNvbmAgdHlwZXMgb25seSBFUzIwMjIuXG4gIGZvciAoY29uc3QgZmluZGluZyBvZiBmaW5kaW5ncykge1xuICAgIGNvbnN0IGxpc3QgPSBieUZpbGUuZ2V0KGZpbmRpbmcuZmlsZVBhdGgpID8/IFtdO1xuICAgIGxpc3QucHVzaChmaW5kaW5nKTtcbiAgICBieUZpbGUuc2V0KGZpbmRpbmcuZmlsZVBhdGgsIGxpc3QpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBsaXN0XSBvZiBieUZpbGUpIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ubGlzdF0uc29ydCgoYSwgYikgPT4gYS5saW5lIC0gYi5saW5lKTtcbiAgICBjb25zdCBsb2NhdGlvbldpZHRoID0gTWF0aC5tYXgoLi4uc29ydGVkLm1hcCgoZmluZGluZykgPT4gYCR7U3RyaW5nKGZpbmRpbmcubGluZSl9OiR7U3RyaW5nKGZpbmRpbmcuY29sdW1uKX1gLmxlbmd0aCkpO1xuICAgIGxpbmVzLnB1c2godG9EaXNwbGF5UGF0aCh7IGJhc2VGb2xkZXIsIGZpbGVQYXRoIH0pKTtcbiAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2Ygc29ydGVkKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5wYWRFbmQobG9jYXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBgJHtmaW5kaW5nLmN1cnJlbnRFeHBvc3VyZX0gJHtmaW5kaW5nLm5hbWV9IC0+ICR7ZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZX1gO1xuICAgICAgbGluZXMucHVzaChgICAke2xvY2F0aW9ufSAgJHtjaGFuZ2V9IC0tICR7ZGVzY3JpYmVSZWFzb24oZmluZGluZyl9JHtkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nKX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7U3RyaW5nKGZpbmRpbmdzLmxlbmd0aCl9IGZpbmRpbmcocykuYDtcbiAgY29uc3QgZml4ZWRDb3VudCA9IGZpbmRpbmdzLmZpbHRlcigoZmluZGluZykgPT4gZmluZGluZy53YXNGaXhlZCkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkubGVuZ3RoO1xuICByZXR1cm4gZml4ZWRDb3VudCA9PT0gMCAmJiBza2lwcGVkQ291bnQgPT09IDAgPyBzdW1tYXJ5IDogYCR7c3VtbWFyeX0gJHtTdHJpbmcoZml4ZWRDb3VudCl9IGZpeGVkLCAke1N0cmluZyhza2lwcGVkQ291bnQpfSBza2lwcGVkLmA7XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzQXRQb3NpdGlvbihwYXJhbXM6IEdldENsYXNzQXRQb3NpdGlvblBhcmFtcyk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBmaWxlTmFtZSwgcG9zaXRpb24sIHByb2dyYW0gfSA9IHBhcmFtcztcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIHJldHVybiBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpID8gJ3Byb3RlY3RlZCcgOiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVmZXJlbmNlIHBvaW50cyBhdCByZWFsIGNvZGUgcmF0aGVyIHRoYW4gYXQgYSBUU0RvYyBsaW5rIHRhZy5cbiAqXG4gKiBgZmluZFJlZmVyZW5jZXNgIHJlcG9ydHMgdGhlIG1lbWJlciBuYW1lIGluc2lkZSBhIGBTb21lVHlwZS5tZW1iZXJgIGxpbmsgdGFnIGFzIGEgcmVmZXJlbmNlLCBidXQgSlNEb2NcbiAqIGlzIG5vdCBwYXJ0IG9mIHRoZSBBU1Qgd2Fsaywgc28gbm90aGluZyByZXNvbHZlcyBhdCB0aGF0IHBvc2l0aW9uLiBTdWNoIGEgcmVmZXJlbmNlIG11c3QgYmUgZHJvcHBlZCBmb3IgdHdvXG4gKiByZWFzb25zOiB7QGxpbmsgY29tcHV0ZU5lZWRlZEV4cG9zdXJlfSB3b3VsZCBvdGhlcndpc2UgYXNzZXJ0IG9uIHRoZSBtaXNzaW5nIG5vZGUgYW5kIGFib3J0IHRoZSB3aG9sZSBydW4sXG4gKiBhbmQg4oCUIHNlbWFudGljYWxseSDigJQgZG9jdW1lbnRpbmcgYSBtZW1iZXIgaXMgbm90IHVzaW5nIGl0LCBzbyBhIGRvYyBsaW5rIG11c3Qgbm90IGhvbGQgYSBtZW1iZXIgYHB1YmxpY2AuXG4gKiBUaGUgZXhwb3J0LWxldmVsIGFuYWx5c2lzIGRlbGliZXJhdGVseSBkb2VzIE5PVCBkbyB0aGlzOiBuYXJyb3dpbmcgYW4gZXhwb3J0IHRvIGZpbGUtbG9jYWwgV09VTEQgYnJlYWsgYVxuICogY3Jvc3MtZmlsZSBsaW5rIHRhZywgc28gdGhlcmUgYSBkb2MgbGluayByZWFsbHkgaXMgYSByZWFzb24gdG8ga2VlcCB0aGUgZXhwb3J0LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGFuYWx5c2lzIGNvbnRleHQuXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjbGFzc2lmeS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGEgbm9kZSByZXNvbHZlcyBhdCB0aGUgcmVmZXJlbmNlJ3MgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGlzQ29kZVJlZmVyZW5jZShjb250ZXh0OiBBbmFseXNpc0NvbnRleHQsIHJlZmVyZW5jZTogUmVmZXJlbmNlTG9jYXRpb24pOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGNvbnRleHQucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlZmVyZW5jZS5maWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtyZWZlcmVuY2UuZmlsZU5hbWV9YCk7XG4gIHJldHVybiBmaW5kTm9kZUF0UG9zaXRpb24oc291cmNlRmlsZSwgcmVmZXJlbmNlLnN0YXJ0KSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZTogUmVmZXJlbmNlTG9jYXRpb24sIG5hbWVOb2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpID09PSB0b0Nhbm9uaWNhbChuYW1lTm9kZS5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWUpICYmIHJlZmVyZW5jZS5zdGFydCA9PT0gbmFtZU5vZGUuZ2V0U3RhcnQoKTtcbn1cblxuZnVuY3Rpb24gaXNEZXJpdmVkRnJvbShwYXJhbXM6IElzRGVyaXZlZEZyb21QYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBiYXNlLCBjaGVja2VyLCBkZXJpdmVkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhc2VTeW1ib2wgPSBiYXNlLm5hbWUgPyBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oYmFzZS5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFiYXNlU3ltYm9sKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBjbGF1c2Ugb2YgZGVyaXZlZC5oZXJpdGFnZUNsYXVzZXMgPz8gW10pIHtcbiAgICBpZiAoY2xhdXNlLnRva2VuICE9PSBTeW50YXhLaW5kLkV4dGVuZHNLZXl3b3JkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0eXBlRXhwcmVzc2lvbiBvZiBjbGF1c2UudHlwZXMpIHtcbiAgICAgIGNvbnN0ICRzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKCRzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mICRzeW1ib2w/LmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoaXNDbGFzc0xpa2UoZGVjbGFyYXRpb24pICYmIGlzRGVyaXZlZEZyb20oeyBiYXNlLCBjaGVja2VyLCBkZXJpdmVkOiBkZWNsYXJhdGlvbiB9KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKHBhcmFtczogSXNLZXlSZWZlcmVuY2VUb0NsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgY2hlY2tlciwga2V5U2V0LCBub2RlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICByZXR1cm4gbGl0ZXJhbHMgPyBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSkgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKHBhcmFtczogSXNPd25Tb3VyY2VGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQocGFyYW1zOiBSZWNvcmRQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBjb250ZXh0LCBlZGl0LCBmaW5kaW5nIH0gPSBwYXJhbXM7XG4gIGNvbnRleHQuZmluZGluZ3MucHVzaChmaW5kaW5nKTtcbiAgY29udGV4dC5lZGl0cy5wdXNoKGVkaXQpO1xufVxuXG5mdW5jdGlvbiBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBBbmFseXNpc1Jlc3VsdCB7XG4gIGNvbnN0IHsgbGFuZ3VhZ2VTZXJ2aWNlLCBvblByb2dyZXNzLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgcHJvZ3JhbSA9IGxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCk7XG4gIGlmICghcHJvZ3JhbSkge1xuICAgIHJldHVybiB7IGVkaXRzOiBbXSwgZmluZGluZ3M6IFtdIH07XG4gIH1cblxuICBjb25zdCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQgPSB7XG4gICAgY2hlY2tlcjogcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpLFxuICAgIGVkaXRzOiBbXSxcbiAgICBmaW5kaW5nczogW10sXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByb2dyYW0sXG4gICAgc2hvdWxkRm9yY2U6IHBhcmFtcy5zaG91bGRGb3JjZSA/PyBmYWxzZSxcbiAgICBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IGJ1aWxkU3RyaW5nTGl0ZXJhbEluZGV4KHByb2dyYW0pXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9KSAmJiAhaXNUZXN0RmlsZShmaWxlUGF0aCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2FuYWx5emVkRmlsZUNvdW50LCBzb3VyY2VGaWxlXSBvZiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5lbnRyaWVzKCkpIHtcbiAgICBvblByb2dyZXNzPy4oe1xuICAgICAgYW5hbHl6ZWRGaWxlQ291bnQsXG4gICAgICBjdXJyZW50RmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgICAgdG90YWxGaWxlQ291bnQ6IHNvdXJjZUZpbGVzVG9BbmFseXplLmxlbmd0aFxuICAgIH0pO1xuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiB7IGVkaXRzOiBjb250ZXh0LmVkaXRzLCBmaW5kaW5nczogY29udGV4dC5maW5kaW5ncyB9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhbmFseXplTWVtYmVyKG5vZGUsIGNvbnRleHQpO1xuICAgIGFuYWx5emVFeHBvcnQobm9kZSwgY29udGV4dCk7XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRGlzcGxheVBhdGgocGFyYW1zOiBUb0Rpc3BsYXlQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBiYXNlRm9sZGVyLCBmaWxlUGF0aCB9ID0gcGFyYW1zO1xuICByZXR1cm4gYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkgPyBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpIDogZmlsZVBhdGg7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXNTQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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
|
|
663
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE92ZXItZXhwb3N1cmUgYW5hbHl6ZXIuXG4gKlxuICogRmluZHMgZGVjbGFyYXRpb25zIGV4cG9zZWQgbW9yZSBicm9hZGx5IHRoYW4gdGhlaXIgcmVmZXJlbmNlcyByZXF1aXJlLCBzbyB0aGUgZXhwb3N1cmUgY2FuIGJlXG4gKiB0aWdodGVuZWQ6XG4gKlxuICogLSBgZXhwb3J0YGVkIHN5bWJvbHMgcmVmZXJlbmNlZCBvbmx5IHdpdGhpbiB0aGVpciBvd24gZmlsZSDigJQgdGhlIGBleHBvcnRgIGNhbiBiZSBkcm9wcGVkLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIOKAlCB0aGV5IGNhbiBiZSBgcHJpdmF0ZWAuXG4gKiAtIGBwdWJsaWNgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgYW5kIGl0cyBzdWJjbGFzc2VzIOKAlCB0aGV5IGNhbiBiZVxuICogICBgcHJvdGVjdGVkYC5cbiAqIC0gYHByb3RlY3RlZGAgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyDigJQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICpcbiAqIFRoZSBhbmFseXNpcyBpcyB3aG9sZS1wcm9ncmFtIGFuZCB0eXBlLWF3YXJlOiBpdCB1c2VzIHRoZSBUeXBlU2NyaXB0IGxhbmd1YWdlIHNlcnZpY2Unc1xuICogZmluZC1hbGwtcmVmZXJlbmNlcyB0byBsb2NhdGUgZXZlcnkgdXNlIG9mIGVhY2ggZGVjbGFyYXRpb24sIHRoZW4gY2xhc3NpZmllcyB0aGUgdGlnaHRlc3RcbiAqIGV4cG9zdXJlIHRoYXQgc3RpbGwgY292ZXJzIGFsbCByZWZlcmVuY2VzLiBCZWNhdXNlIGBmaW5kUmVmZXJlbmNlc2AgZG9lcyBub3QgbGluayBhIHN0cmluZy1saXRlcmFsXG4gKiBhcmd1bWVudCBiYWNrIHRvIGEgbWVtYmVyIGRlY2xhcmF0aW9uIHdoZW4gdGhlIHBhcmFtZXRlciBpcyBhIGNvbmRpdGlvbmFsL21hcHBlZCBrZXkgdHlwZSAoZS5nLlxuICogYGJpbmQoY29tcG9uZW50LCAnc29tZVNldHRpbmcnKWAgd2hlcmUgdGhlIGtleSBpcyB0eXBlZCBgQ29uZGl0aW9uYWxLZXlzPFNldHRpbmdzLCDigKY+YCksIG1lbWJlclxuICogYW5hbHlzaXMgYWRkaXRpb25hbGx5IHRyZWF0cyBhIHN0cmluZyBsaXRlcmFsIHdob3NlIHRleHQgZXF1YWxzIHRoZSBtZW1iZXIgbmFtZSBhcyBhIHJlZmVyZW5jZSDigJRcbiAqIGJ1dCBvbmx5IHdoZW4gaXRzIGNvbnRleHR1YWwgdHlwZSBpcyBhIHN0cmluZy1saXRlcmFsIHR5cGUgKG9yIHVuaW9uIG9mIHRoZW0pIGFsbCBvZiB3aG9zZSBtZW1iZXJzXG4gKiBhcmUga2V5cyBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzLCBzbyBpbmNpZGVudGFsIHNhbWUtbmFtZWQgc3RyaW5ncyAoYGNvbnNvbGUubG9nKCduYW1lJylgKSBhcmUgbm90XG4gKiBtaXNjb3VudGVkLiBNZW1iZXJzIGludm9rZWQgYnkgdGhlIGZyYW1ld29yayB2aWEgcmVnaXN0cmF0aW9uXG4gKiByYXRoZXIgdGhhbiBieSB2aXNpYmxlIHJlZmVyZW5jZXMgKE9ic2lkaWFuIGxpZmVjeWNsZSBob29rcywgc2V0dGluZ3MtdGFiIGBkaXNwbGF5YCwgZXRjLikgYXJlXG4gKiBleGNsdWRlZCB2aWEge0BsaW5rIExJRkVDWUNMRV9BTExPV0xJU1R9LCBhcyBhcmUgYG92ZXJyaWRlYCBhbmQgYHN0YXRpY2AgbWVtYmVycyB3aG9zZSBleHBvc3VyZSBpc1xuICogY29uc3RyYWluZWQgYnkgYSBiYXNlIGRlY2xhcmF0aW9uLiBFQ01BU2NyaXB0IGhhcmQtcHJpdmF0ZSBtZW1iZXJzIChgI25hbWVgKSBhcmUgYWxzbyBleGNsdWRlZCDigJRcbiAqIHRoZXkgYXJlIGFscmVhZHkgbWF4aW1hbGx5IHByaXZhdGUgYW5kIGNhbm5vdCBjYXJyeSBhIHZpc2liaWxpdHkgbW9kaWZpZXIuIEEgZGVjbGFyYXRpb24gY2FycnlpbmdcbiAqIGEgVFNEb2MgKGAvKiog4oCmICpcXC9gKSBkb2N1bWVudGF0aW9uIGNvbW1lbnQgaXMgbGlrZXdpc2UgZXhjbHVkZWQg4oCUIHdoZXRoZXIgYSB0b3AtbGV2ZWwgYGV4cG9ydGAgb3JcbiAqIGEgY2xhc3MgbWVtYmVyLCBkb2N1bWVudGluZyBpdCBpcyBhIGRlbGliZXJhdGUgc2lnbmFsIHRoYXQgaXQgaXMgcGFydCBvZiB0aGUgaW50ZW5kZWQgcHVibGljIEFQSSxcbiAqIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgaXQgY3VycmVudGx5IGhhcHBlbnMgdG8gYmUgcmVmZXJlbmNlZC5cbiAqXG4gKiBBIG1lbWJlciByZWZlcmVuY2VkIG9ubHkgZnJvbSB0ZXN0IGZpbGVzIGlzIHJlcG9ydGVkIHdpdGgge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5fVxuICogc2V0LCBzdXJmYWNpbmcgbWVtYmVycyB3aWRlbmVkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkg4oCUIHRoZSBjYW5vbmljYWwgY2FzZSBmb3IgZXh0cmFjdGluZyBsb2dpY1xuICogaW50byBhbiBpbmRlcGVuZGVudGx5IHRlc3RhYmxlIGNvbXBvbmVudCBpbnN0ZWFkLlxuICpcbiAqIEJleW9uZCByZXBvcnRpbmcsIHBhc3NpbmcgYHNob3VsZEZpeGAgdG8ge0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9IC8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9XG4gKiByZXdyaXRlcyB0aGUgc291cmNlIGluIHBsYWNlOiBkcm9wcGluZyB0aGUgYGV4cG9ydGAga2V5d29yZCwgb3IgcmVwbGFjaW5nL2luc2VydGluZyBhIGBwcml2YXRlYFxuICogb3IgYHByb3RlY3RlZGAgbW9kaWZpZXIuIEVhY2ggZmluZGluZyB0aGVuIGNhcnJpZXMge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBDaGFuZ2VzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQg4oCUIHRob3NlIGZvcmNlZFxuICogb25seSBieSB0ZXN0IHJlZmVyZW5jZXMsIGRlY29yYXRlZCBtZW1iZXJzLCBvciBhbiBgZXhwb3J0YCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcg4oCUXG4gKiBhcmUgcmVwb3J0ZWQgYXMgc2tpcHBlZCBhbmQgbGVmdCB1bnRvdWNoZWQuXG4gKlxuICogQWRkaXRpb25hbGx5IHBhc3NpbmcgYHNob3VsZEZvcmNlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGggYHNob3VsZEZpeGApIHRpZ2h0ZW5zIHRoZVxuICogZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnkgdGVzdCByZWZlcmVuY2VzIHRvbyDigJQgdGhlIHByb2R1Y3Rpb24gaGFsZiBvZiB0aGUgY2Fub25pY2FsXG4gKiB0ZXN0LW9ubHkgbWlncmF0aW9uOiB0aGUgbWVtYmVyIGJlY29tZXMgYHByaXZhdGVgIC8gdGhlIGBleHBvcnRgIGlzIGRyb3BwZWQsIGxlYXZpbmcgb25seSB0aGVcbiAqIHRlc3QgdG8gc3dpdGNoIHRvIGEgY2FzdC1iYXNlZCBhY2Nlc3MuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWRcbiAqIHNpYmxpbmcgc3RheSBza2lwcGVkIGV2ZW4gdW5kZXIgYHNob3VsZEZvcmNlYCwgYmVjYXVzZSBubyBlZGl0IGNhbiBiZSBhcHBsaWVkIHNhZmVseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIENsYXNzRGVjbGFyYXRpb24sXG4gIENsYXNzTGlrZURlY2xhcmF0aW9uLFxuICBDb21waWxlck9wdGlvbnMsXG4gIEVudW1EZWNsYXJhdGlvbixcbiAgRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIElTY3JpcHRTbmFwc2hvdCxcbiAgTGFuZ3VhZ2VTZXJ2aWNlLFxuICBMYW5ndWFnZVNlcnZpY2VIb3N0LFxuICBNZXRob2REZWNsYXJhdGlvbixcbiAgTm9kZSxcbiAgUHJvZ3JhbSxcbiAgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgUmVmZXJlbmNlZFN5bWJvbCxcbiAgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgU291cmNlRmlsZSxcbiAgU3RyaW5nTGl0ZXJhbExpa2UsXG4gIFR5cGUsXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVTdGF0ZW1lbnRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGNhbkhhdmVNb2RpZmllcnMsXG4gIGNyZWF0ZURvY3VtZW50UmVnaXN0cnksXG4gIGNyZWF0ZUxhbmd1YWdlU2VydmljZSxcbiAgZ2V0RGVjb3JhdG9ycyxcbiAgZ2V0RGVmYXVsdExpYkZpbGVQYXRoLFxuICBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyxcbiAgZ2V0TW9kaWZpZXJzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzQ2xhc3NMaWtlLFxuICBpc0VudW1EZWNsYXJhdGlvbixcbiAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzSWRlbnRpZmllcixcbiAgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNQcml2YXRlSWRlbnRpZmllcixcbiAgaXNQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzU291cmNlRmlsZSxcbiAgaXNTdHJpbmdMaXRlcmFsTGlrZSxcbiAgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgaXNWYXJpYWJsZVN0YXRlbWVudCxcbiAgU2NyaXB0U25hcHNob3QsXG4gIFN5bnRheEtpbmQsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGJlZm9yZSB0aGF0IGZpbGUgaXMgcHJvY2Vzc2VkLiBUaGVcbiAgICogd2hvbGUtcHJvZ3JhbSByZWZlcmVuY2UgYW5hbHlzaXMgaXMgc2xvdywgc28gdGhpcyBsZXRzIGNhbGxlcnMgcmVwb3J0IGxpdmUgcHJvZ3Jlc3MgaW5zdGVhZCBvZlxuICAgKiBhcHBlYXJpbmcgdG8gaGFuZy5cbiAgICovXG4gIHJlYWRvbmx5IG9uUHJvZ3Jlc3M/OiAocHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgdGlnaHRlbmVkIGluIHBsYWNlIHZpYSB7QGxpbmsgd3JpdGVGaWxlfSAod2hpY2ggbXVzdCB0aGVuXG4gICAqIGJlIHByb3ZpZGVkKSwgYW5kIHRoZSByZXR1cm5lZCBmaW5kaW5ncyBjYXJyeSB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gL1xuICAgKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZpeD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIChvbmx5IG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCB7QGxpbmsgc2hvdWxkRml4fSksIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5XG4gICAqIHRlc3QgcmVmZXJlbmNlcyBhcmUgdGlnaHRlbmVkIHRvbywgaW5zdGVhZCBvZiBiZWluZyBza2lwcGVkIHdpdGggYSBgdGVzdC1vbmx5YFxuICAgKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gRGVjb3JhdGVkIG1lbWJlcnMgYW5kIGV4cG9ydHMgc2hhcmVkIHdpdGggYVxuICAgKiBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIHN0YXkgc2tpcHBlZCByZWdhcmRsZXNzLCBiZWNhdXNlIG5vIGVkaXQgY2FuIGJlIGFwcGxpZWQgc2FmZWx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgd3JpdGVGaWxlPzogKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBjb21waWxlciBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJPcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqXG4gIFRoZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwcm9ncmFtLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuXG4gICAqL1xuICByZWFkb25seSBmaWxlU3lzdGVtOiBPdmVyRXhwb3N1cmVGaWxlU3lzdGVtO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuXG4gICAqL1xuICByZWFkb25seSB0c0NvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjdXJyZW50bHkgaGFzLlxuICovXG5leHBvcnQgdHlwZSBDdXJyZW50RXhwb3N1cmUgPSAnZXhwb3J0JyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgZm9yIGxpdmUgcHJvZ3Jlc3MgcmVwb3J0aW5nLiBGb3J3YXJkZWRcbiAgICogdG8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgcmVhZG9ubHkgb25Qcm9ncmVzcz86IChwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpID0+IHZvaWQ7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZml4YWJsZSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIGluIHBsYWNlIG9uIGRpc2sgKHRoZSBgZXhwb3J0YCBrZXl3b3JkIGlzIGRyb3BwZWQsXG4gICAqIG9yIGEgYHByaXZhdGVgIC8gYHByb3RlY3RlZGAgbW9kaWZpZXIgaXMgaW5zZXJ0ZWQvcmVwbGFjZWQpLiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlXG4gICAqIHByb2plY3QgaXMgb25seSBhbmFseXplZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkaXJlY3RvcnkgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlyZWN0b3J5RXhpc3RzOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIGZpbGUgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUV4aXN0czogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGRpcmVjdG9yeSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZXNvbHZlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IHN0cmluZztcblxuICAvKipcbiAgICogTGlzdHMgdGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcmllcyBvZiBhIGRpcmVjdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBnZXREaXJlY3RvcmllczogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSwgZmlsdGVyZWQgYnkgZXh0ZW5zaW9uIGFuZCBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZERpcmVjdG9yeTogKHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpID0+IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBSZWFkcyBhIGZpbGUgYXMgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWRGaWxlOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKipcbiAgMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbC5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGRlY2xhcmluZyB0aGUgc3ltYm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gd291bGQgcXVhbGlmeSBmb3IgYSB0aWdodGVyIGV4cG9zdXJlIGlmIG5vdCBmb3IgcmVmZXJlbmNlcyBjb21pbmdcbiAgICogZXhjbHVzaXZlbHkgZnJvbSB0ZXN0IGZpbGVzIOKAlCBpLmUuIGl0IGlzIGV4cG9zZWQgcHVyZWx5IGZvciB0ZXN0YWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRm9yY2VkQnlUZXN0T25seTogYm9vbGVhbjtcblxuICAvKipcbiAgYHRydWVgIGZvciBhIGNsYXNzIG1lbWJlciwgYGZhbHNlYCBmb3IgYSB0b3AtbGV2ZWwgZXhwb3J0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNNZW1iZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gIDEtYmFzZWQgbGluZSBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGVjbGFyZWQgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogSW4gYSBmaXggcnVuLCB3aHkgdGhpcyBmaW5kaW5nIHdhcyBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIHRpZ2h0ZW5lZDsgYG51bGxgIHdoZW4gaXQgd2FzXG4gICAqIGZpeGVkIG9yIHdoZW4gdGhlIGFuYWx5c2lzIG9ubHkgcmVwb3J0ZWQgKGBzaG91bGRGaXhgIG9mZikuXG4gICAqL1xuICByZWFkb25seSBza2lwUmVhc29uOiBudWxsIHwgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbjtcblxuICAvKipcbiAgVGhlIGV4cG9zdXJlIHRoZSBkZWNsYXJhdGlvbiBjb3VsZCBiZSB0aWdodGVuZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG5cbiAgLyoqXG4gIGB0cnVlYCB3aGVuIGEgZml4IHJ1biB0aWdodGVuZWQgdGhpcyBkZWNsYXJhdGlvbiBpbiBwbGFjZS4gQWx3YXlzIGBmYWxzZWAgaW4gYSByZXBvcnQgcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKlxuICBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgYW5hbHl6ZWRGaWxlQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgc291cmNlIGZpbGUgYWJvdXQgdG8gYmUgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAg4oCUIHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCDigJQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIOKAlCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhcHBseU92ZXJFeHBvc3VyZUZpeGVzfS5cbiAqL1xuaW50ZXJmYWNlIEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIHByb2dyYW0gd2hvc2Ugc291cmNlIGZpbGVzIHN1cHBseSB0aGUgb3JpZ2luYWwgdGV4dCB0aGUgZWRpdHMgYXJlIGFwcGxpZWQgdG87IGB1bmRlZmluZWRgIHdoZW4gbm8gcHJvZ3JhbSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgcmVzdWx0IHdob3NlIGZpbmRpbmdzIGFuZCBlZGl0cyBhcmUgdHVybmVkIGludG8gaW4tcGxhY2UgZml4ZXMuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IEFuYWx5c2lzUmVzdWx0O1xuXG4gIC8qKlxuICBXaGVuIGB0cnVlYCwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnkgdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suXG4gICAqL1xuICByZWFkb25seSB3cml0ZUZpbGU6IChwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRGaW5kaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEJ1aWxkRmluZGluZ1BhcmFtcyB7XG4gIC8qKlxuICBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbCBvZiB0aGUgZGVjbGFyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKipcbiAgRmxhZ3MgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gcmVmZXJlbmNlcyBhdCBhbGwgb3IgaXMgZm9yY2VkIHdpZGUgYnkgdGVzdC1vbmx5IHJlZmVyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBmbGFnczogRmluZGluZ0ZsYWdzO1xuXG4gIC8qKlxuICBUaGUgZGVjbGFyYXRpb24ncyBuYW1lIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgcG9zaXRpb24gYW5kIHRleHQuXG4gICAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcblxuICAvKipcbiAgVGhlIGRlY2xhcmF0aW9uIG5vZGUsIHVzZWQgdG8gcmVzb2x2ZSBpdHMgc291cmNlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuXG4gIC8qKlxuICBUaGUgdGlnaHRlciBleHBvc3VyZSBsZXZlbCB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZTtcbn1cblxudHlwZSBDbGFzc01lbWJlckRlY2xhcmF0aW9uID0gR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb247XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlc30uXG4gKi9cbmludGVyZmFjZSBDb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIGFuYWx5c2lzIGNvbnRleHQgcHJvdmlkaW5nIHRoZSBzdHJpbmctbGl0ZXJhbCBpbmRleCBhbmQgdHlwZSBjaGVja2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKlxuICBUaGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZW1iZXIgd2hvc2UgbmFtZSB0aGUgc3RyaW5nIGxpdGVyYWxzIG1pZ2h0IHJlZmVyZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgVGhlIG1lbWJlcidzIG5hbWUgbm9kZSwgd2hvc2UgdGV4dCBpcyBtYXRjaGVkIGFnYWluc3Qgc3RyaW5nLWxpdGVyYWwgb2NjdXJyZW5jZXMuXG4gICAqL1xuICByZWFkb25seSBuYW1lTm9kZTogTm9kZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29tcHV0ZU5lZWRlZEV4cG9zdXJlfS5cbiAqL1xuaW50ZXJmYWNlIENvbXB1dGVOZWVkZWRFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgY29udGV4dCBwcm92aWRpbmcgdGhlIHByb2dyYW0gYW5kIHR5cGUgY2hlY2tlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKipcbiAgVGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWVtYmVyIHdob3NlIG5lZWRlZCBleHBvc3VyZSBpcyBjb21wdXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKipcbiAgVGhlIHJlZmVyZW5jZSBsb2NhdGlvbnMgdGhhdCBtdXN0IHJlbWFpbiByZWFjaGFibGUgYXQgdGhlIGNvbXB1dGVkIGV4cG9zdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVmZXJlbmNlczogcmVhZG9ubHkgUmVmZXJlbmNlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGV0ZXJtaW5lU2tpcFJlYXNvbn0uXG4gKi9cbmludGVyZmFjZSBEZXRlcm1pbmVTa2lwUmVhc29uUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSB0ZXh0IGVkaXQgdGhhdCB3b3VsZCB0aWdodGVuIHRoZSBmaW5kaW5nLCBvciBgbnVsbGAgd2hlbiBubyBzYWZlIGVkaXQgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0O1xuXG4gIC8qKlxuICBUaGUgZmluZGluZyB1bmRlciBjb25zaWRlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcblxuICAvKipcbiAgV2hlbiBgdHJ1ZWAsIHRlc3Qtb25seSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIHJhdGhlciB0aGFuIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZTogYm9vbGVhbjtcbn1cblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldENsYXNzQXRQb3NpdGlvbn0uXG4gKi9cbmludGVyZmFjZSBHZXRDbGFzc0F0UG9zaXRpb25QYXJhbXMge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBwb3NpdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIDAtYmFzZWQgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgcmVmZXJlbmNlIHdpdGhpbiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBwcm9ncmFtIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc291cmNlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtOiBQcm9ncmFtO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpc0Rlcml2ZWRGcm9tfS5cbiAqL1xuaW50ZXJmYWNlIElzRGVyaXZlZEZyb21QYXJhbXMge1xuICAvKipcbiAgVGhlIGNhbmRpZGF0ZSBiYXNlIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZTogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG5cbiAgLyoqXG4gIFRoZSB0eXBlIGNoZWNrZXIgdXNlZCB0byByZXNvbHZlIGhlcml0YWdlIHN5bWJvbHMuXG4gICAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKipcbiAgVGhlIGNhbmRpZGF0ZSBkZXJpdmVkIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzS2V5UmVmZXJlbmNlVG9DbGFzc30uXG4gKi9cbmludGVyZmFjZSBJc0tleVJlZmVyZW5jZVRvQ2xhc3NQYXJhbXMge1xuICAvKipcbiAgVGhlIHR5cGUgY2hlY2tlciB1c2VkIHRvIHJlc29sdmUgdGhlIGxpdGVyYWwncyBjb250ZXh0dWFsIHR5cGUuXG4gICAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKipcbiAgVGhlIHNldCBvZiBwcm9wZXJ0eSBrZXlzIGRlY2xhcmVkIGJ5IHRoZSBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGtleVNldDogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgVGhlIHN0cmluZy1saXRlcmFsIG5vZGUgYmVpbmcgdGVzdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZTogU3RyaW5nTGl0ZXJhbExpa2U7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzT3duU291cmNlRmlsZX0uXG4gKi9cbmludGVyZmFjZSBJc093blNvdXJjZUZpbGVQYXJhbXMge1xuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgZmlsZSB1bmRlciB0ZXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG50eXBlIE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcgfCAncHVibGljJztcblxuLyoqXG4gKiBBIHNpbmdsZSBpbi1wbGFjZSB0ZXh0IHJlcGxhY2VtZW50IHRoYXQgdGlnaHRlbnMgYSBkZWNsYXJhdGlvbidzIGV4cG9zdXJlLiBBIHplcm8tbGVuZ3RoIGVkaXQgaXNcbiAqIGFuIGluc2VydGlvbiAoZS5nLiBhZGRpbmcgYW4gZXhwbGljaXQgYHByaXZhdGVgIG1vZGlmaWVyIHRvIGFuIGltcGxpY2l0bHktYHB1YmxpY2AgbWVtYmVyKS5cbiAqL1xuaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5ld1RleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVjb3JkfS5cbiAqL1xuaW50ZXJmYWNlIFJlY29yZFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgYW5hbHlzaXMgY29udGV4dCB3aG9zZSBmaW5kaW5ncyBhbmQgZWRpdHMgYXJlIGFwcGVuZGVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQW5hbHlzaXNDb250ZXh0O1xuXG4gIC8qKlxuICBUaGUgdGV4dCBlZGl0IHRoYXQgd291bGQgdGlnaHRlbiB0aGUgZmluZGluZywgb3IgYG51bGxgIHdoZW4gbm8gc2FmZSBlZGl0IGV4aXN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdDtcblxuICAvKipcbiAgVGhlIGZpbmRpbmcgdG8gcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcbn1cblxuaW50ZXJmYWNlIFJlZmVyZW5jZUxvY2F0aW9uIHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNvdXJjZUZpbGVUZXh0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2Uge1xuICByZWFkb25seSBub2RlOiBTdHJpbmdMaXRlcmFsTGlrZTtcbiAgcmVhZG9ubHkgc291cmNlRmlsZTogU291cmNlRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9EaXNwbGF5UGF0aH0uXG4gKi9cbmludGVyZmFjZSBUb0Rpc3BsYXlQYXRoUGFyYW1zIHtcbiAgLyoqXG4gIFdoZW4gc2V0LCB0aGUgcGF0aCBpcyByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlcjsgcGF0aHMgb3V0c2lkZSBpdCBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIHRvIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbi8vIEEgSlNEb2MvVFNEb2MgY29tbWVudCBvcGVucyB3aXRoIGAvKipgOiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAyIGlzIHRoZSBzZWNvbmQgYCpgLCBhbmQgdG8gZXhjbHVkZSB0aGUgZW1wdHkgYC8qKi9gIGNvbW1lbnQgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMyBtdXN0IG5vdCBiZSB0aGUgY2xvc2luZyBgL2AuXG5jb25zdCBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUID0gMjtcbmNvbnN0IEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUID0gMztcbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIOKAlFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCDigJQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkIOKAlCB1bmxlc3NcbiAqIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZvcmNlfSBpcyBzZXQsIHdoaWNoIGFkZGl0aW9uYWxseSB0aWdodGVucyB0aGUgdGVzdC1vbmx5XG4gKiBmaW5kaW5ncyAoZGVjb3JhdGVkIGFuZCBzaGFyZWQtZXhwb3J0IG9uZXMgc3RpbGwgc3RheSBza2lwcGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtcyk7XG4gIGlmICghcGFyYW1zLnNob3VsZEZpeCkge1xuICAgIHJldHVybiBbLi4ucmVzdWx0LmZpbmRpbmdzXTtcbiAgfVxuXG4gIGNvbnN0IHsgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGFzc2VydE5vbk51bGxhYmxlKHdyaXRlRmlsZSwgJ3dyaXRlRmlsZSBpcyByZXF1aXJlZCB3aGVuIHNob3VsZEZpeCBpcyB0cnVlLicpO1xuICByZXR1cm4gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyh7XG4gICAgcHJvZ3JhbTogcGFyYW1zLmxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCksXG4gICAgcmVzdWx0LFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UsXG4gICAgd3JpdGVGaWxlXG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgJiYgeyBvblByb2dyZXNzOiBwYXJhbXMub25Qcm9ncmVzcyB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydCwgdXNpbmcgdGhlIGdyb3VwZWQgbGF5b3V0IG9mIEVTTGludCdzXG4gKiBgc3R5bGlzaGAgZm9ybWF0dGVyLiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBzb3J0ZWQgYnkgbGluZTogZWFjaCBmaWxlIGlzIHJlbmRlcmVkIGFzIGFcbiAqIGBwYXRoYCBoZWFkZXIgbGluZSwgZm9sbG93ZWQgYnkgb25lIGluZGVudGVkIGAgIGxpbmU6Y29sdW1uICBjaGFuZ2UgLS0gcmVhc29uYCByb3cgcGVyIGZpbmRpbmcgKHRoZVxuICogYGxpbmU6Y29sdW1uYCBpcyByaWdodC1wYWRkZWQgc28gdGhlIHJvd3MgYWxpZ24gd2l0aGluIGEgZmlsZSkuIFRlcm1pbmFscyBzdWNoIGFzIFZTIENvZGUgcmVuZGVyXG4gKiBlYWNoIGluZGVudGVkIGBsaW5lOmNvbHVtbmAgYXMgYSBjbGlja2FibGUgbGluayDigJQgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZmlsZSBoZWFkZXIgYWJvdmUgaXQg4oCUIHRoYXRcbiAqIGp1bXBzIHN0cmFpZ2h0IHRvIHRoZSBkZWNsYXJhdGlvbi4gRmlsZSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEluIGEgZml4IHJ1biAoZmluZGluZ3NcbiAqIGNhcnJ5aW5nIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259KSBlYWNoIGNoYW5nZVxuICogcm93IGlzIHN1ZmZpeGVkIHdpdGggYFtmaXhlZF1gIG9yIGBbc2tpcHBlZDog4oCmXWAsIGFuZCB0aGUgdHJhaWxpbmcgc3VtbWFyeSBhcHBlbmRzIHRoZSBmaXhlZC9za2lwcGVkXG4gKiBjb3VudHMuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcbiAgY29uc3QgbGluZXMgPSBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzLCBiYXNlRm9sZGVyKTtcbiAgbGluZXMucHVzaChmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzKSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZSk7XG4gIGlmICghZGVjbGFyYXRpb24gfHwgaGFzVHNEb2NDb21tZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbGFyYXRpb25GaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyh7XG4gICAgICAgICAgY3VycmVudEV4cG9zdXJlOiAnZXhwb3J0JyxcbiAgICAgICAgICBmbGFnczogeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoe1xuICAgICAgICAgIGN1cnJlbnRFeHBvc3VyZTogJ2V4cG9ydCcsXG4gICAgICAgICAgZmxhZ3M6IHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbkRyb3BFeHBvcnQgPSBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gbmFtZU5vZGVzLmxlbmd0aCAmJiBjYW5kaWRhdGVzLmV2ZXJ5KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pc1BsYWluRmlsZUxvY2FsIHx8IGNvbnRleHQuc2hvdWxkRm9yY2UpO1xuICBjb25zdCBleHBvcnRFZGl0ID0gY2FuRHJvcEV4cG9ydCA/IGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbikgOiBudWxsO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgcmVjb3JkKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBlZGl0OiBleHBvcnRFZGl0LFxuICAgICAgZmluZGluZzogY2FuZGlkYXRlLmZpbmRpbmdcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhbmFseXplTWVtYmVyKG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBtZW1iZXIgPSBhc0NsYXNzTWVtYmVyKG5vZGUpO1xuICBpZiAoIW1lbWJlciB8fCAhaXNDbGFzc0xpa2Uobm9kZS5wYXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gbWVtYmVyLm5hbWU7XG4gIGNvbnN0IGRlY2xhcmluZ0NsYXNzID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKGlzUHJpdmF0ZUlkZW50aWZpZXIobmFtZU5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kaWZpZXJLaW5kcyA9IGdldE1vZGlmaWVyS2luZHMobWVtYmVyKTtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgfHwgbW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5PdmVycmlkZUtleXdvcmQpIHx8IExJRkVDWUNMRV9BTExPV0xJU1QuaGFzKG5hbWVOb2RlLmdldFRleHQoKSkgfHwgaGFzVHNEb2NDb21tZW50KG1lbWJlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50RXhwb3N1cmUgPSBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kcyk7XG4gIGlmIChjdXJyZW50RXhwb3N1cmUgPT09ICdwcml2YXRlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBkaXJlY3RSZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+IGlzQ29kZVJlZmVyZW5jZShjb250ZXh0LCByZWZlcmVuY2UpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgbmFtZU5vZGUgfSldO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgcmVmZXJlbmNlczogbm9uVGVzdFJlZmVyZW5jZXMgfSk7XG5cbiAgaWYgKChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB8fCAocmFua0V4cG9zdXJlKG5lZWRlZEZvclNyYykgPj0gcmFua0V4cG9zdXJlKGN1cnJlbnRFeHBvc3VyZSkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXMgfSk7XG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcoe1xuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmbGFnczoge1xuICAgICAgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICAgIH0sXG4gICAgbmFtZU5vZGUsXG4gICAgbm9kZTogbWVtYmVyLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlOiBuZWVkZWRGb3JTcmNcbiAgfSk7XG4gIHJlY29yZCh7XG4gICAgY29udGV4dCxcbiAgICBlZGl0OiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlciwgbmVlZGVkRm9yU3JjKSxcbiAgICBmaW5kaW5nXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhwYXJhbXM6IEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCB7IHByb2dyYW0sIHJlc3VsdCwgc2hvdWxkRm9yY2UsIHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbih7IGVkaXQsIGZpbmRpbmcsIHNob3VsZEZvcmNlIH0pO1xuICAgIGlmIChza2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uLCB3YXNGaXhlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZWRpdCwgJ0EgZml4YWJsZSBmaW5kaW5nIG11c3QgY2FycnkgYSB0ZXh0IGVkaXQuJyk7XG4gICAgY29uc3QgZmlsZUVkaXRzID0gZWRpdHNCeUZpbGUuZ2V0KGVkaXQuZmlsZU5hbWUpID8/IFtdO1xuICAgIGZpbGVFZGl0cy5wdXNoKGVkaXQpO1xuICAgIGVkaXRzQnlGaWxlLnNldChlZGl0LmZpbGVOYW1lLCBmaWxlRWRpdHMpO1xuICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb246IG51bGwsIHdhc0ZpeGVkOiB0cnVlIH07XG4gIH0pO1xuXG4gIGlmIChlZGl0c0J5RmlsZS5zaXplID4gMCkge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdBIHByb2dyYW0gaXMgZXhwZWN0ZWQgd2hlbiB0aGVyZSBhcmUgZWRpdHMgdG8gYXBwbHkuJyk7XG4gICAgY29uc3Qgc291cmNlVGV4dEJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlVGV4dD4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICBzb3VyY2VUZXh0QnlGaWxlLnNldCh0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSwgeyBmaWxlTmFtZTogc291cmNlRmlsZS5maWxlTmFtZSwgdGV4dDogc291cmNlRmlsZS50ZXh0IH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjYW5vbmljYWxGaWxlTmFtZSwgZmlsZUVkaXRzXSBvZiBlZGl0c0J5RmlsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlVGV4dEJ5RmlsZS5nZXQoY2Fub25pY2FsRmlsZU5hbWUpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7Y2Fub25pY2FsRmlsZU5hbWV9YCk7XG4gICAgICB3cml0ZUZpbGUoc291cmNlLmZpbGVOYW1lLCBhcHBseUVkaXRzKHNvdXJjZS50ZXh0LCBmaWxlRWRpdHMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmluZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFzQ2xhc3NNZW1iZXIobm9kZTogTm9kZSk6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSA/IG5vZGUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpXG4gICAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICAgIHx8IGlzSW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSlcbiAgICAgIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSlcbiAgICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgICB8fCBpc1ZhcmlhYmxlU3RhdGVtZW50KG5vZGUpXG4gICAgPyBub2RlXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluZGluZyhwYXJhbXM6IEJ1aWxkRmluZGluZ1BhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICBjb25zdCB7IGN1cnJlbnRFeHBvc3VyZSwgZmxhZ3MsIG5hbWVOb2RlLCBub2RlLCBzdWdnZXN0ZWRFeHBvc3VyZSB9ID0gcGFyYW1zO1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHsgY2hhcmFjdGVyLCBsaW5lIH0gPSBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKG5hbWVOb2RlLmdldFN0YXJ0KCkpO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY2hhcmFjdGVyICsgMSxcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGhhc05vUmVmZXJlbmNlczogZmxhZ3MuaGFzTm9SZWZlcmVuY2VzLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogZmxhZ3MuaXNGb3JjZWRCeVRlc3RPbmx5LFxuICAgIGlzTWVtYmVyOiBjdXJyZW50RXhwb3N1cmUgIT09ICdleHBvcnQnLFxuICAgIGxpbmU6IGxpbmUgKyAxLFxuICAgIG5hbWU6IG5hbWVOb2RlLmdldFRleHQoKSxcbiAgICBza2lwUmVhc29uOiBudWxsLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgIHdhc0ZpeGVkOiBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFN0cmluZ0xpdGVyYWxJbmRleChwcm9ncmFtOiBQcm9ncmFtKTogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlW10+KCk7XG4gIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICBpZiAoc291cmNlRmlsZS5pc0RlY2xhcmF0aW9uRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbGxlY3RJbk5vZGUoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3RJbk5vZGUobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGlmIChpc1N0cmluZ0xpdGVyYWxMaWtlKG5vZGUpKSB7XG4gICAgICBjb25zdCBvY2N1cnJlbmNlcyA9IGluZGV4LmdldChub2RlLnRleHQpID8/IFtdO1xuICAgICAgb2NjdXJyZW5jZXMucHVzaCh7IG5vZGUsIHNvdXJjZUZpbGU6IG5vZGUuZ2V0U291cmNlRmlsZSgpIH0pO1xuICAgICAgaW5kZXguc2V0KG5vZGUudGV4dCwgb2NjdXJyZW5jZXMpO1xuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZChjb2xsZWN0SW5Ob2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VkU3ltYm9sczogUmVmZXJlbmNlZFN5bWJvbFtdIHwgdW5kZWZpbmVkKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkU3ltYm9sIG9mIHJlZmVyZW5jZWRTeW1ib2xzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZFN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBzdGFydDogcmVmZXJlbmNlLnRleHRTcGFuLnN0YXJ0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzKHBhcmFtczogQ29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzUGFyYW1zKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIG5hbWVOb2RlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IG9jY3VycmVuY2VzID0gY29udGV4dC5zdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQuZ2V0KG5hbWVOb2RlLmdldFRleHQoKSk7XG4gIGlmICghb2NjdXJyZW5jZXMgfHwgb2NjdXJyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3Qga2V5U2V0ID0gZ2V0Q2xhc3NLZXlTZXQoZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQuY2hlY2tlcik7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBvY2N1cnJlbmNlIG9mIG9jY3VycmVuY2VzKSB7XG4gICAgaWYgKGlzS2V5UmVmZXJlbmNlVG9DbGFzcyh7IGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlciwga2V5U2V0LCBub2RlOiBvY2N1cnJlbmNlLm5vZGUgfSkpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiBvY2N1cnJlbmNlLnNvdXJjZUZpbGUuZmlsZU5hbWUsIHN0YXJ0OiBvY2N1cnJlbmNlLm5vZGUuZ2V0U3RhcnQoKSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoZGVjbGFyYXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShtb2RpZmllcnMsICdNb2RpZmllcnMgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IGV4cG9ydE1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQpO1xuICBhc3NlcnROb25OdWxsYWJsZShleHBvcnRNb2RpZmllciwgJ0V4cG9ydCBtb2RpZmllciBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgeyB0ZXh0IH0gPSBzb3VyY2VGaWxlO1xuICBsZXQgZW5kID0gZXhwb3J0TW9kaWZpZXIuZ2V0RW5kKCk7XG4gIHdoaWxlIChlbmQgPCB0ZXh0Lmxlbmd0aCAmJiBXSElURVNQQUNFX1BBVFRFUk4udGVzdCh0ZXh0LmNoYXJBdChlbmQpKSkge1xuICAgIGVuZCsrO1xuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWU6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGxlbmd0aDogZW5kIC0gZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICBuZXdUZXh0OiAnJyxcbiAgICBzdGFydDogZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlcjogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiwgc3VnZ2VzdGVkRXhwb3N1cmU6ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnKTogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgaWYgKChnZXREZWNvcmF0b3JzKG1lbWJlcikgPz8gW10pLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmaWxlTmFtZSA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMobWVtYmVyKSA/PyBbXTtcbiAgY29uc3QgdmlzaWJpbGl0eU1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTLmhhcyhtb2RpZmllci5raW5kKSk7XG4gIGlmICh2aXNpYmlsaXR5TW9kaWZpZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBsZW5ndGg6IHZpc2liaWxpdHlNb2RpZmllci5nZXRFbmQoKSAtIHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpLFxuICAgICAgbmV3VGV4dDogc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgICBzdGFydDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KClcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZmlyc3RNb2RpZmllciA9IG1vZGlmaWVyc1swXTtcbiAgY29uc3QgaW5zZXJ0U3RhcnQgPSBmaXJzdE1vZGlmaWVyID8gZmlyc3RNb2RpZmllci5nZXRTdGFydCgpIDogbWVtYmVyLmdldFN0YXJ0KCk7XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWUsXG4gICAgbGVuZ3RoOiAwLFxuICAgIG5ld1RleHQ6IGAke3N1Z2dlc3RlZEV4cG9zdXJlfSBgLFxuICAgIHN0YXJ0OiBpbnNlcnRTdGFydFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTmVlZGVkRXhwb3N1cmUocGFyYW1zOiBDb21wdXRlTmVlZGVkRXhwb3N1cmVQYXJhbXMpOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGNvbnN0IHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXMgfSA9IHBhcmFtcztcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuXG4gIGxldCBuZWVkZWQ6IE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlQ2xhc3MgPSBnZXRDbGFzc0F0UG9zaXRpb24oeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBwb3NpdGlvbjogcmVmZXJlbmNlLnN0YXJ0LCBwcm9ncmFtOiBjb250ZXh0LnByb2dyYW0gfSk7XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzID09PSBkZWNsYXJpbmdDbGFzcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VDbGFzcyAmJiBpc0Rlcml2ZWRGcm9tKHsgYmFzZTogZGVjbGFyaW5nQ2xhc3MsIGNoZWNrZXI6IGNvbnRleHQuY2hlY2tlciwgZGVyaXZlZDogcmVmZXJlbmNlQ2xhc3MgfSkpIHtcbiAgICAgIG5lZWRlZCA9ICdwcm90ZWN0ZWQnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiAncHVibGljJztcbiAgfVxuICByZXR1cm4gbmVlZGVkO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmcud2FzRml4ZWQpIHtcbiAgICByZXR1cm4gJyBbZml4ZWRdJztcbiAgfVxuICByZXR1cm4gZmluZGluZy5za2lwUmVhc29uID09PSBudWxsID8gJycgOiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gYHJlZmVyZW5jZWQgb25seSAke1NDT1BFX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmVdfWA7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSkge1xuICAgIHJldHVybiBgJHtiYXNlfSAoZXhwb3NlZCBvbmx5IGZvciB0ZXN0cylgO1xuICB9XG4gIHJldHVybiBmaW5kaW5nLmhhc05vUmVmZXJlbmNlcyA/IGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgIDogYmFzZTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lU2tpcFJlYXNvbihwYXJhbXM6IERldGVybWluZVNraXBSZWFzb25QYXJhbXMpOiBudWxsIHwgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbiB7XG4gIGNvbnN0IHsgZWRpdCwgZmluZGluZywgc2hvdWxkRm9yY2UgfSA9IHBhcmFtcztcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWdyb3VwLWJ5IC0tIGBNYXAuZ3JvdXBCeWAgaXMgRVMyMDI0LCBhbmQgdGhlIHNoYXJlZCBgdHNjb25maWcuanNvbmAgdHlwZXMgb25seSBFUzIwMjIuXG4gIGZvciAoY29uc3QgZmluZGluZyBvZiBmaW5kaW5ncykge1xuICAgIGNvbnN0IGxpc3QgPSBieUZpbGUuZ2V0KGZpbmRpbmcuZmlsZVBhdGgpID8/IFtdO1xuICAgIGxpc3QucHVzaChmaW5kaW5nKTtcbiAgICBieUZpbGUuc2V0KGZpbmRpbmcuZmlsZVBhdGgsIGxpc3QpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBsaXN0XSBvZiBieUZpbGUpIHtcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4ubGlzdF0uc29ydCgoYSwgYikgPT4gYS5saW5lIC0gYi5saW5lKTtcbiAgICBjb25zdCBsb2NhdGlvbldpZHRoID0gTWF0aC5tYXgoLi4uc29ydGVkLm1hcCgoZmluZGluZykgPT4gYCR7U3RyaW5nKGZpbmRpbmcubGluZSl9OiR7U3RyaW5nKGZpbmRpbmcuY29sdW1uKX1gLmxlbmd0aCkpO1xuICAgIGxpbmVzLnB1c2godG9EaXNwbGF5UGF0aCh7IGJhc2VGb2xkZXIsIGZpbGVQYXRoIH0pKTtcbiAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2Ygc29ydGVkKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5wYWRFbmQobG9jYXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBgJHtmaW5kaW5nLmN1cnJlbnRFeHBvc3VyZX0gJHtmaW5kaW5nLm5hbWV9IC0+ICR7ZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZX1gO1xuICAgICAgbGluZXMucHVzaChgICAke2xvY2F0aW9ufSAgJHtjaGFuZ2V9IC0tICR7ZGVzY3JpYmVSZWFzb24oZmluZGluZyl9JHtkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nKX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7U3RyaW5nKGZpbmRpbmdzLmxlbmd0aCl9IGZpbmRpbmcocykuYDtcbiAgY29uc3QgZml4ZWRDb3VudCA9IGZpbmRpbmdzLmZpbHRlcigoZmluZGluZykgPT4gZmluZGluZy53YXNGaXhlZCkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkubGVuZ3RoO1xuICByZXR1cm4gZml4ZWRDb3VudCA9PT0gMCAmJiBza2lwcGVkQ291bnQgPT09IDAgPyBzdW1tYXJ5IDogYCR7c3VtbWFyeX0gJHtTdHJpbmcoZml4ZWRDb3VudCl9IGZpeGVkLCAke1N0cmluZyhza2lwcGVkQ291bnQpfSBza2lwcGVkLmA7XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzQXRQb3NpdGlvbihwYXJhbXM6IEdldENsYXNzQXRQb3NpdGlvblBhcmFtcyk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBmaWxlTmFtZSwgcG9zaXRpb24sIHByb2dyYW0gfSA9IHBhcmFtcztcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIHJldHVybiBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpID8gJ3Byb3RlY3RlZCcgOiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVmZXJlbmNlIHBvaW50cyBhdCByZWFsIGNvZGUgcmF0aGVyIHRoYW4gYXQgYSBUU0RvYyBsaW5rIHRhZy5cbiAqXG4gKiBgZmluZFJlZmVyZW5jZXNgIHJlcG9ydHMgdGhlIG1lbWJlciBuYW1lIGluc2lkZSBhIGBTb21lVHlwZS5tZW1iZXJgIGxpbmsgdGFnIGFzIGEgcmVmZXJlbmNlLCBidXQgSlNEb2NcbiAqIGlzIG5vdCBwYXJ0IG9mIHRoZSBBU1Qgd2Fsaywgc28gbm90aGluZyByZXNvbHZlcyBhdCB0aGF0IHBvc2l0aW9uLiBTdWNoIGEgcmVmZXJlbmNlIG11c3QgYmUgZHJvcHBlZCBmb3IgdHdvXG4gKiByZWFzb25zOiB7QGxpbmsgY29tcHV0ZU5lZWRlZEV4cG9zdXJlfSB3b3VsZCBvdGhlcndpc2UgYXNzZXJ0IG9uIHRoZSBtaXNzaW5nIG5vZGUgYW5kIGFib3J0IHRoZSB3aG9sZSBydW4sXG4gKiBhbmQg4oCUIHNlbWFudGljYWxseSDigJQgZG9jdW1lbnRpbmcgYSBtZW1iZXIgaXMgbm90IHVzaW5nIGl0LCBzbyBhIGRvYyBsaW5rIG11c3Qgbm90IGhvbGQgYSBtZW1iZXIgYHB1YmxpY2AuXG4gKiBUaGUgZXhwb3J0LWxldmVsIGFuYWx5c2lzIGRlbGliZXJhdGVseSBkb2VzIE5PVCBkbyB0aGlzOiBuYXJyb3dpbmcgYW4gZXhwb3J0IHRvIGZpbGUtbG9jYWwgV09VTEQgYnJlYWsgYVxuICogY3Jvc3MtZmlsZSBsaW5rIHRhZywgc28gdGhlcmUgYSBkb2MgbGluayByZWFsbHkgaXMgYSByZWFzb24gdG8ga2VlcCB0aGUgZXhwb3J0LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGFuYWx5c2lzIGNvbnRleHQuXG4gKiBAcGFyYW0gcmVmZXJlbmNlIC0gVGhlIHJlZmVyZW5jZSB0byBjbGFzc2lmeS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGEgbm9kZSByZXNvbHZlcyBhdCB0aGUgcmVmZXJlbmNlJ3MgcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGlzQ29kZVJlZmVyZW5jZShjb250ZXh0OiBBbmFseXNpc0NvbnRleHQsIHJlZmVyZW5jZTogUmVmZXJlbmNlTG9jYXRpb24pOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGNvbnRleHQucHJvZ3JhbS5nZXRTb3VyY2VGaWxlKHJlZmVyZW5jZS5maWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtyZWZlcmVuY2UuZmlsZU5hbWV9YCk7XG4gIHJldHVybiBmaW5kTm9kZUF0UG9zaXRpb24oc291cmNlRmlsZSwgcmVmZXJlbmNlLnN0YXJ0KSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZTogUmVmZXJlbmNlTG9jYXRpb24sIG5hbWVOb2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpID09PSB0b0Nhbm9uaWNhbChuYW1lTm9kZS5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWUpICYmIHJlZmVyZW5jZS5zdGFydCA9PT0gbmFtZU5vZGUuZ2V0U3RhcnQoKTtcbn1cblxuZnVuY3Rpb24gaXNEZXJpdmVkRnJvbShwYXJhbXM6IElzRGVyaXZlZEZyb21QYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBiYXNlLCBjaGVja2VyLCBkZXJpdmVkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhc2VTeW1ib2wgPSBiYXNlLm5hbWUgPyBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oYmFzZS5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFiYXNlU3ltYm9sKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBjbGF1c2Ugb2YgZGVyaXZlZC5oZXJpdGFnZUNsYXVzZXMgPz8gW10pIHtcbiAgICBpZiAoY2xhdXNlLnRva2VuICE9PSBTeW50YXhLaW5kLkV4dGVuZHNLZXl3b3JkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0eXBlRXhwcmVzc2lvbiBvZiBjbGF1c2UudHlwZXMpIHtcbiAgICAgIGNvbnN0ICRzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKCRzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mICRzeW1ib2w/LmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoaXNDbGFzc0xpa2UoZGVjbGFyYXRpb24pICYmIGlzRGVyaXZlZEZyb20oeyBiYXNlLCBjaGVja2VyLCBkZXJpdmVkOiBkZWNsYXJhdGlvbiB9KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKHBhcmFtczogSXNLZXlSZWZlcmVuY2VUb0NsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgY2hlY2tlciwga2V5U2V0LCBub2RlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICByZXR1cm4gbGl0ZXJhbHMgPyBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSkgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKHBhcmFtczogSXNPd25Tb3VyY2VGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQocGFyYW1zOiBSZWNvcmRQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBjb250ZXh0LCBlZGl0LCBmaW5kaW5nIH0gPSBwYXJhbXM7XG4gIGNvbnRleHQuZmluZGluZ3MucHVzaChmaW5kaW5nKTtcbiAgY29udGV4dC5lZGl0cy5wdXNoKGVkaXQpO1xufVxuXG5mdW5jdGlvbiBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBBbmFseXNpc1Jlc3VsdCB7XG4gIGNvbnN0IHsgbGFuZ3VhZ2VTZXJ2aWNlLCBvblByb2dyZXNzLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgcHJvZ3JhbSA9IGxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCk7XG4gIGlmICghcHJvZ3JhbSkge1xuICAgIHJldHVybiB7IGVkaXRzOiBbXSwgZmluZGluZ3M6IFtdIH07XG4gIH1cblxuICBjb25zdCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQgPSB7XG4gICAgY2hlY2tlcjogcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpLFxuICAgIGVkaXRzOiBbXSxcbiAgICBmaW5kaW5nczogW10sXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByb2dyYW0sXG4gICAgc2hvdWxkRm9yY2U6IHBhcmFtcy5zaG91bGRGb3JjZSA/PyBmYWxzZSxcbiAgICBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IGJ1aWxkU3RyaW5nTGl0ZXJhbEluZGV4KHByb2dyYW0pXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9KSAmJiAhaXNUZXN0RmlsZShmaWxlUGF0aCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2FuYWx5emVkRmlsZUNvdW50LCBzb3VyY2VGaWxlXSBvZiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5lbnRyaWVzKCkpIHtcbiAgICBvblByb2dyZXNzPy4oe1xuICAgICAgYW5hbHl6ZWRGaWxlQ291bnQsXG4gICAgICBjdXJyZW50RmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgICAgdG90YWxGaWxlQ291bnQ6IHNvdXJjZUZpbGVzVG9BbmFseXplLmxlbmd0aFxuICAgIH0pO1xuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiB7IGVkaXRzOiBjb250ZXh0LmVkaXRzLCBmaW5kaW5nczogY29udGV4dC5maW5kaW5ncyB9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhbmFseXplTWVtYmVyKG5vZGUsIGNvbnRleHQpO1xuICAgIGFuYWx5emVFeHBvcnQobm9kZSwgY29udGV4dCk7XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRGlzcGxheVBhdGgocGFyYW1zOiBUb0Rpc3BsYXlQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBiYXNlRm9sZGVyLCBmaWxlUGF0aCB9ID0gcGFyYW1zO1xuICByZXR1cm4gYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkgPyBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpIDogZmlsZVBhdGg7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXNTQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxF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
|
package/dist/lib/esm/npm.d.mts
CHANGED
|
@@ -46,7 +46,7 @@ export interface PackageLockJson extends Partial<PackageJson> {
|
|
|
46
46
|
/**
|
|
47
47
|
* Packages in the `package-lock.json` file.
|
|
48
48
|
*/
|
|
49
|
-
packages?: Record<string, PackageJson>;
|
|
49
|
+
readonly packages?: Record<string, PackageJson>;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* Reads, edits, and writes back the `package-lock.json` file using the provided edit function.
|
package/dist/lib/esm/npm.mjs
CHANGED
|
@@ -143,4 +143,4 @@ export {
|
|
|
143
143
|
writePackageLockJson,
|
|
144
144
|
writePackageLockJsonSync
|
|
145
145
|
};
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ucG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBOUE0gcGFja2FnZS5qc29uLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGFja2FnZUpzb24sXG4gIFByb21pc2FibGVcbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRWRpdEpzb25QYXJhbXMsXG4gIEVkaXRKc29uU3luY1BhcmFtc1xufSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUGF0aEZyb21Sb290UGFyYW1zIH0gZnJvbSAnLi9yb290LnRzJztcblxuaW1wb3J0IHtcbiAgZWRpdEpzb24sXG4gIGVkaXRKc29uU3luYyxcbiAgcmVhZEpzb24sXG4gIHJlYWRKc29uU3luYyxcbiAgd3JpdGVKc29uLFxuICB3cml0ZUpzb25TeW5jXG59IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXROcG1TaHJpbmtXcmFwSnNvbn0uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXROcG1TaHJpbmtXcmFwSnNvbk9wdGlvbnMgPSBFZGl0UGFja2FnZUpzb25PcHRpb25zO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0UGFja2FnZUpzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRQYWNrYWdlSnNvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLmpzb25gIGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc2tpcHMgZWRpdGluZyBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcElmTWlzc2luZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRQYWNrYWdlSnNvblN5bmN9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0UGFja2FnZUpzb25TeW5jT3B0aW9ucyA9IEVkaXRQYWNrYWdlSnNvbk9wdGlvbnM7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRQYWNrYWdlTG9ja0pzb259LlxuICovXG5leHBvcnQgdHlwZSBFZGl0UGFja2FnZUxvY2tKc29uT3B0aW9ucyA9IEVkaXRQYWNrYWdlSnNvbk9wdGlvbnM7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRQYWNrYWdlTG9ja0pzb25TeW5jfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdFBhY2thZ2VMb2NrSnNvblN5bmNPcHRpb25zID0gRWRpdFBhY2thZ2VKc29uT3B0aW9ucztcblxuLyoqXG4gKiBBIHR5cGUgb2YgdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gKi9cblxuLyoqXG4gKiBBIHR5cGUgb2YgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlTG9ja0pzb24gZXh0ZW5kcyBQYXJ0aWFsPFBhY2thZ2VKc29uPiB7XG4gIC8qKlxuICAgKiBQYWNrYWdlcyBpbiB0aGUgYHBhY2thZ2UtbG9jay5qc29uYCBmaWxlLlxuICAgKi9cbiAgcGFja2FnZXM/OiBSZWNvcmQ8c3RyaW5nLCBQYWNrYWdlSnNvbj47XG59XG5cbi8qKlxuICogUmVhZHMsIGVkaXRzLCBhbmQgd3JpdGVzIGJhY2sgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZSB1c2luZyB0aGUgcHJvdmlkZWQgZWRpdCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gZWRpdEZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGVkaXQgdGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zIGZvciBlZGl0aW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIGVkaXRlZCBhbmQgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXROcG1TaHJpbmtXcmFwSnNvbihcbiAgZWRpdEZ1bmN0aW9uOiAocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24pID0+IFByb21pc2FibGU8dm9pZD4sXG4gIG9wdGlvbnM6IEVkaXROcG1TaHJpbmtXcmFwSnNvbk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjd2QsXG4gICAgc2hvdWxkU2tpcElmTWlzc2luZ1xuICB9ID0gb3B0aW9ucztcbiAgYXdhaXQgZWRpdEpzb248UGFja2FnZUpzb24+KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0SnNvblBhcmFtczxQYWNrYWdlSnNvbj4+KHsgZWRpdEZ1bmN0aW9uLCBwYXRoOiBnZXROcG1TaHJpbmtXcmFwSnNvblBhdGgoY3dkKSwgc2hvdWxkU2tpcElmTWlzc2luZyB9KSk7XG59XG5cbi8qKlxuICogUmVhZHMsIGVkaXRzLCBhbmQgd3JpdGVzIGJhY2sgdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUgdXNpbmcgdGhlIHByb3ZpZGVkIGVkaXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGVkaXRGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBlZGl0IHRoZSBwYXJzZWQgYFBhY2thZ2VKc29uYCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgZWRpdGluZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiBlZGl0ZWQgYW5kIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UGFja2FnZUpzb24oXG4gIGVkaXRGdW5jdGlvbjogKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbikgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgb3B0aW9uczogRWRpdFBhY2thZ2VKc29uT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGN3ZCxcbiAgICBzaG91bGRTa2lwSWZNaXNzaW5nXG4gIH0gPSBvcHRpb25zO1xuICBhd2FpdCBlZGl0SnNvbjxQYWNrYWdlSnNvbj4obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRKc29uUGFyYW1zPFBhY2thZ2VKc29uPj4oeyBlZGl0RnVuY3Rpb24sIHBhdGg6IGdldFBhY2thZ2VKc29uUGF0aChjd2QpLCBzaG91bGRTa2lwSWZNaXNzaW5nIH0pKTtcbn1cblxuLyoqXG4gKiBSZWFkcywgZWRpdHMsIGFuZCB3cml0ZXMgYmFjayB0aGUgYHBhY2thZ2UuanNvbmAgZmlsZSB1c2luZyB0aGUgcHJvdmlkZWQgZWRpdCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gZWRpdEZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGVkaXQgdGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zIGZvciBlZGl0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWRpdFBhY2thZ2VKc29uU3luYyhcbiAgZWRpdEZ1bmN0aW9uOiAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKSA9PiB2b2lkLFxuICBvcHRpb25zOiBFZGl0UGFja2FnZUpzb25TeW5jT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGN3ZCxcbiAgICBzaG91bGRTa2lwSWZNaXNzaW5nXG4gIH0gPSBvcHRpb25zO1xuICBlZGl0SnNvblN5bmM8UGFja2FnZUpzb24+KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0SnNvblN5bmNQYXJhbXM8UGFja2FnZUpzb24+Pih7IGVkaXRGdW5jdGlvbiwgcGF0aDogZ2V0UGFja2FnZUpzb25QYXRoKGN3ZCksIHNob3VsZFNraXBJZk1pc3NpbmcgfSkpO1xufVxuXG4vKipcbiAqIFJlYWRzLCBlZGl0cywgYW5kIHdyaXRlcyBiYWNrIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUgdXNpbmcgdGhlIHByb3ZpZGVkIGVkaXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGVkaXRGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBlZGl0IHRoZSBwYXJzZWQgYFBhY2thZ2VKc29uYCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgZWRpdGluZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiBlZGl0ZWQgYW5kIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UGFja2FnZUxvY2tKc29uKFxuICBlZGl0RnVuY3Rpb246IChwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbikgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgb3B0aW9uczogRWRpdFBhY2thZ2VMb2NrSnNvbk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjd2QsXG4gICAgc2hvdWxkU2tpcElmTWlzc2luZ1xuICB9ID0gb3B0aW9ucztcbiAgYXdhaXQgZWRpdEpzb248UGFja2FnZUpzb24+KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0SnNvblBhcmFtczxQYWNrYWdlSnNvbj4+KHsgZWRpdEZ1bmN0aW9uLCBwYXRoOiBnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZCksIHNob3VsZFNraXBJZk1pc3NpbmcgfSkpO1xufVxuXG4vKipcbiAqIFJlYWRzLCBlZGl0cywgYW5kIHdyaXRlcyBiYWNrIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUgdXNpbmcgdGhlIHByb3ZpZGVkIGVkaXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGVkaXRGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBlZGl0IHRoZSBwYXJzZWQgYFBhY2thZ2VMb2NrSnNvbmAgb2JqZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGVkaXRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZGl0UGFja2FnZUxvY2tKc29uU3luYyhcbiAgZWRpdEZ1bmN0aW9uOiAocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24pID0+IHZvaWQsXG4gIG9wdGlvbnM6IEVkaXRQYWNrYWdlTG9ja0pzb25TeW5jT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGN3ZCxcbiAgICBzaG91bGRTa2lwSWZNaXNzaW5nXG4gIH0gPSBvcHRpb25zO1xuICBlZGl0SnNvblN5bmM8UGFja2FnZUxvY2tKc29uPihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEpzb25TeW5jUGFyYW1zPFBhY2thZ2VMb2NrSnNvbj4+KHsgZWRpdEZ1bmN0aW9uLCBwYXRoOiBnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZCksIHNob3VsZFNraXBJZk1pc3NpbmcgfSkpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwYXRoIHRvIHRoZSBgbnBtLXNocmlua3dyYXAuanNvbmAgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBvciBpbiB0aGUgcm9vdCBpZiBubyBmb2xkZXIgaXMgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgbnBtLXNocmlua3dyYXAuanNvbmAgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwYXRoIHRvIHRoZSBgbnBtLXNocmlua3dyYXAuanNvbmAgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5wbVNocmlua1dyYXBKc29uUGF0aChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoXG4gICAgcmVzb2x2ZVBhdGhGcm9tUm9vdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVzb2x2ZVBhdGhGcm9tUm9vdFBhcmFtcz4oeyBjd2QsIHBhdGg6IFJlcG9QYXRocy5OcG1TaHJpbmt3cmFwSnNvbiB9KSksXG4gICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIG5wbS1zaHJpbmt3cmFwLmpzb24gcGF0aCdcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgYHBhY2thZ2UuanNvbmAgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBvciBpbiB0aGUgcm9vdCBpZiBubyBmb2xkZXIgaXMgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgcGFja2FnZS5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIHBhdGggdG8gdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvblBhdGgoY3dkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFJlc29sdmVQYXRoRnJvbVJvb3RQYXJhbXM+KHsgY3dkLCBwYXRoOiBSZXBvUGF0aHMuUGFja2FnZUpzb24gfSkpLFxuICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBwYWNrYWdlLmpzb24gcGF0aCdcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgYHBhY2thZ2UtbG9jay5qc29uYCBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGluIHRoZSByb290IGlmIG5vIGZvbGRlciBpcyBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLWxvY2suanNvbmAgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwYXRoIHRvIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShcbiAgICByZXNvbHZlUGF0aEZyb21Sb290KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxSZXNvbHZlUGF0aEZyb21Sb290UGFyYW1zPih7IGN3ZCwgcGF0aDogUmVwb1BhdGhzLlBhY2thZ2VMb2NrSnNvbiB9KSksXG4gICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHBhY2thZ2UtbG9jay5qc29uIHBhdGgnXG4gICk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlciBvciBmcm9tIHRoZSByb290IGlmIG5vIGZvbGRlciBpcyBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLmpzb25gIGlzIGxvY2F0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihjd2Q/OiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBhd2FpdCByZWFkSnNvbjxQYWNrYWdlSnNvbj4oZ2V0UGFja2FnZUpzb25QYXRoKGN3ZCkpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBgcGFja2FnZS5qc29uYCBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBmb2xkZXIgb3IgZnJvbSB0aGUgcm9vdCBpZiBubyBmb2xkZXIgaXMgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgcGFja2FnZS5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvblN5bmMoY3dkPzogc3RyaW5nKTogUGFja2FnZUpzb24ge1xuICByZXR1cm4gcmVhZEpzb25TeW5jPFBhY2thZ2VKc29uPihnZXRQYWNrYWdlSnNvblBhdGgoY3dkKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGZyb20gdGhlIHJvb3QgaWYgbm8gZm9sZGVyIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgd2hlcmUgYHBhY2thZ2UtbG9jay5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwYXJzZWQgYFBhY2thZ2VKc29uYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUxvY2tKc29uKGN3ZD86IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUxvY2tKc29uPiB7XG4gIHJldHVybiBhd2FpdCByZWFkSnNvbjxQYWNrYWdlTG9ja0pzb24+KGdldFBhY2thZ2VMb2NrSnNvblBhdGgoY3dkKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGZyb20gdGhlIHJvb3QgaWYgbm8gZm9sZGVyIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgd2hlcmUgYHBhY2thZ2UtbG9jay5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBgUGFja2FnZUxvY2tKc29uYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUGFja2FnZUxvY2tKc29uU3luYyhjd2Q/OiBzdHJpbmcpOiBQYWNrYWdlTG9ja0pzb24ge1xuICByZXR1cm4gcmVhZEpzb25TeW5jPFBhY2thZ2VMb2NrSnNvbj4oZ2V0UGFja2FnZUxvY2tKc29uUGF0aChjd2QpKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIHByb3ZpZGVkIGBQYWNrYWdlSnNvbmAgb2JqZWN0IHRvIHRoZSBgcGFja2FnZS5qc29uYCBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGluIHRoZSByb290LlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlSnNvbiAtIFRoZSBgUGFja2FnZUpzb25gIG9iamVjdCB0byB3cml0ZS5cbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgcGFja2FnZS5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVBhY2thZ2VKc29uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgY3dkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlSnNvbihnZXRQYWNrYWdlSnNvblBhdGgoY3dkKSwgcGFja2FnZUpzb24pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgcHJvdmlkZWQgYFBhY2thZ2VKc29uYCBvYmplY3QgdG8gdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIgb3IgaW4gdGhlIHJvb3QuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VKc29uIC0gVGhlIGBQYWNrYWdlSnNvbmAgb2JqZWN0IHRvIHdyaXRlLlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLmpzb25gIGlzIGxvY2F0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBhY2thZ2VKc29uU3luYyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIGN3ZD86IHN0cmluZyk6IHZvaWQge1xuICB3cml0ZUpzb25TeW5jKGdldFBhY2thZ2VKc29uUGF0aChjd2QpLCBwYWNrYWdlSnNvbik7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBwcm92aWRlZCBgUGFja2FnZUpzb25gIG9iamVjdCB0byB0aGUgYHBhY2thZ2UtbG9jay5qc29uYCBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGluIHRoZSByb290LlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlTG9ja0pzb24gLSBUaGUgYFBhY2thZ2VMb2NrSnNvbmAgb2JqZWN0IHRvIHdyaXRlLlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLWxvY2suanNvbmAgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVQYWNrYWdlTG9ja0pzb24ocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24sIGN3ZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUpzb24oZ2V0UGFja2FnZUxvY2tKc29uUGF0aChjd2QpLCBwYWNrYWdlTG9ja0pzb24pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgcHJvdmlkZWQgYFBhY2thZ2VMb2NrSnNvbmAgb2JqZWN0IHRvIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIgb3IgaW4gdGhlIHJvb3QuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VMb2NrSnNvbiAtIFRoZSBgUGFja2FnZUxvY2tKc29uYCBvYmplY3QgdG8gd3JpdGUuXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgd2hlcmUgYHBhY2thZ2UtbG9jay5qc29uYCBpcyBsb2NhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQYWNrYWdlTG9ja0pzb25TeW5jKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uLCBjd2Q/OiBzdHJpbmcpOiB2b2lkIHtcbiAgd3JpdGVKc29uU3luYyhnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZCksIHBhY2thZ2VMb2NrSnNvbik7XG59XG5cbi8vIFR5cGVTY3JpcHQncyBkZWNsYXJhdGlvbiBlbWl0IGFkZHMgYHdpdGggeyAncmVzb2x1dGlvbi1tb2RlJzogJ2ltcG9ydCcgfWAgdG8gaW1wb3J0IGRlY2xhcmF0aW9ucyBvbmx5LlxuLy8gQSByZS1leHBvcnQtZnJvbSB3b3VsZCB0aHVzIHJlc29sdmUgRVNNLW9ubHkgYHR5cGUtZmVzdGAgdW5kZXIgYHJlcXVpcmVgIGluIHRoZSBgLmQuY3RzYCBidWlsZCAoVFMxNDc5KS5cbi8vIFJlLWV4cG9ydGluZyB0aGUgYmluZGluZyBpbXBvcnRlZCBhYm92ZSBrZWVwcyB0aGF0IHJlc29sdXRpb24gbW9kZSBhdHRhY2hlZC5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1leHBvcnQtZnJvbSAtLSBgZXhwb3J04oCmZnJvbWAgcmUtaW50cm9kdWNlcyBUUzE0NzksIHNlZSBhYm92ZS5cbmV4cG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQVFsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLDJCQUEyQjtBQTREcEMsZUFBc0Isc0JBQ3BCLGNBQ0EsVUFBd0MsQ0FBQyxHQUMxQjtBQUNmLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sU0FBc0IsNEJBQXlELEVBQUUsY0FBYyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztBQUNsSztBQVNBLGVBQXNCLGdCQUNwQixjQUNBLFVBQWtDLENBQUMsR0FDcEI7QUFDZixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLFNBQXNCLDRCQUF5RCxFQUFFLGNBQWMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLG9CQUFvQixDQUFDLENBQUM7QUFDNUo7QUFRTyxTQUFTLG9CQUNkLGNBQ0EsVUFBc0MsQ0FBQyxHQUNqQztBQUNOLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLGVBQTBCLDRCQUE2RCxFQUFFLGNBQWMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLG9CQUFvQixDQUFDLENBQUM7QUFDOUo7QUFTQSxlQUFzQixvQkFDcEIsY0FDQSxVQUFzQyxDQUFDLEdBQ3hCO0FBQ2YsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxTQUFzQiw0QkFBeUQsRUFBRSxjQUFjLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hLO0FBUU8sU0FBUyx3QkFDZCxjQUNBLFVBQTBDLENBQUMsR0FDckM7QUFDTixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixlQUE4Qiw0QkFBaUUsRUFBRSxjQUFjLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFLO0FBUU8sU0FBUyx5QkFBeUIsS0FBc0I7QUFDN0QsU0FBTztBQUFBLElBQ0wsb0JBQW9CLDRCQUF1RCxFQUFFLEtBQUssTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQUM7QUFBQSxJQUN0SDtBQUFBLEVBQ0Y7QUFDRjtBQVFPLFNBQVMsbUJBQW1CLEtBQXNCO0FBQ3ZELFNBQU87QUFBQSxJQUNMLG9CQUFvQiw0QkFBdUQsRUFBRSxLQUFLLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBQztBQUFBLElBQ2hIO0FBQUEsRUFDRjtBQUNGO0FBUU8sU0FBUyx1QkFBdUIsS0FBc0I7QUFDM0QsU0FBTztBQUFBLElBQ0wsb0JBQW9CLDRCQUF1RCxFQUFFLEtBQUssTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQUM7QUFBQSxJQUNwSDtBQUFBLEVBQ0Y7QUFDRjtBQVFBLGVBQXNCLGdCQUFnQixLQUFvQztBQUN4RSxTQUFPLE1BQU0sU0FBc0IsbUJBQW1CLEdBQUcsQ0FBQztBQUM1RDtBQVFPLFNBQVMsb0JBQW9CLEtBQTJCO0FBQzdELFNBQU8sYUFBMEIsbUJBQW1CLEdBQUcsQ0FBQztBQUMxRDtBQVFBLGVBQXNCLG9CQUFvQixLQUF3QztBQUNoRixTQUFPLE1BQU0sU0FBMEIsdUJBQXVCLEdBQUcsQ0FBQztBQUNwRTtBQVFPLFNBQVMsd0JBQXdCLEtBQStCO0FBQ3JFLFNBQU8sYUFBOEIsdUJBQXVCLEdBQUcsQ0FBQztBQUNsRTtBQVNBLGVBQXNCLGlCQUFpQixhQUEwQixLQUE2QjtBQUM1RixRQUFNLFVBQVUsbUJBQW1CLEdBQUcsR0FBRyxXQUFXO0FBQ3REO0FBUU8sU0FBUyxxQkFBcUIsYUFBMEIsS0FBb0I7QUFDakYsZ0JBQWMsbUJBQW1CLEdBQUcsR0FBRyxXQUFXO0FBQ3BEO0FBU0EsZUFBc0IscUJBQXFCLGlCQUFrQyxLQUE2QjtBQUN4RyxRQUFNLFVBQVUsdUJBQXVCLEdBQUcsR0FBRyxlQUFlO0FBQzlEO0FBUU8sU0FBUyx5QkFBeUIsaUJBQWtDLEtBQW9CO0FBQzdGLGdCQUFjLHVCQUF1QixHQUFHLEdBQUcsZUFBZTtBQUM1RDsiLCJuYW1lcyI6W119
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ucG0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBOUE0gcGFja2FnZS5qc29uLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGFja2FnZUpzb24sXG4gIFByb21pc2FibGVcbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgRWRpdEpzb25QYXJhbXMsXG4gIEVkaXRKc29uU3luY1BhcmFtc1xufSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUGF0aEZyb21Sb290UGFyYW1zIH0gZnJvbSAnLi9yb290LnRzJztcblxuaW1wb3J0IHtcbiAgZWRpdEpzb24sXG4gIGVkaXRKc29uU3luYyxcbiAgcmVhZEpzb24sXG4gIHJlYWRKc29uU3luYyxcbiAgd3JpdGVKc29uLFxuICB3cml0ZUpzb25TeW5jXG59IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQgeyBSZXBvUGF0aHMgfSBmcm9tICcuL3JlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhdGhGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXROcG1TaHJpbmtXcmFwSnNvbn0uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXROcG1TaHJpbmtXcmFwSnNvbk9wdGlvbnMgPSBFZGl0UGFja2FnZUpzb25PcHRpb25zO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0UGFja2FnZUpzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRQYWNrYWdlSnNvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLmpzb25gIGlzIGxvY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc2tpcHMgZWRpdGluZyBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcElmTWlzc2luZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRQYWNrYWdlSnNvblN5bmN9LlxuICovXG5leHBvcnQgdHlwZSBFZGl0UGFja2FnZUpzb25TeW5jT3B0aW9ucyA9IEVkaXRQYWNrYWdlSnNvbk9wdGlvbnM7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRQYWNrYWdlTG9ja0pzb259LlxuICovXG5leHBvcnQgdHlwZSBFZGl0UGFja2FnZUxvY2tKc29uT3B0aW9ucyA9IEVkaXRQYWNrYWdlSnNvbk9wdGlvbnM7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRQYWNrYWdlTG9ja0pzb25TeW5jfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdFBhY2thZ2VMb2NrSnNvblN5bmNPcHRpb25zID0gRWRpdFBhY2thZ2VKc29uT3B0aW9ucztcblxuLyoqXG4gKiBBIHR5cGUgb2YgdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gKi9cblxuLyoqXG4gKiBBIHR5cGUgb2YgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlTG9ja0pzb24gZXh0ZW5kcyBQYXJ0aWFsPFBhY2thZ2VKc29uPiB7XG4gIC8qKlxuICAgKiBQYWNrYWdlcyBpbiB0aGUgYHBhY2thZ2UtbG9jay5qc29uYCBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZXM/OiBSZWNvcmQ8c3RyaW5nLCBQYWNrYWdlSnNvbj47XG59XG5cbi8qKlxuICogUmVhZHMsIGVkaXRzLCBhbmQgd3JpdGVzIGJhY2sgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZSB1c2luZyB0aGUgcHJvdmlkZWQgZWRpdCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gZWRpdEZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGVkaXQgdGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zIGZvciBlZGl0aW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIGVkaXRlZCBhbmQgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXROcG1TaHJpbmtXcmFwSnNvbihcbiAgZWRpdEZ1bmN0aW9uOiAocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24pID0+IFByb21pc2FibGU8dm9pZD4sXG4gIG9wdGlvbnM6IEVkaXROcG1TaHJpbmtXcmFwSnNvbk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjd2QsXG4gICAgc2hvdWxkU2tpcElmTWlzc2luZ1xuICB9ID0gb3B0aW9ucztcbiAgYXdhaXQgZWRpdEpzb248UGFja2FnZUpzb24+KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0SnNvblBhcmFtczxQYWNrYWdlSnNvbj4+KHsgZWRpdEZ1bmN0aW9uLCBwYXRoOiBnZXROcG1TaHJpbmtXcmFwSnNvblBhdGgoY3dkKSwgc2hvdWxkU2tpcElmTWlzc2luZyB9KSk7XG59XG5cbi8qKlxuICogUmVhZHMsIGVkaXRzLCBhbmQgd3JpdGVzIGJhY2sgdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUgdXNpbmcgdGhlIHByb3ZpZGVkIGVkaXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGVkaXRGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBlZGl0IHRoZSBwYXJzZWQgYFBhY2thZ2VKc29uYCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgZWRpdGluZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiBlZGl0ZWQgYW5kIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UGFja2FnZUpzb24oXG4gIGVkaXRGdW5jdGlvbjogKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbikgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgb3B0aW9uczogRWRpdFBhY2thZ2VKc29uT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGN3ZCxcbiAgICBzaG91bGRTa2lwSWZNaXNzaW5nXG4gIH0gPSBvcHRpb25zO1xuICBhd2FpdCBlZGl0SnNvbjxQYWNrYWdlSnNvbj4obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRKc29uUGFyYW1zPFBhY2thZ2VKc29uPj4oeyBlZGl0RnVuY3Rpb24sIHBhdGg6IGdldFBhY2thZ2VKc29uUGF0aChjd2QpLCBzaG91bGRTa2lwSWZNaXNzaW5nIH0pKTtcbn1cblxuLyoqXG4gKiBSZWFkcywgZWRpdHMsIGFuZCB3cml0ZXMgYmFjayB0aGUgYHBhY2thZ2UuanNvbmAgZmlsZSB1c2luZyB0aGUgcHJvdmlkZWQgZWRpdCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gZWRpdEZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGVkaXQgdGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zIGZvciBlZGl0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWRpdFBhY2thZ2VKc29uU3luYyhcbiAgZWRpdEZ1bmN0aW9uOiAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKSA9PiB2b2lkLFxuICBvcHRpb25zOiBFZGl0UGFja2FnZUpzb25TeW5jT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGN3ZCxcbiAgICBzaG91bGRTa2lwSWZNaXNzaW5nXG4gIH0gPSBvcHRpb25zO1xuICBlZGl0SnNvblN5bmM8UGFja2FnZUpzb24+KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0SnNvblN5bmNQYXJhbXM8UGFja2FnZUpzb24+Pih7IGVkaXRGdW5jdGlvbiwgcGF0aDogZ2V0UGFja2FnZUpzb25QYXRoKGN3ZCksIHNob3VsZFNraXBJZk1pc3NpbmcgfSkpO1xufVxuXG4vKipcbiAqIFJlYWRzLCBlZGl0cywgYW5kIHdyaXRlcyBiYWNrIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUgdXNpbmcgdGhlIHByb3ZpZGVkIGVkaXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGVkaXRGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBlZGl0IHRoZSBwYXJzZWQgYFBhY2thZ2VKc29uYCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgZWRpdGluZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiBlZGl0ZWQgYW5kIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0UGFja2FnZUxvY2tKc29uKFxuICBlZGl0RnVuY3Rpb246IChwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbikgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgb3B0aW9uczogRWRpdFBhY2thZ2VMb2NrSnNvbk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBjd2QsXG4gICAgc2hvdWxkU2tpcElmTWlzc2luZ1xuICB9ID0gb3B0aW9ucztcbiAgYXdhaXQgZWRpdEpzb248UGFja2FnZUpzb24+KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0SnNvblBhcmFtczxQYWNrYWdlSnNvbj4+KHsgZWRpdEZ1bmN0aW9uLCBwYXRoOiBnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZCksIHNob3VsZFNraXBJZk1pc3NpbmcgfSkpO1xufVxuXG4vKipcbiAqIFJlYWRzLCBlZGl0cywgYW5kIHdyaXRlcyBiYWNrIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUgdXNpbmcgdGhlIHByb3ZpZGVkIGVkaXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGVkaXRGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBlZGl0IHRoZSBwYXJzZWQgYFBhY2thZ2VMb2NrSnNvbmAgb2JqZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGVkaXRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZGl0UGFja2FnZUxvY2tKc29uU3luYyhcbiAgZWRpdEZ1bmN0aW9uOiAocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24pID0+IHZvaWQsXG4gIG9wdGlvbnM6IEVkaXRQYWNrYWdlTG9ja0pzb25TeW5jT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGN3ZCxcbiAgICBzaG91bGRTa2lwSWZNaXNzaW5nXG4gIH0gPSBvcHRpb25zO1xuICBlZGl0SnNvblN5bmM8UGFja2FnZUxvY2tKc29uPihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdEpzb25TeW5jUGFyYW1zPFBhY2thZ2VMb2NrSnNvbj4+KHsgZWRpdEZ1bmN0aW9uLCBwYXRoOiBnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZCksIHNob3VsZFNraXBJZk1pc3NpbmcgfSkpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwYXRoIHRvIHRoZSBgbnBtLXNocmlua3dyYXAuanNvbmAgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBvciBpbiB0aGUgcm9vdCBpZiBubyBmb2xkZXIgaXMgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgbnBtLXNocmlua3dyYXAuanNvbmAgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwYXRoIHRvIHRoZSBgbnBtLXNocmlua3dyYXAuanNvbmAgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5wbVNocmlua1dyYXBKc29uUGF0aChjd2Q/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoXG4gICAgcmVzb2x2ZVBhdGhGcm9tUm9vdChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVzb2x2ZVBhdGhGcm9tUm9vdFBhcmFtcz4oeyBjd2QsIHBhdGg6IFJlcG9QYXRocy5OcG1TaHJpbmt3cmFwSnNvbiB9KSksXG4gICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIG5wbS1zaHJpbmt3cmFwLmpzb24gcGF0aCdcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgYHBhY2thZ2UuanNvbmAgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBvciBpbiB0aGUgcm9vdCBpZiBubyBmb2xkZXIgaXMgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgcGFja2FnZS5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIHBhdGggdG8gdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvblBhdGgoY3dkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFJlc29sdmVQYXRoRnJvbVJvb3RQYXJhbXM+KHsgY3dkLCBwYXRoOiBSZXBvUGF0aHMuUGFja2FnZUpzb24gfSkpLFxuICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBwYWNrYWdlLmpzb24gcGF0aCdcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGF0aCB0byB0aGUgYHBhY2thZ2UtbG9jay5qc29uYCBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGluIHRoZSByb290IGlmIG5vIGZvbGRlciBpcyBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLWxvY2suanNvbmAgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwYXRoIHRvIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZD86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShcbiAgICByZXNvbHZlUGF0aEZyb21Sb290KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxSZXNvbHZlUGF0aEZyb21Sb290UGFyYW1zPih7IGN3ZCwgcGF0aDogUmVwb1BhdGhzLlBhY2thZ2VMb2NrSnNvbiB9KSksXG4gICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHBhY2thZ2UtbG9jay5qc29uIHBhdGgnXG4gICk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUgZnJvbSB0aGUgc3BlY2lmaWVkIGZvbGRlciBvciBmcm9tIHRoZSByb290IGlmIG5vIGZvbGRlciBpcyBzcGVjaWZpZWQuXG4gKlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLmpzb25gIGlzIGxvY2F0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihjd2Q/OiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBhd2FpdCByZWFkSnNvbjxQYWNrYWdlSnNvbj4oZ2V0UGFja2FnZUpzb25QYXRoKGN3ZCkpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBgcGFja2FnZS5qc29uYCBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBmb2xkZXIgb3IgZnJvbSB0aGUgcm9vdCBpZiBubyBmb2xkZXIgaXMgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgcGFja2FnZS5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBgUGFja2FnZUpzb25gIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvblN5bmMoY3dkPzogc3RyaW5nKTogUGFja2FnZUpzb24ge1xuICByZXR1cm4gcmVhZEpzb25TeW5jPFBhY2thZ2VKc29uPihnZXRQYWNrYWdlSnNvblBhdGgoY3dkKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGZyb20gdGhlIHJvb3QgaWYgbm8gZm9sZGVyIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgd2hlcmUgYHBhY2thZ2UtbG9jay5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwYXJzZWQgYFBhY2thZ2VKc29uYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUxvY2tKc29uKGN3ZD86IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUxvY2tKc29uPiB7XG4gIHJldHVybiBhd2FpdCByZWFkSnNvbjxQYWNrYWdlTG9ja0pzb24+KGdldFBhY2thZ2VMb2NrSnNvblBhdGgoY3dkKSk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBwYWNrYWdlLWxvY2suanNvbmAgZmlsZSBmcm9tIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGZyb20gdGhlIHJvb3QgaWYgbm8gZm9sZGVyIGlzIHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgd2hlcmUgYHBhY2thZ2UtbG9jay5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBgUGFja2FnZUxvY2tKc29uYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUGFja2FnZUxvY2tKc29uU3luYyhjd2Q/OiBzdHJpbmcpOiBQYWNrYWdlTG9ja0pzb24ge1xuICByZXR1cm4gcmVhZEpzb25TeW5jPFBhY2thZ2VMb2NrSnNvbj4oZ2V0UGFja2FnZUxvY2tKc29uUGF0aChjd2QpKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIHByb3ZpZGVkIGBQYWNrYWdlSnNvbmAgb2JqZWN0IHRvIHRoZSBgcGFja2FnZS5qc29uYCBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGluIHRoZSByb290LlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlSnNvbiAtIFRoZSBgUGFja2FnZUpzb25gIG9iamVjdCB0byB3cml0ZS5cbiAqIEBwYXJhbSBjd2QgLSBUaGUgY3VycmVudCB3b3JraW5nIGZvbGRlciB3aGVyZSBgcGFja2FnZS5qc29uYCBpcyBsb2NhdGVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGhhcyBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVBhY2thZ2VKc29uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgY3dkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlSnNvbihnZXRQYWNrYWdlSnNvblBhdGgoY3dkKSwgcGFja2FnZUpzb24pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgcHJvdmlkZWQgYFBhY2thZ2VKc29uYCBvYmplY3QgdG8gdGhlIGBwYWNrYWdlLmpzb25gIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIgb3IgaW4gdGhlIHJvb3QuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VKc29uIC0gVGhlIGBQYWNrYWdlSnNvbmAgb2JqZWN0IHRvIHdyaXRlLlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLmpzb25gIGlzIGxvY2F0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBhY2thZ2VKc29uU3luYyhwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIGN3ZD86IHN0cmluZyk6IHZvaWQge1xuICB3cml0ZUpzb25TeW5jKGdldFBhY2thZ2VKc29uUGF0aChjd2QpLCBwYWNrYWdlSnNvbik7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBwcm92aWRlZCBgUGFja2FnZUpzb25gIG9iamVjdCB0byB0aGUgYHBhY2thZ2UtbG9jay5qc29uYCBmaWxlIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9yIGluIHRoZSByb290LlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlTG9ja0pzb24gLSBUaGUgYFBhY2thZ2VMb2NrSnNvbmAgb2JqZWN0IHRvIHdyaXRlLlxuICogQHBhcmFtIGN3ZCAtIFRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyIHdoZXJlIGBwYWNrYWdlLWxvY2suanNvbmAgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZSBoYXMgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVQYWNrYWdlTG9ja0pzb24ocGFja2FnZUxvY2tKc29uOiBQYWNrYWdlTG9ja0pzb24sIGN3ZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUpzb24oZ2V0UGFja2FnZUxvY2tKc29uUGF0aChjd2QpLCBwYWNrYWdlTG9ja0pzb24pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgcHJvdmlkZWQgYFBhY2thZ2VMb2NrSnNvbmAgb2JqZWN0IHRvIHRoZSBgcGFja2FnZS1sb2NrLmpzb25gIGZpbGUgaW4gdGhlIHNwZWNpZmllZCBmb2xkZXIgb3IgaW4gdGhlIHJvb3QuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VMb2NrSnNvbiAtIFRoZSBgUGFja2FnZUxvY2tKc29uYCBvYmplY3QgdG8gd3JpdGUuXG4gKiBAcGFyYW0gY3dkIC0gVGhlIGN1cnJlbnQgd29ya2luZyBmb2xkZXIgd2hlcmUgYHBhY2thZ2UtbG9jay5qc29uYCBpcyBsb2NhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQYWNrYWdlTG9ja0pzb25TeW5jKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uLCBjd2Q/OiBzdHJpbmcpOiB2b2lkIHtcbiAgd3JpdGVKc29uU3luYyhnZXRQYWNrYWdlTG9ja0pzb25QYXRoKGN3ZCksIHBhY2thZ2VMb2NrSnNvbik7XG59XG5cbi8vIFR5cGVTY3JpcHQncyBkZWNsYXJhdGlvbiBlbWl0IGFkZHMgYHdpdGggeyAncmVzb2x1dGlvbi1tb2RlJzogJ2ltcG9ydCcgfWAgdG8gaW1wb3J0IGRlY2xhcmF0aW9ucyBvbmx5LlxuLy8gQSByZS1leHBvcnQtZnJvbSB3b3VsZCB0aHVzIHJlc29sdmUgRVNNLW9ubHkgYHR5cGUtZmVzdGAgdW5kZXIgYHJlcXVpcmVgIGluIHRoZSBgLmQuY3RzYCBidWlsZCAoVFMxNDc5KS5cbi8vIFJlLWV4cG9ydGluZyB0aGUgYmluZGluZyBpbXBvcnRlZCBhYm92ZSBrZWVwcyB0aGF0IHJlc29sdXRpb24gbW9kZSBhdHRhY2hlZC5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1leHBvcnQtZnJvbSAtLSBgZXhwb3J04oCmZnJvbWAgcmUtaW50cm9kdWNlcyBUUzE0NzksIHNlZSBhYm92ZS5cbmV4cG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQVFsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLDJCQUEyQjtBQTREcEMsZUFBc0Isc0JBQ3BCLGNBQ0EsVUFBd0MsQ0FBQyxHQUMxQjtBQUNmLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sU0FBc0IsNEJBQXlELEVBQUUsY0FBYyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztBQUNsSztBQVNBLGVBQXNCLGdCQUNwQixjQUNBLFVBQWtDLENBQUMsR0FDcEI7QUFDZixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLFNBQXNCLDRCQUF5RCxFQUFFLGNBQWMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLG9CQUFvQixDQUFDLENBQUM7QUFDNUo7QUFRTyxTQUFTLG9CQUNkLGNBQ0EsVUFBc0MsQ0FBQyxHQUNqQztBQUNOLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLGVBQTBCLDRCQUE2RCxFQUFFLGNBQWMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLG9CQUFvQixDQUFDLENBQUM7QUFDOUo7QUFTQSxlQUFzQixvQkFDcEIsY0FDQSxVQUFzQyxDQUFDLEdBQ3hCO0FBQ2YsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxTQUFzQiw0QkFBeUQsRUFBRSxjQUFjLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hLO0FBUU8sU0FBUyx3QkFDZCxjQUNBLFVBQTBDLENBQUMsR0FDckM7QUFDTixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixlQUE4Qiw0QkFBaUUsRUFBRSxjQUFjLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFLO0FBUU8sU0FBUyx5QkFBeUIsS0FBc0I7QUFDN0QsU0FBTztBQUFBLElBQ0wsb0JBQW9CLDRCQUF1RCxFQUFFLEtBQUssTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQUM7QUFBQSxJQUN0SDtBQUFBLEVBQ0Y7QUFDRjtBQVFPLFNBQVMsbUJBQW1CLEtBQXNCO0FBQ3ZELFNBQU87QUFBQSxJQUNMLG9CQUFvQiw0QkFBdUQsRUFBRSxLQUFLLE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBQztBQUFBLElBQ2hIO0FBQUEsRUFDRjtBQUNGO0FBUU8sU0FBUyx1QkFBdUIsS0FBc0I7QUFDM0QsU0FBTztBQUFBLElBQ0wsb0JBQW9CLDRCQUF1RCxFQUFFLEtBQUssTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQUM7QUFBQSxJQUNwSDtBQUFBLEVBQ0Y7QUFDRjtBQVFBLGVBQXNCLGdCQUFnQixLQUFvQztBQUN4RSxTQUFPLE1BQU0sU0FBc0IsbUJBQW1CLEdBQUcsQ0FBQztBQUM1RDtBQVFPLFNBQVMsb0JBQW9CLEtBQTJCO0FBQzdELFNBQU8sYUFBMEIsbUJBQW1CLEdBQUcsQ0FBQztBQUMxRDtBQVFBLGVBQXNCLG9CQUFvQixLQUF3QztBQUNoRixTQUFPLE1BQU0sU0FBMEIsdUJBQXVCLEdBQUcsQ0FBQztBQUNwRTtBQVFPLFNBQVMsd0JBQXdCLEtBQStCO0FBQ3JFLFNBQU8sYUFBOEIsdUJBQXVCLEdBQUcsQ0FBQztBQUNsRTtBQVNBLGVBQXNCLGlCQUFpQixhQUEwQixLQUE2QjtBQUM1RixRQUFNLFVBQVUsbUJBQW1CLEdBQUcsR0FBRyxXQUFXO0FBQ3REO0FBUU8sU0FBUyxxQkFBcUIsYUFBMEIsS0FBb0I7QUFDakYsZ0JBQWMsbUJBQW1CLEdBQUcsR0FBRyxXQUFXO0FBQ3BEO0FBU0EsZUFBc0IscUJBQXFCLGlCQUFrQyxLQUE2QjtBQUN4RyxRQUFNLFVBQVUsdUJBQXVCLEdBQUcsR0FBRyxlQUFlO0FBQzlEO0FBUU8sU0FBUyx5QkFBeUIsaUJBQWtDLEtBQW9CO0FBQzdGLGdCQUFjLHVCQUF1QixHQUFHLEdBQUcsZUFBZTtBQUM1RDsiLCJuYW1lcyI6W119
|