@vertesia/workflow 0.57.0 → 0.58.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/lib/cjs/activities/generateEmbeddings.js +158 -61
- package/lib/cjs/activities/generateEmbeddings.js.map +1 -1
- package/lib/cjs/activities/generateOrAssignContentType.js +19 -8
- package/lib/cjs/activities/generateOrAssignContentType.js.map +1 -1
- package/lib/cjs/activities/index-dsl.js +4 -2
- package/lib/cjs/activities/index-dsl.js.map +1 -1
- package/lib/cjs/activities/renditions/generateImageRendition.js +57 -0
- package/lib/cjs/activities/renditions/generateImageRendition.js.map +1 -0
- package/lib/cjs/activities/renditions/generateVideoRendition.js +196 -0
- package/lib/cjs/activities/renditions/generateVideoRendition.js.map +1 -0
- package/lib/cjs/dsl/dsl-workflow.js +8 -0
- package/lib/cjs/dsl/dsl-workflow.js.map +1 -1
- package/lib/cjs/index.js +3 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/utils/renditions.js +88 -0
- package/lib/cjs/utils/renditions.js.map +1 -0
- package/lib/esm/activities/generateEmbeddings.js +160 -63
- package/lib/esm/activities/generateEmbeddings.js.map +1 -1
- package/lib/esm/activities/generateOrAssignContentType.js +21 -10
- package/lib/esm/activities/generateOrAssignContentType.js.map +1 -1
- package/lib/esm/activities/index-dsl.js +2 -1
- package/lib/esm/activities/index-dsl.js.map +1 -1
- package/lib/esm/activities/renditions/generateImageRendition.js +54 -0
- package/lib/esm/activities/renditions/generateImageRendition.js.map +1 -0
- package/lib/esm/activities/renditions/generateVideoRendition.js +190 -0
- package/lib/esm/activities/renditions/generateVideoRendition.js.map +1 -0
- package/lib/esm/dsl/dsl-workflow.js +8 -0
- package/lib/esm/dsl/dsl-workflow.js.map +1 -1
- package/lib/esm/index.js +3 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/utils/renditions.js +80 -0
- package/lib/esm/utils/renditions.js.map +1 -0
- package/lib/types/activities/generateEmbeddings.d.ts +1 -1
- package/lib/types/activities/generateEmbeddings.d.ts.map +1 -1
- package/lib/types/activities/generateOrAssignContentType.d.ts.map +1 -1
- package/lib/types/activities/index-dsl.d.ts +2 -1
- package/lib/types/activities/index-dsl.d.ts.map +1 -1
- package/lib/types/activities/{generateImageRendition.d.ts → renditions/generateImageRendition.d.ts} +4 -5
- package/lib/types/activities/renditions/generateImageRendition.d.ts.map +1 -0
- package/lib/types/activities/renditions/generateVideoRendition.d.ts +15 -0
- package/lib/types/activities/renditions/generateVideoRendition.d.ts.map +1 -0
- package/lib/types/dsl/dsl-workflow.d.ts.map +1 -1
- package/lib/types/index.d.ts +3 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/utils/renditions.d.ts +23 -0
- package/lib/types/utils/renditions.d.ts.map +1 -0
- package/lib/workflows-bundle.js +26 -1
- package/package.json +3 -3
- package/src/activities/generateEmbeddings.ts +440 -296
- package/src/activities/generateOrAssignContentType.ts +185 -144
- package/src/activities/index-dsl.ts +2 -1
- package/src/activities/renditions/generateImageRendition.ts +99 -0
- package/src/activities/renditions/generateVideoRendition.ts +288 -0
- package/src/dsl/dsl-workflow.ts +8 -0
- package/src/dsl/workflow-exec-child.test.ts +1 -0
- package/src/dsl/workflow.test.ts +1 -0
- package/src/index.ts +3 -1
- package/src/utils/renditions.ts +124 -0
- package/lib/cjs/activities/generateImageRendition.js +0 -167
- package/lib/cjs/activities/generateImageRendition.js.map +0 -1
- package/lib/esm/activities/generateImageRendition.js +0 -161
- package/lib/esm/activities/generateImageRendition.js.map +0 -1
- package/lib/types/activities/generateImageRendition.d.ts.map +0 -1
- package/src/activities/generateImageRendition.ts +0 -202
package/lib/workflows-bundle.js
CHANGED
@@ -9139,8 +9139,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
9139
9139
|
/* harmony export */ ExecutionEnvironmentRefPopulate: () => (/* reexport safe */ _environment_js__WEBPACK_IMPORTED_MODULE_4__.ExecutionEnvironmentRefPopulate),
|
9140
9140
|
/* harmony export */ ExecutionRunRefSelect: () => (/* reexport safe */ _interaction_js__WEBPACK_IMPORTED_MODULE_7__.ExecutionRunRefSelect),
|
9141
9141
|
/* harmony export */ ExecutionRunStatus: () => (/* reexport safe */ _interaction_js__WEBPACK_IMPORTED_MODULE_7__.ExecutionRunStatus),
|
9142
|
+
/* harmony export */ ImageRenditionFormat: () => (/* reexport safe */ _store_index_js__WEBPACK_IMPORTED_MODULE_17__.ImageRenditionFormat),
|
9142
9143
|
/* harmony export */ InteractionRefPopulate: () => (/* reexport safe */ _interaction_js__WEBPACK_IMPORTED_MODULE_7__.InteractionRefPopulate),
|
9143
9144
|
/* harmony export */ InteractionStatus: () => (/* reexport safe */ _interaction_js__WEBPACK_IMPORTED_MODULE_7__.InteractionStatus),
|
9145
|
+
/* harmony export */ MarkdownRenditionFormat: () => (/* reexport safe */ _store_index_js__WEBPACK_IMPORTED_MODULE_17__.MarkdownRenditionFormat),
|
9144
9146
|
/* harmony export */ MeterNames: () => (/* reexport safe */ _meters_js__WEBPACK_IMPORTED_MODULE_8__.MeterNames),
|
9145
9147
|
/* harmony export */ ParentClosePolicy: () => (/* reexport safe */ _store_index_js__WEBPACK_IMPORTED_MODULE_17__.ParentClosePolicy),
|
9146
9148
|
/* harmony export */ Permission: () => (/* reexport safe */ _access_control_js__WEBPACK_IMPORTED_MODULE_0__.Permission),
|
@@ -9649,6 +9651,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
9649
9651
|
/* harmony export */ ContentEventName: () => (/* reexport safe */ _workflow_js__WEBPACK_IMPORTED_MODULE_9__.ContentEventName),
|
9650
9652
|
/* harmony export */ ContentObjectStatus: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.ContentObjectStatus),
|
9651
9653
|
/* harmony export */ DocumentPartSchema: () => (/* reexport safe */ _object_types_js__WEBPACK_IMPORTED_MODULE_6__.DocumentPartSchema),
|
9654
|
+
/* harmony export */ ImageRenditionFormat: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.ImageRenditionFormat),
|
9655
|
+
/* harmony export */ MarkdownRenditionFormat: () => (/* reexport safe */ _store_js__WEBPACK_IMPORTED_MODULE_7__.MarkdownRenditionFormat),
|
9652
9656
|
/* harmony export */ ParentClosePolicy: () => (/* reexport safe */ _temporalio_js__WEBPACK_IMPORTED_MODULE_8__.ParentClosePolicy),
|
9653
9657
|
/* harmony export */ RenditionSchema: () => (/* reexport safe */ _object_types_js__WEBPACK_IMPORTED_MODULE_6__.RenditionSchema),
|
9654
9658
|
/* harmony export */ WorkflowDefinitionRefPopulate: () => (/* reexport safe */ _dsl_workflow_js__WEBPACK_IMPORTED_MODULE_5__.WorkflowDefinitionRefPopulate),
|
@@ -9815,6 +9819,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
9815
9819
|
__webpack_require__.r(__webpack_exports__);
|
9816
9820
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
9817
9821
|
/* harmony export */ ContentObjectStatus: () => (/* binding */ ContentObjectStatus),
|
9822
|
+
/* harmony export */ ImageRenditionFormat: () => (/* binding */ ImageRenditionFormat),
|
9823
|
+
/* harmony export */ MarkdownRenditionFormat: () => (/* binding */ MarkdownRenditionFormat),
|
9818
9824
|
/* harmony export */ WorkflowRuleInputType: () => (/* binding */ WorkflowRuleInputType)
|
9819
9825
|
/* harmony export */ });
|
9820
9826
|
var ContentObjectStatus;
|
@@ -9831,6 +9837,17 @@ var WorkflowRuleInputType;
|
|
9831
9837
|
WorkflowRuleInputType["multiple"] = "multiple";
|
9832
9838
|
WorkflowRuleInputType["none"] = "none";
|
9833
9839
|
})(WorkflowRuleInputType || (WorkflowRuleInputType = {}));
|
9840
|
+
var ImageRenditionFormat;
|
9841
|
+
(function (ImageRenditionFormat) {
|
9842
|
+
ImageRenditionFormat["jpeg"] = "jpeg";
|
9843
|
+
ImageRenditionFormat["png"] = "png";
|
9844
|
+
ImageRenditionFormat["webp"] = "webp";
|
9845
|
+
})(ImageRenditionFormat || (ImageRenditionFormat = {}));
|
9846
|
+
var MarkdownRenditionFormat;
|
9847
|
+
(function (MarkdownRenditionFormat) {
|
9848
|
+
MarkdownRenditionFormat["docx"] = "docx";
|
9849
|
+
MarkdownRenditionFormat["pdf"] = "pdf";
|
9850
|
+
})(MarkdownRenditionFormat || (MarkdownRenditionFormat = {}));
|
9834
9851
|
|
9835
9852
|
|
9836
9853
|
/***/ }),
|
@@ -10386,10 +10403,14 @@ async function startChildWorkflow(step, payload, vars, debug_mode) {
|
|
10386
10403
|
workflow: step.spec,
|
10387
10404
|
vars: resolvedVars
|
10388
10405
|
}],
|
10406
|
+
memo: {
|
10407
|
+
InitiatedBy: payload.initiated_by,
|
10408
|
+
},
|
10389
10409
|
searchAttributes: {
|
10390
10410
|
AccountId: [payload.account_id],
|
10391
10411
|
DocumentId: (0,_vertesia_common__WEBPACK_IMPORTED_MODULE_1__.getDocumentIds)(payload),
|
10392
10412
|
ProjectId: [payload.project_id],
|
10413
|
+
InitiatedBy: payload.initiated_by ? [payload.initiated_by] : [],
|
10393
10414
|
},
|
10394
10415
|
});
|
10395
10416
|
if (step.output) {
|
@@ -10412,10 +10433,14 @@ async function executeChildWorkflow(step, payload, vars, debug_mode) {
|
|
10412
10433
|
workflow: step.spec,
|
10413
10434
|
vars: resolvedVars,
|
10414
10435
|
}],
|
10436
|
+
memo: {
|
10437
|
+
InitiatedBy: payload.initiated_by,
|
10438
|
+
},
|
10415
10439
|
searchAttributes: {
|
10416
10440
|
AccountId: [payload.account_id],
|
10417
10441
|
DocumentId: (0,_vertesia_common__WEBPACK_IMPORTED_MODULE_1__.getDocumentIds)(payload),
|
10418
10442
|
ProjectId: [payload.project_id],
|
10443
|
+
InitiatedBy: payload.initiated_by ? [payload.initiated_by] : [],
|
10419
10444
|
},
|
10420
10445
|
});
|
10421
10446
|
if (step.output) {
|
@@ -11400,4 +11425,4 @@ exports.importInterceptors = function importInterceptors() {
|
|
11400
11425
|
__TEMPORAL__ = __webpack_exports__;
|
11401
11426
|
/******/ })()
|
11402
11427
|
;
|
11403
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctYnVuZGxlLWViNDk5MzRkMTYxMzI2NDBhZTQ0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTJCO0FBRVU7QUFDQztBQUNKO0FBQ0U7QUFDRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ053RDtBQUMxQztBQTRDN0MsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsTUFBcUI7SUFDbEUsZ0JBQWdCO0lBQ2hCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQzthQUNJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxJQUFLLE1BQStCLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQzVELE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQzthQUNJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7YUFDSSxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFDRCxnQkFBZ0I7U0FDWCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMs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QSxZQUFZLG1CQUFPLENBQUMsb0tBQThDO0FBQ2xFLFdBQVc7O0FBRVgsUUFBUSxrQkFBa0IsRUFBRSxtQkFBTyxDQUFDLG9LQUE4QztBQUNsRjs7QUFFQSx1QkFBdUI7QUFDdkIsU0FBUyxtQkFBTyw0QkFBNEIsc0RBQStFO0FBQzNIOztBQUVBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL2luZGV4LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL29wdGlvbnMvYmVkcm9jay50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL2xsdW1pdmVyc2UvY29tbW9uL3NyYy9vcHRpb25zL2ZhbGxiYWNrLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL29wdGlvbnMvZ3JvcS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL2xsdW1pdmVyc2UvY29tbW9uL3NyYy9vcHRpb25zL29wZW5haS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL2xsdW1pdmVyc2UvY29tbW9uL3NyYy9vcHRpb25zL3ZlcnRleGFpLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL3R5cGVzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvYWN0aXZpdHktb3B0aW9ucy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlci50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlci50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3BheWxvYWQtY29udmVydGVyLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3R5cGVzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZGVwcmVjYXRlZC10aW1lLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZW5jb2RpbmcudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9lcnJvcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9mYWlsdXJlLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW5kZXgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmNlcHRvcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmZhY2VzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2luZGV4LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvbG9nZ2VyLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvcmV0cnktcG9saWN5LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdGltZS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3R5cGUtaGVscGVycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LWVudW0udHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy92ZXJzaW9uaW5nLWludGVudC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWhhbmRsZS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LW9wdGlvbnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvYWxlYS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9jYW5jZWxsYXRpb24tc2NvcGUudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZXJyb3JzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ZsYWdzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2dsb2JhbC1hdHRyaWJ1dGVzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2dsb2JhbC1vdmVycmlkZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW5kZXgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJjZXB0b3JzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyZmFjZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJuYWxzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2xvZ3MudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcGtnLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3NpbmtzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3N0YWNrLWhlbHBlcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdHJpZ2dlci50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy91cGRhdGUtc2NvcGUudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvd29ya2VyLWludGVyZmFjZS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZmxvdy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9mYXN0LWRlZXAtZXF1YWxAMy4xLjMvbm9kZV9tb2R1bGVzL2Zhc3QtZGVlcC1lcXVhbC9pbmRleC5qcyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9sb25nQDUuMy4xL25vZGVfbW9kdWxlcy9sb25nL3VtZC9pbmRleC5qcyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9tc0AzLjAuMC1jYW5hcnkuMS9ub2RlX21vZHVsZXMvbXMvZGlzdC9pbmRleC5janMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vbXNAMy4wLjAtY2FuYXJ5LjEvbm9kZV9tb2R1bGVzL21zL2Rpc3QvaW5kZXgubWpzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9Qcm9ncmVzcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvYWNjZXNzLWNvbnRyb2wudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2FuYWx5dGljcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvYXBpa2V5LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9jb21tb24udHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2Vudmlyb25tZW50LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9mYWNldHMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2luZGV4LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9pbnRlZ3JhdGlvbnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2ludGVyYWN0aW9uLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9qc29uLXNjaGVtYS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvbWV0ZXJzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9wYXlsb2FkLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9wbHVnaW4udHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3Byb2plY3QudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3Byb21wdC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvcXVlcnkudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3JlZnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3J1bnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL2FjdGl2aXR5LWNhdGFsb2cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL2FnZW50LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9zdG9yZS9jb2xsZWN0aW9ucy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvY29tbW9uLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9zdG9yZS9kb2MtYW5hbHl6ZXIudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL2RzbC13b3JrZmxvdy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvaW5kZXgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL29iamVjdC10eXBlcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvc2lnbmFscy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvc3RvcmUudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL3RlbXBvcmFsaW8udHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL3dvcmtmbG93LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy90ZW5hbnQudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3RyYWluaW5nLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy90cmFuc2llbnQtdG9rZW5zLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy91c2VyLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9hdXRoLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9zY2hlbWFzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL2RzbC9jb25kaXRpb25zLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL2RzbC9kc2wtd29ya2Zsb3cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvZHNsL2RzbFByb3h5QWN0aXZpdGllcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L3NyYy9kc2wvdmFycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L3NyYy9kc2wvd2Fsay50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L3NyYy9lcnJvcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvaXRlcmF0aXZlLWdlbmVyYXRpb24vaXRlcmF0aXZlR2VuZXJhdGlvbldvcmtmbG93LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL2l0ZXJhdGl2ZS1nZW5lcmF0aW9uL3R5cGVzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL3N5c3RlbS9ub3RpZnlXZWJob29rV29ya2Zsb3cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvc3lzdGVtL3JlY2FsY3VsYXRlRW1iZWRkaW5nc1dvcmtmbG93LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL3dvcmtmbG93cy50cyIsImlnbm9yZWR8L1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX2ZhaWx1cmVfY29udmVydGVyIiwiaWdub3JlZHwvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9saWJ8X190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXIiLCJ3ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0IiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvbGliL2VzbS93b3JrZmxvd3MtYXV0b2dlbmVyYXRlZC1lbnRyeXBvaW50LmNqcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9vcHRpb25zL2JlZHJvY2suanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wdGlvbnMvZmFsbGJhY2suanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wdGlvbnMvZ3JvcS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3B0aW9ucy9vcGVuYWkuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29wdGlvbnMvdmVydGV4YWkuanNcIjtcbiIsImltcG9ydCB7IE1vZGVsT3B0aW9uc0luZm8sIE1vZGVsT3B0aW9ucywgT3B0aW9uVHlwZSwgTW9kZWxPcHRpb25JbmZvSXRlbSB9IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdGV4dE9wdGlvbnNGYWxsYmFjayB9IGZyb20gXCIuL2ZhbGxiYWNrLmpzXCI7XG5cbi8vIFVuaW9uIHR5cGUgb2YgYWxsIEJlZHJvY2sgb3B0aW9uc1xuZXhwb3J0IHR5cGUgQmVkcm9ja09wdGlvbnMgPSBOb3ZhQ2FudmFzT3B0aW9ucyB8IEJhc2VDb252ZXJzZU9wdGlvbnMgfCBCZWRyb2NrQ2xhdWRlT3B0aW9ucyB8IEJlZHJvY2tQYWxteXJhT3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBOb3ZhQ2FudmFzT3B0aW9ucyB7XG4gICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLW5vdmEtY2FudmFzXCJcbiAgICB0YXNrVHlwZTogXCJURVhUX0lNQUdFXCIgfCBcIlRFWFRfSU1BR0VfV0lUSF9JTUFHRV9DT05ESVRJT05JTkdcIiB8IFwiQ09MT1JfR1VJREVEX0dFTkVSQVRJT05cIiB8IFwiSU1BR0VfVkFSSUFUSU9OXCIgfCBcIklOUEFJTlRJTkdcIiB8IFwiT1VUUEFJTlRJTkdcIiB8IFwiQkFDS0dST1VORF9SRU1PVkFMXCI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHF1YWxpdHk/OiBcInN0YW5kYXJkXCIgfCBcInByZW1pdW1cIjtcbiAgICBjZmdTY2FsZT86IG51bWJlcjtcbiAgICBzZWVkPzogbnVtYmVyO1xuICAgIG51bWJlck9mSW1hZ2VzPzogbnVtYmVyO1xuICAgIGNvbnRyb2xNb2RlPzogXCJDQU5OWV9FREdFXCIgfCBcIlNFR01FTlRBVElPTlwiO1xuICAgIGNvbnRyb2xTdHJlbmd0aD86IG51bWJlcjtcbiAgICBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgICBzaW1pbGFyaXR5U3RyZW5ndGg/OiBudW1iZXI7XG4gICAgb3V0UGFpbnRpbmdNb2RlPzogXCJERUZBVUxUXCIgfCBcIlBSRUNJU0VcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29udmVyc2VPcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stY29udmVyc2VcIiB8IFwiYmVkcm9jay1jbGF1ZGVcIiB8IFwiYmVkcm9jay1ub3ZhXCIgfCBcImJlZHJvY2stbWlzdHJhbFwiIHwgXCJiZWRyb2NrLWFpMjFcIiB8IFwiYmVkcm9jay1jb2hlcmUtY29tbWFuZFwiIHwgXCJiZWRyb2NrLXBhbG15cmFcIjtcbiAgICBtYXhfdG9rZW5zPzogbnVtYmVyO1xuICAgIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICAgIHRvcF9wPzogbnVtYmVyO1xuICAgIHN0b3Bfc2VxdWVuY2U/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCZWRyb2NrQ2xhdWRlT3B0aW9ucyBleHRlbmRzIEJhc2VDb252ZXJzZU9wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1jbGF1ZGVcIjtcbiAgICB0b3Bfaz86IG51bWJlcjtcbiAgICB0aGlua2luZ19tb2RlPzogYm9vbGVhbjtcbiAgICB0aGlua2luZ19idWRnZXRfdG9rZW5zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJlZHJvY2tQYWxteXJhT3B0aW9ucyBleHRlbmRzIEJhc2VDb252ZXJzZU9wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1wYWxteXJhXCI7XG4gICAgbWluX3Rva2Vucz86IG51bWJlcjtcbiAgICBzZWVkPzogbnVtYmVyO1xuICAgIGZyZXF1ZW5jeV9wZW5hbHR5PzogbnVtYmVyO1xuICAgIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXhUb2tlbnNMaW1pdChtb2RlbDogc3RyaW5nLCBvcHRpb24/OiBNb2RlbE9wdGlvbnMpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIC8vIENsYXVkZSBtb2RlbHNcbiAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJjbGF1ZGVcIikpIHtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiLTQtXCIpKSB7XG4gICAgICAgICAgICBpZihtb2RlbC5pbmNsdWRlcyhcIm9wdXMtXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMyNzY4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDY1NTM2O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiLTMtNy1cIikpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb24gJiYgKG9wdGlvbiBhcyBCZWRyb2NrQ2xhdWRlT3B0aW9ucyk/LnRoaW5raW5nX21vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTMxMDcyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gODE5MjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIi0zLTUtXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gODE5MjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiA0MDk2O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFtYXpvbiBtb2RlbHNcbiAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImFtYXpvblwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJ0aXRhblwiKSkge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibGl0ZVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA0MDk2O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImV4cHJlc3NcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gODE5MjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJwcmVtaWVyXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDMwNzI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIm5vdmFcIikpIHtcbiAgICAgICAgICAgIHJldHVybiAxMDAwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNaXN0cmFsIG1vZGVsc1xuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwibWlzdHJhbFwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCI4eDdiXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gNDA5NjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJwaXh0cmFsLWxhcmdlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gMTMxMDcyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiA4MTkyO1xuICAgIH1cbiAgICAvLyBBSTIxIG1vZGVsc1xuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiYWkyMVwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJqMlwiKSkge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibGFyZ2VcIikgfHwgbW9kZWwuaW5jbHVkZXMoXCJtaWRcIikgfHwgbW9kZWwuaW5jbHVkZXMoXCJ1bHRyYVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA4MTkxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDIwNDg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiamFtYmFcIikpIHtcbiAgICAgICAgICAgIHJldHVybiA0MDk2O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvaGVyZSBtb2RlbHNcbiAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImNvaGVyZS5jb21tYW5kXCIpKSB7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImNvbW1hbmQtYVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIDgxOTI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDQwOTY7ICAgXG4gICAgfVxuICAgIC8vIE1ldGEgbW9kZWxzXG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJsbGFtYVwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCIzLTcwYlwiKSB8fCBtb2RlbC5pbmNsdWRlcyhcIjMtOGJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiAyMDQ4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiA4MTkyO1xuICAgIH1cbiAgICAvL1dyaXRlciBtb2RlbHNcbiAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIndyaXRlclwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJwYWxteXJhLXg1XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gODE5MjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcInBhbG15cmEteDRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiA4MTkyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBmYWxsYmFja1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCZWRyb2NrT3B0aW9ucyhtb2RlbDogc3RyaW5nLCBvcHRpb24/OiBNb2RlbE9wdGlvbnMpOiBNb2RlbE9wdGlvbnNJbmZvIHtcbiAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJjYW52YXNcIikpIHtcbiAgICAgICAgY29uc3QgdGFza1R5cGVMaXN0OiBNb2RlbE9wdGlvbkluZm9JdGVtID0ge1xuICAgICAgICAgICAgbmFtZTogXCJ0YXNrVHlwZVwiLFxuICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5lbnVtLFxuICAgICAgICAgICAgZW51bToge1xuICAgICAgICAgICAgICAgIFwiVGV4dC1Uby1JbWFnZVwiOiBcIlRFWFRfSU1BR0VcIixcbiAgICAgICAgICAgICAgICBcIlRleHQtVG8tSW1hZ2Utd2l0aC1JbWFnZS1Db25kaXRpb25pbmdcIjogXCJURVhUX0lNQUdFX1dJVEhfSU1BR0VfQ09ORElUSU9OSU5HXCIsXG4gICAgICAgICAgICAgICAgXCJDb2xvci1HdWlkZWQtR2VuZXJhdGlvblwiOiBcIkNPTE9SX0dVSURFRF9HRU5FUkFUSU9OXCIsXG4gICAgICAgICAgICAgICAgXCJJbWFnZS1WYXJpYXRpb25cIjogXCJJTUFHRV9WQVJJQVRJT05cIixcbiAgICAgICAgICAgICAgICBcIklucGFpbnRpbmdcIjogXCJJTlBBSU5USU5HXCIsXG4gICAgICAgICAgICAgICAgXCJPdXRwYWludGluZ1wiOiBcIk9VVFBBSU5USU5HXCIsXG4gICAgICAgICAgICAgICAgXCJCYWNrZ3JvdW5kLVJlbW92YWxcIjogXCJCQUNLR1JPVU5EX1JFTU9WQUxcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWZhdWx0OiBcIlRFWFRfSU1BR0VcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSB0eXBlIG9mIHRhc2sgdG8gcGVyZm9ybVwiLFxuICAgICAgICAgICAgcmVmcmVzaDogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgb3RoZXJPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICB7IG5hbWU6IFwid2lkdGhcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDMyMCwgbWF4OiA0MDk2LCBkZWZhdWx0OiA1MTIsIHN0ZXA6IDE2LCBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgd2lkdGggb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiaGVpZ2h0XCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAzMjAsIG1heDogNDA5NiwgZGVmYXVsdDogNTEyLCBzdGVwOiAxNiwgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIGhlaWdodCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCIgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInF1YWxpdHlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLmVudW0sXG4gICAgICAgICAgICAgICAgZW51bTogeyBcInN0YW5kYXJkXCI6IFwic3RhbmRhcmRcIiwgXCJwcmVtaXVtXCI6IFwicHJlbWl1bVwiIH0sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogXCJzdGFuZGFyZFwiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBxdWFsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJjZmdTY2FsZVwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMS4xLCBtYXg6IDEwLjAsIGRlZmF1bHQ6IDYuNSwgc3RlcDogMC4xLCBpbnRlZ2VyOiBmYWxzZSwgZGVzY3JpcHRpb246IFwiVGhlIHNjYWxlIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIiB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcInNlZWRcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAsIG1heDogODU4OTkzNDU5LCBkZWZhdWx0OiAxMiwgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIHNlZWQgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwibnVtYmVyT2ZJbWFnZXNcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDEsIG1heDogNSwgZGVmYXVsdDogMSwgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIG51bWJlciBvZiBpbWFnZXMgdG8gZ2VuZXJhdGVcIiB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCBkZXBlbmRlbnRPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXTtcblxuICAgICAgICBzd2l0Y2ggKChvcHRpb24gYXMgTm92YUNhbnZhc09wdGlvbnMpPy50YXNrVHlwZSA/PyBcIlRFWFRfSU1BR0VcIikge1xuICAgICAgICAgICAgY2FzZSBcIlRFWFRfSU1BR0VfV0lUSF9JTUFHRV9DT05ESVRJT05JTkdcIjpcbiAgICAgICAgICAgICAgICBkZXBlbmRlbnRPcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiY29udHJvbE1vZGVcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiQ0FOTllfRURHRVwiOiBcIkNBTk5ZX0VER0VcIiwgXCJTRUdNRU5UQVRJT05cIjogXCJTRUdNRU5UQVRJT05cIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJDQU5OWV9FREdFXCIsIGRlc2NyaXB0aW9uOiBcIlRoZSBjb250cm9sIG1vZGUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJjb250cm9sU3RyZW5ndGhcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAsIG1heDogMSwgZGVmYXVsdDogMC43LCBkZXNjcmlwdGlvbjogXCJUaGUgY29udHJvbCBzdHJlbmd0aCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCIgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkNPTE9SX0dVSURFRF9HRU5FUkFUSU9OXCI6XG4gICAgICAgICAgICAgICAgZGVwZW5kZW50T3B0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IFwiY29sb3JzXCIsIHR5cGU6IE9wdGlvblR5cGUuc3RyaW5nX2xpc3QsIHZhbHVlOiBbXSwgZGVzY3JpcHRpb246IFwiSGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIHRvIGd1aWRlIGdlbmVyYXRpb25cIiB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJJTUFHRV9WQVJJQVRJT05cIjpcbiAgICAgICAgICAgICAgICBkZXBlbmRlbnRPcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJzaW1pbGFyaXR5U3RyZW5ndGhcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAuMiwgbWF4OiAxLCBkZWZhdWx0OiAwLjcsIGRlc2NyaXB0aW9uOiBcIlRoZSBzaW1pbGFyaXR5IHN0cmVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIiB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJJTlBBSU5USU5HXCI6XG4gICAgICAgICAgICAgICAgLy9ObyBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiT1VUUEFJTlRJTkdcIjpcbiAgICAgICAgICAgICAgICBkZXBlbmRlbnRPcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwib3V0UGFpbnRpbmdNb2RlXCIsIHR5cGU6IE9wdGlvblR5cGUuZW51bSwgZW51bTogeyBcIkRFRkFVTFRcIjogXCJERUZBVUxUXCIsIFwiUFJFQ0lTRVwiOiBcIlBSRUNJU0VcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsIGRlc2NyaXB0aW9uOiBcIlRoZSBvdXRwYWludGluZyBtb2RlIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJCQUNLR1JPVU5EX1JFTU9WQUxcIjpcbiAgICAgICAgICAgICAgICBkZXBlbmRlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgb3RoZXJPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLW5vdmEtY2FudmFzXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgdGFza1R5cGVMaXN0LFxuICAgICAgICAgICAgICAgIC4uLm90aGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAuLi5kZXBlbmRlbnRPcHRpb25zLFxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1heF90b2tlbnNfbGltaXQgPSBnZXRNYXhUb2tlbnNMaW1pdChtb2RlbCwgb3B0aW9uKTtcbiAgICAgICAgLy9Ob3QgY2FudmFzLCBpLmUgbm9ybWFsIEFXUyBiZWRyb2NrIGNvbnZlcnNlXG4gICAgICAgIGNvbnN0IGJhc2VDb252ZXJzZU9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIm1heF90b2tlbnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgIG1heDogbWF4X3Rva2Vuc19saW1pdCxcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN0ZXA6IDIwMCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIGdlbmVyYXRlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwidGVtcGVyYXR1cmVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgbWluOiAwLjAsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogMC43LFxuICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBIGhpZ2hlciB0ZW1wZXJhdHVyZSBiaWFzZXMgdG93YXJkIGxlc3MgbGlrZWx5IHRva2VucywgbWFraW5nIHRoZSBtb2RlbCBtb3JlIGNyZWF0aXZlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ0b3BfcFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgb2YgdGhlIHRvcCBwIHRva2Vuc1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic3RvcF9zZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUuc3RyaW5nX2xpc3QsXG4gICAgICAgICAgICAgICAgdmFsdWU6IFtdLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBnZW5lcmF0aW9uIHdpbGwgaGFsdCBpZiBvbmUgb2YgdGhlIHN0b3Agc2VxdWVuY2VzIGlzIG91dHB1dFwiXG4gICAgICAgICAgICB9XTtcblxuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJjbGF1ZGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXVkZUNvbnZlcnNlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0b3Bfa1wiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTGltaXRzIHRva2VuIHNhbXBsaW5nIHRvIHRoZSB0b3AgayB0b2tlbnNcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiLTMtNy1cIikgfHwgbW9kZWwuaW5jbHVkZXMoXCItNC1cIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF1ZGVNb2RlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRoaW5raW5nX21vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUuYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiSWYgdHJ1ZSwgdXNlIHRoZSBleHRlbmRlZCByZWFzb25pbmcgbW9kZVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF1ZGVUaGlua2luZ09wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IChvcHRpb24gYXMgQmVkcm9ja0NsYXVkZU9wdGlvbnMpPy50aGlua2luZ19tb2RlID8gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRoaW5raW5nX2J1ZGdldF90b2tlbnNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogMTAyNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDQwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogMTAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRhcmdldCBudW1iZXIgb2YgdG9rZW5zIHRvIHVzZSBmb3IgcmVhc29uaW5nLCBub3QgYSBoYXJkIGxpbWl0LlwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSA6IFtdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLWNsYXVkZVwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlQ29udmVyc2VPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2xhdWRlQ29udmVyc2VPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY2xhdWRlTW9kZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jbGF1ZGVUaGlua2luZ09wdGlvbnNdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stY2xhdWRlXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogWy4uLmJhc2VDb252ZXJzZU9wdGlvbnMsIC4uLmNsYXVkZUNvbnZlcnNlT3B0aW9uc11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImFtYXpvblwiKSkge1xuICAgICAgICAgICAgLy9UaXRhbiBtb2RlbHMgYWxzbyBleGlzdHMgYnV0IGRvZXMgbm90IHN1cHBvcnQgYW55IGFkZGl0aW9uYWwgb3B0aW9uc1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibm92YVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vdmFDb252ZXJzZU9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0b3Bfa1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIHRvcCBrIHRva2Vuc1wiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stbm92YVwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbLi4uYmFzZUNvbnZlcnNlT3B0aW9ucywgLi4ubm92YUNvbnZlcnNlT3B0aW9uc11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJtaXN0cmFsXCIpKSB7XG4gICAgICAgICAgICAvLzdiIGFuZCA4eDdiIGluc3RydWN0XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCI3YlwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pc3RyYWxDb252ZXJzZU9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0b3Bfa1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIHRvcCBrIHRva2Vuc1wiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stbWlzdHJhbFwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbLi4uYmFzZUNvbnZlcnNlT3B0aW9ucywgLi4ubWlzdHJhbENvbnZlcnNlT3B0aW9uc11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL090aGVyIG1vZGVscyBzdWNoIGFzIE1pc3RyYWwgU21hbGwsIExhcmdlIGFuZCBMYXJnZSAyXG4gICAgICAgICAgICAvL1N1cHBvcnQgbm8gYWRkaXRpb25hbCBvcHRpb25zXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJhaTIxXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBhaTIxQ29udmVyc2VPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInByZXNlbmNlX3BlbmFsdHlcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgcHJlc2VuY2UgcGVuYWx0eSBlbmNvdXJhZ2VzIHRoZSBtb2RlbCB0byB0YWxrIGFib3V0IG5ldyB0b3BpY3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImZyZXF1ZW5jeV9wZW5hbHR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAtMixcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAyLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgICAgICAgICAgICBzdGVwOiAwLjEsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIGZyZXF1ZW5jeSBwZW5hbHR5IGVuY291cmFnZXMgdGhlIG1vZGVsIHRvIHVzZSBsZXNzIGNvbW1vbiB3b3Jkc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLWFpMjFcIixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbLi4uYmFzZUNvbnZlcnNlT3B0aW9ucywgLi4uYWkyMUNvbnZlcnNlT3B0aW9uc11cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImNvaGVyZS5jb21tYW5kXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2hlcmVDb21tYW5kT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0b3Bfa1wiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTGltaXRzIHRva2VuIHNhbXBsaW5nIHRvIHRoZSB0b3AgayB0b2tlbnNcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiY29tbWFuZC1yXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29oZXJlQ29tbWFuZFJPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZnJlcXVlbmN5X3BlbmFsdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogLTIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogMC4xLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgZnJlcXVlbmN5IHBlbmFsdHkgZW5jb3VyYWdlcyB0aGUgbW9kZWwgdG8gdXNlIGxlc3MgY29tbW9uIHdvcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJwcmVzZW5jZV9wZW5hbHR5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIHByZXNlbmNlIHBlbmFsdHkgZW5jb3VyYWdlcyB0aGUgbW9kZWwgdG8gdGFsayBhYm91dCBuZXcgdG9waWNzXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1jb2hlcmUtY29tbWFuZFwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBbLi4uYmFzZUNvbnZlcnNlT3B0aW9ucywgLi4uY29oZXJlQ29tbWFuZE9wdGlvbnMsIC4uLmNvaGVyZUNvbW1hbmRST3B0aW9uc11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJ3cml0ZXJcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhbG15cmFDb252ZXJzZU9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibWluX3Rva2Vuc1wiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBtYXhfdG9rZW5zX2xpbWl0LFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMTAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInNlZWRcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJSYW5kb20gc2VlZCBmb3IgZ2VuZXJhdGlvblwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZnJlcXVlbmN5X3BlbmFsdHlcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgZnJlcXVlbmN5IHBlbmFsdHkgZW5jb3VyYWdlcyB0aGUgbW9kZWwgdG8gdXNlIGxlc3MgY29tbW9uIHdvcmRzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJwcmVzZW5jZV9wZW5hbHR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAtMixcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAyLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgICAgICAgICAgICBzdGVwOiAwLjEsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIHByZXNlbmNlIHBlbmFsdHkgZW5jb3VyYWdlcyB0aGUgbW9kZWwgdG8gdGFsayBhYm91dCBuZXcgdG9waWNzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stcGFsbXlyYVwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsuLi5iYXNlQ29udmVyc2VPcHRpb25zLCAuLi5wYWxteXJhQ29udmVyc2VPcHRpb25zXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9GYWxsYmFjayB0byBjb252ZXJzZSBzdGFuZGFyZC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1jb252ZXJzZVwiLFxuICAgICAgICAgICAgb3B0aW9uczogYmFzZUNvbnZlcnNlT3B0aW9uc1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE9wdGlvbnNGYWxsYmFjaztcbn0iLCJpbXBvcnQgeyBNb2RlbE9wdGlvbnNJbmZvLCBPcHRpb25UeXBlLCBTaGFyZWRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEZhbGxiYWNrT3B0aW9ucyB7XG4gICAgX29wdGlvbl9pZDogXCJ0ZXh0LWZhbGxiYWNrXCI7ICAgIC8vRm9yIHNwZWNpZmljIG1vZGVscyBzaG91bGQgYmUgZm9ybWF0IGFzIFwicHJvdmlkZXItbW9kZWxcIlxuICAgIG1heF90b2tlbnM/OiBudW1iZXI7XG4gICAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gICAgdG9wX3A/OiBudW1iZXI7XG4gICAgdG9wX2s/OiBudW1iZXI7XG4gICAgcHJlc2VuY2VfcGVuYWx0eT86IG51bWJlcjtcbiAgICBmcmVxdWVuY3lfcGVuYWx0eT86IG51bWJlcjtcbiAgICBzdG9wX3NlcXVlbmNlPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0T3B0aW9uc0ZhbGxiYWNrOiBNb2RlbE9wdGlvbnNJbmZvID0ge1xuICAgIF9vcHRpb25faWQ6IFwidGV4dC1mYWxsYmFja1wiLFxuICAgIG9wdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5tYXhfdG9rZW5zLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSxcbiAgICAgICAgICAgIGludGVnZXI6IHRydWUsIHN0ZXA6IDIwMCwgZGVzY3JpcHRpb246IFwiVGhlIG1heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byBnZW5lcmF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMudGVtcGVyYXR1cmUsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLjAsIGRlZmF1bHQ6IDAuNyxcbiAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIHRlbXBlcmF0dXJlIGJpYXNlcyB0b3dhcmQgbGVzcyBsaWtlbHkgdG9rZW5zLCBtYWtpbmcgdGhlIG1vZGVsIG1vcmUgY3JlYXRpdmVcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLnRvcF9wLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiTGltaXRzIHRva2VuIHNhbXBsaW5nIHRvIHRoZSBjdW11bGF0aXZlIHByb2JhYmlsaXR5IG9mIHRoZSB0b3AgcCB0b2tlbnNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLnRvcF9rLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSxcbiAgICAgICAgICAgIGludGVnZXI6IHRydWUsIHN0ZXA6IDEsIGRlc2NyaXB0aW9uOiBcIkxpbWl0cyB0b2tlbiBzYW1wbGluZyB0byB0aGUgdG9wIGsgdG9rZW5zXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5wcmVzZW5jZV9wZW5hbHR5LCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogLTIuMCwgbWF4OiAyLjAsXG4gICAgICAgICAgICBpbnRlZ2VyOiBmYWxzZSwgc3RlcDogMC4xLCBkZXNjcmlwdGlvbjogXCJQZW5hbGlzZSB0b2tlbnMgaWYgdGhleSBhcHBlYXIgYXQgbGVhc3Qgb25jZSBpbiB0aGUgdGV4dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMuZnJlcXVlbmN5X3BlbmFsdHksIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAtMi4wLCBtYXg6IDIuMCxcbiAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIlBlbmFsaXNlIHRva2VucyBiYXNlZCBvbiB0aGVpciBmcmVxdWVuY3kgaW4gdGhlIHRleHRcIlxuICAgICAgICB9LFxuICAgICAgICB7IG5hbWU6IFNoYXJlZE9wdGlvbnMuc3RvcF9zZXF1ZW5jZSwgdHlwZTogT3B0aW9uVHlwZS5zdHJpbmdfbGlzdCwgdmFsdWU6IFtdLCBkZXNjcmlwdGlvbjogXCJUaGUgZ2VuZXJhdGlvbiB3aWxsIGhhbHQgaWYgb25lIG9mIHRoZSBzdG9wIHNlcXVlbmNlcyBpcyBvdXRwdXRcIiB9LFxuICAgIF1cbn07XG4iLCJpbXBvcnQgeyBNb2RlbE9wdGlvbnNJbmZvLCBNb2RlbE9wdGlvbkluZm9JdGVtLCBNb2RlbE9wdGlvbnMsIE9wdGlvblR5cGUsIFNoYXJlZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IHRleHRPcHRpb25zRmFsbGJhY2sgfSBmcm9tIFwiLi9mYWxsYmFjay5qc1wiO1xuXG4vLyBVbmlvbiB0eXBlIG9mIGFsbCBCZWRyb2NrIG9wdGlvbnNcbmV4cG9ydCB0eXBlIEdyb3FPcHRpb25zID0gR3JvcURlZXBzZWVrVGhpbmtpbmdPcHRpb25zO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3FEZWVwc2Vla1RoaW5raW5nT3B0aW9ucyB7XG4gICAgX29wdGlvbl9pZDogXCJncm9xLWRlZXBzZWVrLXRoaW5raW5nXCIsXG4gICAgbWF4X3Rva2Vucz86IG51bWJlcixcbiAgICB0ZW1wZXJhdHVyZT86IG51bWJlcixcbiAgICB0b3BfcD86IG51bWJlcixcbiAgICBzdG9wX3NlcXVlbmNlPzogc3RyaW5nW10sXG4gICAgcmVhc29uaW5nX2Zvcm1hdDogJ3BhcnNlZCcgfCAncmF3JyB8ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JvcU9wdGlvbnMobW9kZWw6IHN0cmluZywgX29wdGlvbj86IE1vZGVsT3B0aW9ucyk6IE1vZGVsT3B0aW9uc0luZm8ge1xuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImRlZXBzZWVrXCIpICYmIG1vZGVsLmluY2x1ZGVzKFwicjFcIikpIHtcbiAgICAgICAgY29uc3QgY29tbW9uT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMubWF4X3Rva2VucywgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDEsIG1heDogMTMxMDcyLFxuICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZ2VuZXJhdGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy50ZW1wZXJhdHVyZSwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAuMCwgZGVmYXVsdDogMC43LCBtYXg6IDIuMCxcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiBmYWxzZSwgc3RlcDogMC4xLCBkZXNjcmlwdGlvbjogXCJBIGhpZ2hlciB0ZW1wZXJhdHVyZSBiaWFzZXMgdG93YXJkIGxlc3MgbGlrZWx5IHRva2VucywgbWFraW5nIHRoZSBtb2RlbCBtb3JlIGNyZWF0aXZlLiBBIGxvd2VyIHRlbXBlcmF0dXJlIHRoYW4gb3RoZXIgbW9kZWxzIGlzIHJlY29tbWVuZGVkIGZvciBkZWVwc2VlayBSMSwgMC4zLTAuNyBhcHByb3hpbWF0ZWx5LlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLnRvcF9wLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIkxpbWl0cyB0b2tlbiBzYW1wbGluZyB0byB0aGUgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBvZiB0aGUgdG9wIHAgdG9rZW5zXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMuc3RvcF9zZXF1ZW5jZSwgdHlwZTogT3B0aW9uVHlwZS5zdHJpbmdfbGlzdCwgdmFsdWU6IFtdLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBnZW5lcmF0aW9uIHdpbGwgaGFsdCBpZiBvbmUgb2YgdGhlIHN0b3Agc2VxdWVuY2VzIGlzIG91dHB1dFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInJlYXNvbmluZ19mb3JtYXRcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiUGFyc2VkXCI6IFwicGFyc2VkXCIsIFwiUmF3XCI6IFwicmF3XCIsIFwiSGlkZGVuXCI6IFwiaGlkZGVuXCIgfSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBcInBhcnNlZFwiLCBkZXNjcmlwdGlvbjogXCJDb250cm9scyBob3cgdGhlIHJlYXNvbmluZyBpcyByZXR1cm5lZC5cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiZ3JvcS1kZWVwc2Vlay10aGlua2luZ1wiLFxuICAgICAgICAgICAgb3B0aW9uczogY29tbW9uT3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHRPcHRpb25zRmFsbGJhY2s7XG59IiwiaW1wb3J0IHsgTW9kZWxPcHRpb25zSW5mbywgTW9kZWxPcHRpb25JbmZvSXRlbSwgTW9kZWxPcHRpb25zLCBPcHRpb25UeXBlLCBTaGFyZWRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyB0ZXh0T3B0aW9uc0ZhbGxiYWNrIH0gZnJvbSBcIi4vZmFsbGJhY2suanNcIjtcblxuLy8gVW5pb24gdHlwZSBvZiBhbGwgQmVkcm9jayBvcHRpb25zXG5leHBvcnQgdHlwZSBPcGVuQWlPcHRpb25zID0gT3BlbkFpVGhpbmtpbmdPcHRpb25zIHwgT3BlbkFpVGV4dE9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFpVGhpbmtpbmdPcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcIm9wZW5haS10aGlua2luZ1wiLFxuICAgIG1heF90b2tlbnM/OiBudW1iZXIsXG4gICAgc3RvcF9zZXF1ZW5jZT86IHN0cmluZ1tdLFxuICAgIHJlYXNvbmluZ19lZmZvcnQ/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiLFxuICAgIGltYWdlX2RldGFpbD86IFwibG93XCIgfCBcImhpZ2hcIiB8IFwiYXV0b1wiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BaVRleHRPcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcIm9wZW5haS10ZXh0XCIsXG4gICAgbWF4X3Rva2Vucz86IG51bWJlcixcbiAgICB0ZW1wZXJhdHVyZT86IG51bWJlcixcbiAgICB0b3BfcD86IG51bWJlcixcbiAgICBwcmVzZW5jZV9wZW5hbHR5PzogbnVtYmVyLFxuICAgIGZyZXF1ZW5jeV9wZW5hbHR5PzogbnVtYmVyLFxuICAgIHN0b3Bfc2VxdWVuY2U/OiBzdHJpbmdbXSxcbiAgICBpbWFnZV9kZXRhaWw/OiBcImxvd1wiIHwgXCJoaWdoXCIgfCBcImF1dG9cIixcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZW5BaU9wdGlvbnMobW9kZWw6IHN0cmluZywgX29wdGlvbj86IE1vZGVsT3B0aW9ucyk6IE1vZGVsT3B0aW9uc0luZm8ge1xuICAgIGNvbnN0IHZpc2lvbk9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IGlzVmlzaW9uTW9kZWwobW9kZWwpID8gW1xuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImltYWdlX2RldGFpbFwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJMb3dcIjogXCJsb3dcIiwgXCJIaWdoXCI6IFwiaGlnaFwiLCBcIkF1dG9cIjogXCJhdXRvXCIgfSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IFwiYXV0b1wiLCBkZXNjcmlwdGlvbjogXCJDb250cm9scyBob3cgdGhlIG1vZGVsIHByb2Nlc3NlcyBhbiBpbnB1dCBpbWFnZS5cIlxuICAgICAgICB9LFxuICAgIF0gOiBbXTtcblxuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcIm8xXCIpIHx8IG1vZGVsLmluY2x1ZGVzKFwibzNcIikpIHtcbiAgICAgICAgLy9JcyB0aGlua2luZyB0ZXh0IG1vZGVsXG4gICAgICAgIGxldCBtYXhfdG9rZW5zX2xpbWl0ID0gNDA5NjtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibzFcIikpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcInByZXZpZXdcIikpIHtcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gMzI3Njg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIm1pbmlcIikpIHtcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gNjU1MzY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gMTAwMDAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwibzNcIikpIHtcbiAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSAxMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tb25PcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5tYXhfdG9rZW5zLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiBtYXhfdG9rZW5zX2xpbWl0LFxuICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZ2VuZXJhdGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5zdG9wX3NlcXVlbmNlLCB0eXBlOiBPcHRpb25UeXBlLnN0cmluZ19saXN0LCB2YWx1ZTogW10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHN0b3Agc2VxdWVuY2Ugb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCByZWFzb25pbmdPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBtb2RlbC5pbmNsdWRlcyhcIm8zXCIpIHx8IGlzTzFGdWxsKG1vZGVsKSA/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInJlYXNvbmluZ19lZmZvcnRcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiTG93XCI6IFwibG93XCIsIFwiTWVkaXVtXCI6IFwibWVkaXVtXCIsIFwiSGlnaFwiOiBcImhpZ2hcIiB9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwibWVkaXVtXCIsIGRlc2NyaXB0aW9uOiBcIkhvdyBtdWNoIGVmZm9ydCB0aGUgbW9kZWwgc2hvdWxkIHB1dCBpbnRvIHJlYXNvbmluZywgbG93ZXIgdmFsdWVzIHJlc3VsdCBpbiBmYXN0ZXIgcmVzcG9uc2VzIGFuZCBsZXNzIHRva2VucyB1c2VkLlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICBdIDogW107XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9vcHRpb25faWQ6IFwib3BlbmFpLXRoaW5raW5nXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgLi4uY29tbW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAuLi5yZWFzb25pbmdPcHRpb25zLFxuICAgICAgICAgICAgICAgIC4uLnZpc2lvbk9wdGlvbnMsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXhfdG9rZW5zX2xpbWl0ID0gNDA5NjtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiZ3B0LTRvXCIpKSB7XG4gICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gMTYzODQ7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJncHQtNG8tMjAyNC0wNS0xM1wiKSB8fCBtb2RlbC5pbmNsdWRlcyhcInJlYWx0aW1lXCIpKSB7XG4gICAgICAgICAgICAgICAgbWF4X3Rva2Vuc19saW1pdCA9IDQwOTY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJncHQtNFwiKSkge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwidHVyYm9cIikpIHtcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gNDA5NjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWF4X3Rva2Vuc19saW1pdCA9IDgxOTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJncHQtMy01XCIpKSB7XG4gICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gNDA5NjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vSXMgbm9uLXRoaW5raW5nIHRleHQgbW9kZWxcbiAgICAgICAgY29uc3QgY29tbW9uT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMubWF4X3Rva2VucywgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDEsIG1heDogbWF4X3Rva2Vuc19saW1pdCxcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBzdGVwOiAyMDAsIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZ2VuZXJhdGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ0ZW1wZXJhdHVyZVwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMC4wLCBtYXg6IDIuMCwgZGVmYXVsdDogMC43LFxuICAgICAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIHRlbXBlcmF0dXJlIGJpYXNlcyB0b3dhcmQgbGVzcyBsaWtlbHkgdG9rZW5zLCBtYWtpbmcgdGhlIG1vZGVsIG1vcmUgY3JlYXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInRvcF9wXCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLCBtYXg6IDEsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiTGltaXRzIHRva2VuIHNhbXBsaW5nIHRvIHRoZSBjdW11bGF0aXZlIHByb2JhYmlsaXR5IG9mIHRoZSB0b3AgcCB0b2tlbnNcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInByZXNlbmNlX3BlbmFsdHlcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IC0yLjAsIG1heDogMi4wLFxuICAgICAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIlBlbmFsaXNlIHRva2VucyBpZiB0aGV5IGFwcGVhciBhdCBsZWFzdCBvbmNlIGluIHRoZSB0ZXh0XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJmcmVxdWVuY3lfcGVuYWx0eVwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogLTIuMCwgbWF4OiAyLjAsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiUGVuYWxpc2UgdG9rZW5zIGJhc2VkIG9uIHRoZWlyIGZyZXF1ZW5jeSBpbiB0aGUgdGV4dFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMuc3RvcF9zZXF1ZW5jZSwgdHlwZTogT3B0aW9uVHlwZS5zdHJpbmdfbGlzdCwgdmFsdWU6IFtdLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBnZW5lcmF0aW9uIHdpbGwgaGFsdCBpZiBvbmUgb2YgdGhlIHN0b3Agc2VxdWVuY2VzIGlzIG91dHB1dFwiLFxuICAgICAgICAgICAgfVxuICAgICAgICBdXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9vcHRpb25faWQ6IFwib3BlbmFpLXRleHRcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgIC4uLnZpc2lvbk9wdGlvbnMsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZXh0T3B0aW9uc0ZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBpc08xRnVsbChtb2RlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibzFcIikpIHtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibWluaVwiKSB8fCBtb2RlbC5pbmNsdWRlcyhcInByZXZpZXdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1Zpc2lvbk1vZGVsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbW9kZWwuaW5jbHVkZXMoXCJncHQtNG9cIikgfHwgaXNPMUZ1bGwobW9kZWwpIHx8IG1vZGVsLmluY2x1ZGVzKFwiZ3B0LTQtdHVyYm9cIik7XG59IiwiaW1wb3J0IHsgTW9kZWxPcHRpb25zSW5mbywgTW9kZWxPcHRpb25JbmZvSXRlbSwgT3B0aW9uVHlwZSwgU2hhcmVkT3B0aW9ucywgTW9kZWxPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyB0ZXh0T3B0aW9uc0ZhbGxiYWNrIH0gZnJvbSBcIi4vZmFsbGJhY2suanNcIjtcblxuLy8gVW5pb24gdHlwZSBvZiBhbGwgQmVkcm9jayBvcHRpb25zXG5leHBvcnQgdHlwZSBWZXJ0ZXhBSU9wdGlvbnMgPSBJbWFnZW5PcHRpb25zIHwgVmVydGV4QUlDbGF1ZGVPcHRpb25zO1xuXG5leHBvcnQgZW51bSBJbWFnZW5UYXNrVHlwZSB7XG4gICAgVEVYVF9JTUFHRSA9IFwiVEVYVF9JTUFHRVwiLFxuICAgIEVESVRfTU9ERV9JTlBBSU5UX1JFTU9WQUwgPSBcIkVESVRfTU9ERV9JTlBBSU5UX1JFTU9WQUxcIixcbiAgICBFRElUX01PREVfSU5QQUlOVF9JTlNFUlRJT04gPSBcIkVESVRfTU9ERV9JTlBBSU5UX0lOU0VSVElPTlwiLFxuICAgIEVESVRfTU9ERV9CR1NXQVAgPSBcIkVESVRfTU9ERV9CR1NXQVBcIixcbiAgICBFRElUX01PREVfT1VUUEFJTlQgPSBcIkVESVRfTU9ERV9PVVRQQUlOVFwiLFxuICAgIENVU1RPTUlaQVRJT05fU1VCSkVDVCA9IFwiQ1VTVE9NSVpBVElPTl9TVUJKRUNUXCIsXG4gICAgQ1VTVE9NSVpBVElPTl9TVFlMRSA9IFwiQ1VTVE9NSVpBVElPTl9TVFlMRVwiLFxuICAgIENVU1RPTUlaQVRJT05fQ09OVFJPTExFRCA9IFwiQ1VTVE9NSVpBVElPTl9DT05UUk9MTEVEXCIsXG4gICAgQ1VTVE9NSVpBVElPTl9JTlNUUlVDVCA9IFwiQ1VTVE9NSVpBVElPTl9JTlNUUlVDVFwiLFxufVxuXG5leHBvcnQgZW51bSBJbWFnZW5NYXNrTW9kZSB7XG4gICAgTUFTS19NT0RFX1VTRVJfUFJPVklERUQgPSBcIk1BU0tfTU9ERV9VU0VSX1BST1ZJREVEXCIsXG4gICAgTUFTS19NT0RFX0JBQ0tHUk9VTkQgPSBcIk1BU0tfTU9ERV9CQUNLR1JPVU5EXCIsXG4gICAgTUFTS19NT0RFX0ZPUkVHUk9VTkQgPSBcIk1BU0tfTU9ERV9GT1JFR1JPVU5EXCIsXG4gICAgTUFTS19NT0RFX1NFTUFOVElDID0gXCJNQVNLX01PREVfU0VNQU5USUNcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZW5PcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcInZlcnRleGFpLWltYWdlblwiXG5cbiAgICAvL0dlbmVyYWwgYW5kIGdlbmVyYXRlIG9wdGlvbnNcbiAgICBudW1iZXJfb2ZfaW1hZ2VzPzogbnVtYmVyO1xuICAgIHNlZWQ/OiBudW1iZXI7XG4gICAgcGVyc29uX2dlbmVyYXRpb24/OiBcImRvbnRfYWxsb3dcIiB8IFwiYWxsb3dfYWR1bHRzXCIgfCBcImFsbG93X2FsbFwiO1xuICAgIHNhZmV0eV9zZXR0aW5nPzogXCJibG9ja19ub25lXCIgfCBcImJsb2NrX29ubHlfaGlnaFwiIHwgXCJibG9ja19tZWRpdW1fYW5kX2Fib3ZlXCIgfCBcImJsb2NrX2xvd19hbmRfYWJvdmVcIjsgLy9UaGUgXCJvZmZcIiBvcHRpb24gZG9lcyBub3Qgc2VlbSB0byB3b3JrIGZvciBJbWFnZW4gMywgbWlnaHQgYmUgb25seSBmb3IgdGV4dCBtb2RlbHNcbiAgICBpbWFnZV9maWxlX3R5cGU/OiBcImltYWdlL2pwZWdcIiB8IFwiaW1hZ2UvcG5nXCI7XG4gICAganBlZ19jb21wcmVzc2lvbl9xdWFsaXR5PzogbnVtYmVyO1xuICAgIGFzcGVjdF9yYXRpbz86IFwiMToxXCIgfCBcIjQ6M1wiIHwgXCIzOjRcIiB8IFwiMTY6OVwiIHwgXCI5OjE2XCI7XG4gICAgYWRkX3dhdGVybWFyaz86IGJvb2xlYW47XG4gICAgZW5oYW5jZV9wcm9tcHQ/OiBib29sZWFuO1xuXG4gICAgLy9DYXBhYmlsaXR5IG9wdGlvbnNcbiAgICBlZGl0X21vZGU/OiBJbWFnZW5UYXNrVHlwZVxuICAgIGd1aWRhbmNlX3NjYWxlPzogbnVtYmVyO1xuICAgIGVkaXRfc3RlcHM/OiBudW1iZXI7XG4gICAgbWFza19tb2RlPzogSW1hZ2VuTWFza01vZGU7XG4gICAgbWFza19kaWxhdGlvbj86IG51bWJlcjtcbiAgICBtYXNrX2NsYXNzPzogbnVtYmVyW107XG5cbiAgICAvL0N1c3RvbWl6YXRpb24gb3B0aW9uc1xuICAgIGNvbnRyb2xUeXBlOiBcIkNPTlRST0xfVFlQRV9GQUNFX01FU0hcIiB8IFwiQ09OVFJPTF9UWVBFX0NBTk5ZXCIgfCBcIkNPTlRST0xfVFlQRV9TQ1JJQkJMRVwiO1xuICAgIGNvbnRyb2xJbWFnZUNvbXB1dGF0aW9uPzogYm9vbGVhbjtcbiAgICBzdWJqZWN0VHlwZTogXCJTVUJKRUNUX1RZUEVfUEVSU09OXCIgfCBcIlNVQkpFQ1RfVFlQRV9BTklNQUxcIiB8IFwiU1VCSkVDVF9UWVBFX1BST0RVQ1RcIiB8IFwiU1VCSkVDVF9UWVBFX0RFRkFVTFRcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJ0ZXhBSUNsYXVkZU9wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwidmVydGV4YWktY2xhdWRlXCJcbiAgICBtYXhfdG9rZW5zPzogbnVtYmVyO1xuICAgIHRlbXBlcmF0dXJlPzogbnVtYmVyO1xuICAgIHRvcF9wPzogbnVtYmVyO1xuICAgIHRvcF9rPzogbnVtYmVyO1xuICAgIHN0b3Bfc2VxdWVuY2U/OiBzdHJpbmdbXTtcbiAgICB0aGlua2luZ19tb2RlPzogYm9vbGVhbjtcbiAgICB0aGlua2luZ19idWRnZXRfdG9rZW5zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmVydGV4QWlPcHRpb25zKG1vZGVsOiBzdHJpbmcsIG9wdGlvbj86IE1vZGVsT3B0aW9ucyk6IE1vZGVsT3B0aW9uc0luZm8ge1xuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImltYWdlbi0zLjBcIikpIHtcbiAgICAgICAgY29uc3QgY29tbW9uT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMubnVtYmVyX29mX2ltYWdlcywgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDEsIG1heDogNCwgZGVmYXVsdDogMSxcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJOdW1iZXIgb2YgSW1hZ2VzIHRvIGdlbmVyYXRlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMuc2VlZCwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAsIG1heDogNDI5NDk2NzI5NSwgZGVmYXVsdDogMTIsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIHNlZWQgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicGVyc29uX2dlbmVyYXRpb25cIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiRGlzYWxsb3cgdGhlIGluY2x1c2lvbiBvZiBwZW9wbGUgb3IgZmFjZXMgaW4gaW1hZ2VzXCI6IFwiZG9udF9hbGxvd1wiLCBcIkFsbG93IGdlbmVyYXRpb24gb2YgYWR1bHRzIG9ubHlcIjogXCJhbGxvd19hZHVsdFwiLCBcIkFsbG93IGdlbmVyYXRpb24gb2YgcGVvcGxlIG9mIGFsbCBhZ2VzXCI6IFwiYWxsb3dfYWxsXCIgfSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBcImFsbG93X2FkdWx0XCIsIGRlc2NyaXB0aW9uOiBcIlRoZSBzYWZldHkgc2V0dGluZyBmb3IgYWxsb3dpbmcgdGhlIGdlbmVyYXRpb24gb2YgcGVvcGxlIGluIHRoZSBpbWFnZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwic2FmZXR5X3NldHRpbmdcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiQmxvY2sgdmVyeSBmZXcgcHJvYmxlbWF0aWMgcHJvbXB0cyBhbmQgcmVzcG9uc2VzXCI6IFwiYmxvY2tfbm9uZVwiLCBcIkJsb2NrIG9ubHkgZmV3IHByb2JsZW1hdGljIHByb21wdHMgYW5kIHJlc3BvbnNlc1wiOiBcImJsb2NrX29ubHlfaGlnaFwiLCBcIkJsb2NrIHNvbWUgcHJvYmxlbWF0aWMgcHJvbXB0cyBhbmQgcmVzcG9uc2VzXCI6IFwiYmxvY2tfbWVkaXVtX2FuZF9hYm92ZVwiLCBcIlN0cmljdGVzdCBmaWx0ZXJpbmdcIjogXCJibG9ja19sb3dfYW5kX2Fib3ZlXCIgfSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBcImJsb2NrX21lZGl1bV9hbmRfYWJvdmVcIiwgZGVzY3JpcHRpb246IFwiVGhlIG92ZXJhbGwgc2FmZXR5IHNldHRpbmdcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuXG4gICAgICAgIGNvbnN0IG91dHB1dE9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImltYWdlX2ZpbGVfdHlwZVwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJKUEVHXCI6IFwiaW1hZ2UvanBlZ1wiLCBcIlBOR1wiOiBcImltYWdlL3BuZ1wiIH0sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogXCJpbWFnZS9wbmdcIiwgZGVzY3JpcHRpb246IFwiVGhlIGZpbGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCIsXG4gICAgICAgICAgICAgICAgcmVmcmVzaDogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF1cblxuICAgICAgICBjb25zdCBqcGVnUXVhbGl0eTogTW9kZWxPcHRpb25JbmZvSXRlbSA9IHtcbiAgICAgICAgICAgIG5hbWU6IFwianBlZ19jb21wcmVzc2lvbl9xdWFsaXR5XCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLCBtYXg6IDEwMCwgZGVmYXVsdDogNzUsXG4gICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgY29tcHJlc3Npb24gcXVhbGl0eSBvZiB0aGUgSlBFRyBpbWFnZVwiLFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChvcHRpb24gYXMgSW1hZ2VuT3B0aW9ucyk/LmltYWdlX2ZpbGVfdHlwZSA9PT0gXCJpbWFnZS9qcGVnXCIpIHtcbiAgICAgICAgICAgIG91dHB1dE9wdGlvbnMucHVzaChqcGVnUXVhbGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiZ2VuZXJhdGVcIikpIHtcbiAgICAgICAgICAgIC8vR2VuZXJhdGUgbW9kZWxzXG4gICAgICAgICAgICBjb25zdCBtb2RlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdXG4gICAgICAgICAgICAgICAgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiYXNwZWN0X3JhdGlvXCIsIHR5cGU6IE9wdGlvblR5cGUuZW51bSwgZW51bTogeyBcIjE6MVwiOiBcIjE6MVwiLCBcIjQ6M1wiOiBcIjQ6M1wiLCBcIjM6NFwiOiBcIjM6NFwiLCBcIjE2OjlcIjogXCIxNjo5XCIsIFwiOToxNlwiOiBcIjk6MTZcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCIxOjFcIiwgZGVzY3JpcHRpb246IFwiVGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJhZGRfd2F0ZXJtYXJrXCIsIHR5cGU6IE9wdGlvblR5cGUuYm9vbGVhbiwgZGVmYXVsdDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcIkFkZCBhbiBpbnZpc2libGUgd2F0ZXJtYXJrIHRvIHRoZSBnZW5lcmF0ZWQgaW1hZ2UsIHVzZWZ1bCBmb3IgZGV0ZWN0aW9uIG9mIEFJIGltYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBjb25zdCBlbmhhbmNlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gIW1vZGVsLmluY2x1ZGVzKFwiZ2VuZXJhdGUtMDAxXCIpID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJlbmhhbmNlX3Byb21wdFwiLCB0eXBlOiBPcHRpb25UeXBlLmJvb2xlYW4sIGRlZmF1bHQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlZlcnRleEFJIGF1dG9tYXRpY2FsbHkgcmV3cml0ZXMgdGhlIHByb21wdCB0byBiZXR0ZXIgcmVmbGVjdCB0aGUgcHJvbXB0J3MgaW50ZW50LlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0gOiBbXTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcInZlcnRleGFpLWltYWdlblwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tbW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4ubW9kZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLm91dHB1dE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLmVuaGFuY2VPcHRpb25zLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiY2FwYWJpbGl0eVwiKSkge1xuICAgICAgICAgICAgLy9FZGl0IG1vZGVsc1xuICAgICAgICAgICAgbGV0IGd1aWRhbmNlU2NhbGVEZWZhdWx0ID0gNzU7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbiBhcyBJbWFnZW5PcHRpb25zKT8uZWRpdF9tb2RlID09PSBJbWFnZW5UYXNrVHlwZS5FRElUX01PREVfSU5QQUlOVF9JTlNFUlRJT04pIHtcbiAgICAgICAgICAgICAgICBndWlkYW5jZVNjYWxlRGVmYXVsdCA9IDYwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtb2RlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJlZGl0X21vZGVcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLFxuICAgICAgICAgICAgICAgICAgICBlbnVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVESVRfTU9ERV9JTlBBSU5UX1JFTU9WQUxcIjogXCJFRElUX01PREVfSU5QQUlOVF9SRU1PVkFMXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVESVRfTU9ERV9JTlBBSU5UX0lOU0VSVElPTlwiOiBcIkVESVRfTU9ERV9JTlBBSU5UX0lOU0VSVElPTlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFRElUX01PREVfQkdTV0FQXCI6IFwiRURJVF9NT0RFX0JHU1dBUFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFRElUX01PREVfT1VUUEFJTlRcIjogXCJFRElUX01PREVfT1VUUEFJTlRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ1VTVE9NSVpBVElPTl9TVUJKRUNUXCI6IFwiQ1VTVE9NSVpBVElPTl9TVUJKRUNUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNVU1RPTUlaQVRJT05fU1RZTEVcIjogXCJDVVNUT01JWkFUSU9OX1NUWUxFXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNVU1RPTUlaQVRJT05fQ09OVFJPTExFRFwiOiBcIkNVU1RPTUlaQVRJT05fQ09OVFJPTExFRFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDVVNUT01JWkFUSU9OX0lOU1RSVUNUXCI6IFwiQ1VTVE9NSVpBVElPTl9JTlNUUlVDVFwiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZWRpdGluZyBtb2RlLiBDVVNUT01JWkFUSU9OIG9wdGlvbnMgdXNlIGZldy1zaG90IGxlYXJuaW5nIHRvIGdlbmVyYXRlIGltYWdlcyBiYXNlZCBvbiBhIGZldyBleGFtcGxlcy5cIlxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZ3VpZGFuY2Vfc2NhbGVcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAsIG1heDogNTAwLCBkZWZhdWx0OiBndWlkYW5jZVNjYWxlRGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiSG93IGNsb3NlbHkgdGhlIGdlbmVyYXRpb24gZm9sbG93cyB0aGUgcHJvbXB0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICBjb25zdCBtYXNrT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gKChvcHRpb24gYXMgSW1hZ2VuT3B0aW9ucyk/LmVkaXRfbW9kZT8uaW5jbHVkZXMoXCJFRElUXCIpKSA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibWFza19tb2RlXCIsIHR5cGU6IE9wdGlvblR5cGUuZW51bSxcbiAgICAgICAgICAgICAgICAgICAgZW51bToge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJNQVNLX01PREVfVVNFUl9QUk9WSURFRFwiOiBcIk1BU0tfTU9ERV9VU0VSX1BST1ZJREVEXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BU0tfTU9ERV9CQUNLR1JPVU5EXCI6IFwiTUFTS19NT0RFX0JBQ0tHUk9VTkRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTUFTS19NT0RFX0ZPUkVHUk9VTkRcIjogXCJNQVNLX01PREVfRk9SRUdST1VORFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJNQVNLX01PREVfU0VNQU5USUNcIjogXCJNQVNLX01PREVfU0VNQU5USUNcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXCJNQVNLX01PREVfVVNFUl9QUk9WSURFRFwiLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJIb3cgc2hvdWxkIHRoZSBtYXNrIGZvciB0aGUgZ2VuZXJhdGlvbiBiZSBwcm92aWRlZFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibWFza19kaWxhdGlvblwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgbWFzayBkaWxhdGlvbiwgZ3Jvd3MgdGhlIG1hc2sgYnkgYSBwZXJjZW50YWdlIG9mIGltYWdlIHdpZHRoIHRvIGNvbXBlbnNhdGUgZm9yIGltcHJlY2lzZSBtYXNrcy5cIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdIDogW107XG5cbiAgICAgICAgICAgIGNvbnN0IG1hc2tDbGFzc09wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9ICgob3B0aW9uIGFzIEltYWdlbk9wdGlvbnMpPy5tYXNrX21vZGUgPT09IEltYWdlbk1hc2tNb2RlLk1BU0tfTU9ERV9TRU1BTlRJQykgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIm1hc2tfY2xhc3NcIiwgdHlwZTogT3B0aW9uVHlwZS5zdHJpbmdfbGlzdCwgZGVmYXVsdDogW10sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIklucHV0IENsYXNzIElEcy4gQ3JlYXRlIGEgbWFzayBiYXNlZCBvbiBpbWFnZSBjbGFzcywgYmFzZWQgb24gaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3ZlcnRleC1haS9nZW5lcmF0aXZlLWFpL2RvY3MvbW9kZWwtcmVmZXJlbmNlL2ltYWdlbi1hcGktY3VzdG9taXphdGlvbiNzZWdtZW50LWlkc1wiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSA6IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBlZGl0T3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gKG9wdGlvbiBhcyBJbWFnZW5PcHRpb25zKT8uZWRpdF9tb2RlPy5pbmNsdWRlcyhcIkVESVRcIikgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImVkaXRfc3RlcHNcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBkZWZhdWx0OiA3NSxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIG51bWJlciBvZiBzdGVwcyBmb3IgdGhlIGJhc2UgaW1hZ2UgZ2VuZXJhdGlvbiwgbW9yZSBzdGVwcyBtZWFucyBtb3JlIHRpbWUgYW5kIGJldHRlciBxdWFsaXR5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSA6IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBjdXN0b21pemF0aW9uT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gKG9wdGlvbiBhcyBJbWFnZW5PcHRpb25zKT8uZWRpdF9tb2RlID09PSBJbWFnZW5UYXNrVHlwZS5DVVNUT01JWkFUSU9OX0NPTlRST0xMRURcbiAgICAgICAgICAgICAgICB8fCAob3B0aW9uIGFzIEltYWdlbk9wdGlvbnMpPy5lZGl0X21vZGUgPT09IEltYWdlblRhc2tUeXBlLkNVU1RPTUlaQVRJT05fU1VCSkVDVCA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiY29udHJvbFR5cGVcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiRmFjZSBNZXNoXCI6IFwiQ09OVFJPTF9UWVBFX0ZBQ0VfTUVTSFwiLCBcIkNhbm55XCI6IFwiQ09OVFJPTF9UWVBFX0NBTk5ZXCIsIFwiU2NyaWJibGVcIjogXCJDT05UUk9MX1RZUEVfU0NSSUJCTEVcIiB9LFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcIkNPTlRST0xfVFlQRV9DQU5OWVwiLCBkZXNjcmlwdGlvbjogXCJNZXRob2QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29udHJvbCBpbWFnZVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiY29udHJvbEltYWdlQ29tcHV0YXRpb25cIiwgdHlwZTogT3B0aW9uVHlwZS5ib29sZWFuLCBkZWZhdWx0OiB0cnVlLCBkZXNjcmlwdGlvbjogXCJTaG91bGQgdGhlIGNvbnRyb2wgaW1hZ2UgYmUgY29tcHV0ZWQgZnJvbSB0aGUgaW5wdXQgaW1hZ2UsIG9yIGlzIGl0IHByb3ZpZGVkXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdIDogW107XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX29wdGlvbl9pZDogXCJ2ZXJ0ZXhhaS1pbWFnZW5cIixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLm1vZGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5tYXNrT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4ubWFza0NsYXNzT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4uZWRpdE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLmN1c3RvbWl6YXRpb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5vdXRwdXRPcHRpb25zLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJnZW1pbmlcIikpIHtcbiAgICAgICAgY29uc3QgbWF4X3Rva2Vuc19saW1pdCA9IGdldEdlbWluaU1heFRva2Vuc0xpbWl0KG1vZGVsKTtcbiAgICAgICAgY29uc3QgZXhjbHVkZU9wdGlvbnMgPSBbXCJtYXhfdG9rZW5zXCIsIFwicHJlc2VuY2VfcGVuYWx0eVwiXTtcbiAgICAgICAgbGV0IGNvbW1vbk9wdGlvbnMgPSB0ZXh0T3B0aW9uc0ZhbGxiYWNrLm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+ICFleGNsdWRlT3B0aW9ucy5pbmNsdWRlcyhvcHRpb24ubmFtZSkpO1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCIxLjVcIikpIHtcbiAgICAgICAgICAgIGNvbW1vbk9wdGlvbnMgPSBjb21tb25PcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ubmFtZSAhPT0gXCJmcmVxdWVuY3lfcGVuYWx0eVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhfdG9rZW5zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbe1xuICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5tYXhfdG9rZW5zLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiBtYXhfdG9rZW5zX2xpbWl0LFxuICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgc3RlcDogMjAwLCBkZXNjcmlwdGlvbjogXCJUaGUgbWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIGdlbmVyYXRlXCJcbiAgICAgICAgfV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfb3B0aW9uX2lkOiBcInRleHQtZmFsbGJhY2tcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAuLi5tYXhfdG9rZW5zLFxuICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiY2xhdWRlXCIpKSB7XG4gICAgICAgIGNvbnN0IG1heF90b2tlbnNfbGltaXQgPSBnZXRDbGF1ZGVNYXhUb2tlbnNMaW1pdChtb2RlbCwgb3B0aW9uIGFzIFZlcnRleEFJQ2xhdWRlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVPcHRpb25zID0gW1wibWF4X3Rva2Vuc1wiLCBcInByZXNlbmNlX3BlbmFsdHlcIiwgXCJmcmVxdWVuY3lfcGVuYWx0eVwiXTtcbiAgICAgICAgbGV0IGNvbW1vbk9wdGlvbnMgPSB0ZXh0T3B0aW9uc0ZhbGxiYWNrLm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+ICFleGNsdWRlT3B0aW9ucy5pbmNsdWRlcyhvcHRpb24ubmFtZSkpO1xuICAgICAgICBjb25zdCBtYXhfdG9rZW5zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbe1xuICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5tYXhfdG9rZW5zLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiBtYXhfdG9rZW5zX2xpbWl0LFxuICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgc3RlcDogMjAwLCBkZXNjcmlwdGlvbjogXCJUaGUgbWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIGdlbmVyYXRlXCJcbiAgICAgICAgfV07XG5cbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiLTMtN1wiKSB8fCBtb2RlbC5pbmNsdWRlcyhcIi00XCIpKSB7XG4gICAgICAgICAgICBjb25zdCBjbGF1ZGVNb2RlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJ0aGlua2luZ19tb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUuYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIklmIHRydWUsIHVzZSB0aGUgZXh0ZW5kZWQgcmVhc29uaW5nIG1vZGVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29uc3QgY2xhdWRlVGhpbmtpbmdPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSAob3B0aW9uIGFzIFZlcnRleEFJQ2xhdWRlT3B0aW9ucyk/LnRoaW5raW5nX21vZGUgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRoaW5raW5nX2J1ZGdldF90b2tlbnNcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDEwMjQsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDQwMDAsXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IDEwMCxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRhcmdldCBudW1iZXIgb2YgdG9rZW5zIHRvIHVzZSBmb3IgcmVhc29uaW5nLCBub3QgYSBoYXJkIGxpbWl0LlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0gOiBbXTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcInZlcnRleGFpLWNsYXVkZVwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ubWF4X3Rva2VucyxcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tbW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4uY2xhdWRlTW9kZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLmNsYXVkZVRoaW5raW5nT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfb3B0aW9uX2lkOiBcInZlcnRleGFpLWNsYXVkZVwiLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIC4uLm1heF90b2tlbnMsXG4gICAgICAgICAgICAgICAgLi4uY29tbW9uT3B0aW9ucyxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRleHRPcHRpb25zRmFsbGJhY2s7XG59XG5mdW5jdGlvbiBnZXRHZW1pbmlNYXhUb2tlbnNMaW1pdChtb2RlbDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJ0aGlua2luZ1wiKSB8fCBtb2RlbC5pbmNsdWRlcyhcIi0yLjUtXCIpKSB7XG4gICAgICAgIHJldHVybiA2NTUzNjtcbiAgICB9XG4gICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwidWx0cmFcIikgfHwgbW9kZWwuaW5jbHVkZXMoXCJ2aXNpb25cIikpIHtcbiAgICAgICAgcmV0dXJuIDIwNDg7XG4gICAgfVxuICAgIHJldHVybiA4MTkyO1xufVxuZnVuY3Rpb24gZ2V0Q2xhdWRlTWF4VG9rZW5zTGltaXQobW9kZWw6IHN0cmluZywgb3B0aW9uPzogVmVydGV4QUlDbGF1ZGVPcHRpb25zKTogbnVtYmVyIHtcbiAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCItNC1cIikpIHtcbiAgICAgICAgaWYobW9kZWwuaW5jbHVkZXMoXCJvcHVzLVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIDMyNzY4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiA2NTUzNjtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCItMy03LVwiKSkge1xuICAgICAgICBpZiAob3B0aW9uICYmIG9wdGlvbj8udGhpbmtpbmdfbW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIDEzMTA3MjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiA4MTkyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiLTMtNS1cIikpIHtcbiAgICAgICAgcmV0dXJuIDgxOTI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gNDA5NjtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBHcm9xT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy9ncm9xLmpzJztcbmltcG9ydCB7IFRleHRGYWxsYmFja09wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvZmFsbGJhY2suanMnO1xuaW1wb3J0IHsgQmVkcm9ja09wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvYmVkcm9jay5qcyc7XG5pbXBvcnQgeyBPcGVuQWlPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zL29wZW5haS5qcyc7XG5pbXBvcnQgeyBWZXJ0ZXhBSU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvdmVydGV4YWkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ3NPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0byBnZW5lcmF0ZSB0aGUgZW1iZWRkaW5ncyBmb3IuIE9uZSBvZiB0ZXh0IG9yIGltYWdlIGlzIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGltYWdlIHRvIGdlbmVyYXRlIGVtYmVkZGluZ3MgZm9yXG4gICAgICovXG4gICAgaW1hZ2U/OiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgbW9kZWwgdG8gdXNlIHRvIGdlbmVyYXRlIHRoZSBlbWJlZGRpbmdzLiBPcHRpb25hbC5cbiAgICAgKi9cbiAgICBtb2RlbD86IHN0cmluZztcblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ3NSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWJlZGRpbmcgdmVjdG9ycyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3b3JkcyBpbiB0aGUgaW5wdXQgdGV4dC5cbiAgICAgKi9cbiAgICB2YWx1ZXM6IG51bWJlcltdO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBlbWJlZGRpbmdzLlxuICAgICAqL1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIHRva2VucyBvZiB0aGUgaW5wdXQgdGV4dC5cbiAgICAgKi9cbiAgICB0b2tlbl9jb3VudD86IG51bWJlcjtcblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VsdFZhbGlkYXRpb25FcnJvciB7XG4gICAgY29kZTogJ3ZhbGlkYXRpb25fZXJyb3InIHwgJ2pzb25fZXJyb3InIHwgJ2NvbnRlbnRfcG9saWN5X3Zpb2xhdGlvbic7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRhdGE/OiBzdHJpbmc7XG59XG5cbi8vUmVzdWx0VCBzaG91bGQgYmUgZWl0aGVyIEpTT05PYmplY3Qgb3Igc3RyaW5nXG4vL0ludGVybmFsIHN0cnVjdHVyZSB1c2VkIGluIGRyaXZlciBpbXBsZW1lbnRhdGlvbi5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbkNodW5rT2JqZWN0PFJlc3VsdFQgPSBhbnk+IHtcbiAgICByZXN1bHQ6IFJlc3VsdFQ7XG4gICAgdG9rZW5fdXNhZ2U/OiBFeGVjdXRpb25Ub2tlblVzYWdlO1xuICAgIGZpbmlzaF9yZWFzb24/OiBcInN0b3BcIiB8IFwibGVuZ3RoXCIgfCBzdHJpbmc7XG59XG5cbi8vSW50ZXJuYWwgc3RydWN0dXJlIHVzZWQgaW4gZHJpdmVyIGltcGxlbWVudGF0aW9uLlxuZXhwb3J0IHR5cGUgQ29tcGxldGlvbkNodW5rID0gQ29tcGxldGlvbkNodW5rT2JqZWN0IHwgc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xEZWZpbml0aW9uIHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgaW5wdXRfc2NoZW1hOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnO1xuICAgICAgICBwcm9wZXJ0aWVzPzogdW5rbm93biB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIFtrOiBzdHJpbmddOiB1bmtub3duO1xuICAgIH0sXG59XG4vKipcbiAqIEEgdG9vbCB1c2UgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGNhbGwgdG8gYSB0b29sLlxuICogVGhlIGlkIHByb3BlcnR5IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHRvb2wgY2FsbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sVXNlPFBhcmFtc1QgPSBKU09OT2JqZWN0PiB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICB0b29sX25hbWU6IHN0cmluZyxcbiAgICB0b29sX2lucHV0OiBQYXJhbXNUIHwgbnVsbFxufVxuXG4vL1Jlc3VsdFQgc2hvdWxkIGJlIGVpdGhlciBKU09OT2JqZWN0IG9yIHN0cmluZ1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uPFJlc3VsdFQgPSBhbnk+IHtcbiAgICAvLyB0aGUgZHJpdmVyIGltcGwgbXVzdCByZXR1cm4gdGhlIHJlc3VsdCBhbmQgb3B0aW9uYWxseSB0aGUgdG9rZW5fdXNhZ2UuIHRoZSBleGVjdXRpb24gdGltZSBpcyBjb21wdXRlZCBieSB0aGUgZXh0ZW5kZWQgYWJzdHJhY3QgZHJpdmVyXG4gICAgcmVzdWx0OiBSZXN1bHRUO1xuICAgIHRva2VuX3VzYWdlPzogRXhlY3V0aW9uVG9rZW5Vc2FnZTtcbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgdG9vbHMgZnJvbSB3aGljaCB0aGUgbW9kZWwgYXdhaXRzIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHRvb2xfdXNlPzogVG9vbFVzZVtdO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaW5pc2ggcmVhc29uIGFzIHJlcG9ydGVkIGJ5IHRoZSBtb2RlbDogc3RvcCB8IGxlbmd0aCBvciBvdGhlciBtb2RlbCBzcGVjaWZpYyB2YWx1ZXNcbiAgICAgKi9cbiAgICBmaW5pc2hfcmVhc29uPzogXCJzdG9wXCIgfCBcImxlbmd0aFwiIHwgXCJ0b29sX3VzZVwiIHwgc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2V0IG9ubHkgaWYgYSByZXN1bHQgdmFsaWRhdGlvbiBlcnJvciBvY2N1cnJlZCwgb3RoZXJ3aXNlIGlmIHRoZSByZXN1bHQgaXMgdmFsaWQgdGhlIGVycm9yIGZpZWxkIGlzIHVuZGVmaW5lZFxuICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgc2V0IGlmIHRoZSByZXN1bHRfc2NoZW1hIGlzIHNldCBhbmQgdGhlIHJlc3VsdCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIGEganNvbiBvciBpZiB0aGUgcmVzdWx0IGRvZXMgbm90IG1hdGNoIHRoZSBzY2hlbWFcbiAgICAgKi9cbiAgICBlcnJvcj86IFJlc3VsdFZhbGlkYXRpb25FcnJvcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCByZXNwb25zZS4gT25seSBpbmNsdWRlZCBpZiB0aGUgb3B0aW9uIGluY2x1ZGVfb3JpZ2luYWxfcmVzcG9uc2UgaXMgc2V0IHRvIHRydWUgYW5kIHRoZSByZXF1ZXN0IGlzIG1hZGUgdXNpbmcgZXhlY3V0ZS4gTm90IHN1cHBvcnRlZCB3aGVuIHN0cmVhbWluZy5cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9yZXNwb25zZT86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udmVyc2F0aW9uIGNvbnRleHQuIFRoaXMgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIG5leHQgcmVxdWVzdCB0byByZXN0b3JlIHRoZSBjb250ZXh0LlxuICAgICAqL1xuICAgIGNvbnZlcnNhdGlvbj86IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VHZW5lcmF0aW9uIHtcblxuICAgIGltYWdlcz86IHN0cmluZ1tdO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uUmVzcG9uc2U8UHJvbXB0VCA9IGFueT4gZXh0ZW5kcyBDb21wbGV0aW9uIHtcbiAgICBwcm9tcHQ6IFByb21wdFQ7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgaXQgdG9vayB0byBleGVjdXRlIHRoZSByZXF1ZXN0IGluIHNlY29uZHNcbiAgICAgKi9cbiAgICBleGVjdXRpb25fdGltZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNodW5rcyBmb3Igc3RyZWFtZWQgZXhlY3V0aW9uc1xuICAgICAqL1xuICAgIGNodW5rcz86IG51bWJlcjtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb25TdHJlYW08UHJvbXB0VCA9IGFueT4gZXh0ZW5kcyBBc3luY0l0ZXJhYmxlPHN0cmluZz4ge1xuICAgIGNvbXBsZXRpb246IEV4ZWN1dGlvblJlc3BvbnNlPFByb21wdFQ+IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICAgZGVidWc6ICguLi5vYmo6IGFueVtdKSA9PiB2b2lkO1xuICAgIGluZm86ICguLi5vYmo6IGFueVtdKSA9PiB2b2lkO1xuICAgIHdhcm46ICguLi5vYmo6IGFueVtdKSA9PiB2b2lkO1xuICAgIGVycm9yOiAoLi4ub2JqOiBhbnlbXSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEcml2ZXJPcHRpb25zIHtcbiAgICBsb2dnZXI/OiBMb2dnZXIgfCBcImNvbnNvbGVcIjtcbn1cblxuZXhwb3J0IHR5cGUgSlNPTlNjaGVtYVR5cGVOYW1lID1cbiAgICB8IFwic3RyaW5nXCIgLy9cbiAgICB8IFwibnVtYmVyXCJcbiAgICB8IFwiaW50ZWdlclwiXG4gICAgfCBcImJvb2xlYW5cIlxuICAgIHwgXCJvYmplY3RcIlxuICAgIHwgXCJhcnJheVwiXG4gICAgfCBcIm51bGxcIlxuICAgIHwgXCJhbnlcIjtcblxuZXhwb3J0IHR5cGUgSlNPTlNjaGVtYVR5cGUgPVxuICAgIHwgc3RyaW5nIC8vXG4gICAgfCBudW1iZXJcbiAgICB8IGJvb2xlYW5cbiAgICB8IEpTT05TY2hlbWFPYmplY3RcbiAgICB8IEpTT05TY2hlbWFBcnJheVxuICAgIHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hT2JqZWN0IHtcbiAgICBba2V5OiBzdHJpbmddOiBKU09OU2NoZW1hVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hQXJyYXkgZXh0ZW5kcyBBcnJheTxKU09OU2NoZW1hVHlwZT4geyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSlNPTlNjaGVtYSB7XG4gICAgdHlwZT86IEpTT05TY2hlbWFUeXBlTmFtZSB8IEpTT05TY2hlbWFUeXBlTmFtZVtdO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBKU09OU2NoZW1hPjtcbiAgICByZXF1aXJlZD86IHN0cmluZ1tdO1xuICAgIFtrOiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIFByb21wdEZvcm1hdHRlcjxUID0gYW55PiA9IChtZXNzYWdlczogUHJvbXB0U2VnbWVudFtdLCBzY2hlbWE/OiBKU09OU2NoZW1hKSA9PiBUO1xuXG4vL09wdGlvbnMgYXJlIHNwbGl0IGludG8gUHJvbXB0T3B0aW9ucywgTW9kZWxPcHRpb25zIGFuZCBFeGVjdXRpb25PcHRpb25zLlxuLy9FeGVjdXRpb25PcHRpb25zIGFyZSBtb3N0IG9mdGVuIHVzZWQgd2l0aGluIGxsdW1pdmVyc2UgYXMgdGhleSBhcmUgdGhlIG1vc3QgY29tcGxldGUuXG4vL1RoZSBiYXNlIHR5cGVzIGFyZSB1c2VmdWwgZm9yIGV4dGVybmFsIGNvZGUgdGhhdCBuZWVkcyB0byBpbnRlcmFjdCB3aXRoIGxsdW1pdmVyc2UuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdE9wdGlvbnMge1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjdXN0b20gZm9ybWF0dGVyIHRvIHVzZSBmb3IgZm9ybWF0IHRoZSBmaW5hbCBtb2RlbCBwcm9tcHQgZnJvbSB0aGUgaW5wdXQgcHJvbXB0IHNlZ21lbnRzLlxuICAgICAqIElmIG5vIG9uZSBpcyBzcGVjaWZpZWQgdGhlIGRyaXZlciB3aWxsIGNob29zZSBhIGZvcm1hdHRlciBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBtb2RlbFxuICAgICAqL1xuICAgIGZvcm1hdD86IFByb21wdEZvcm1hdHRlcjtcbiAgICByZXN1bHRfc2NoZW1hPzogSlNPTlNjaGVtYTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZWxlc3NFeGVjdXRpb25PcHRpb25zIGV4dGVuZHMgUHJvbXB0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0IHRvIHRydWUgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIGZyb20gdGhlIHRhcmdldCBMTE0gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UgdW5kZXIgdGhlIG9yaWdpbmFsX3Jlc3BvbnNlIGZpZWxkLlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGZvciBzb21lIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICAgKiBJdCBpcyBpZ25vcmVkIG9uIHN0cmVhbWluZyByZXF1ZXN0c1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3JpZ2luYWxfcmVzcG9uc2U/OiBib29sZWFuO1xuICAgIG1vZGVsX29wdGlvbnM/OiBNb2RlbE9wdGlvbnM7XG4gICAgb3V0cHV0X21vZGFsaXR5OiBNb2RhbGl0aWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbk9wdGlvbnMgZXh0ZW5kcyBTdGF0ZWxlc3NFeGVjdXRpb25PcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBdmFpbGFibGUgdG9vbHMgZm9yIHRoZSByZXF1ZXN0XG4gICAgICovXG4gICAgdG9vbHM/OiBUb29sRGVmaW5pdGlvbltdO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0aGF0IHByb3ZpZGVzIGEgY29udmVyc2F0aW9uIGNvbnRleHRcbiAgICAgKiBFYWNoIGRyaXZlciBpbXBsZW1lbnRhdGlvbiB3aWxsIHJldHVybiBhIGNvbnZlcnNhdGlvbiBwcm9wZXJ0eSBpbiB0aGUgZXhlY3V0aW9uIHJlc3BvbnNlXG4gICAgICogdGhhdCBjYW4gYmUgcGFzc2VkIGhlcmUgdG8gcmVzdG9yZSB0aGUgY29udGV4dCB3aGVuIGEgbmV3IHByb21wdCBpcyBzZW50IHRvIHRoZSBtb2RlbC5cbiAgICAgKi9cbiAgICBjb252ZXJzYXRpb24/OiB1bmtub3duIHwgbnVsbDtcbn1cblxuLy9Db21tb24gbmFtZXMgdG8gc2hhcmUgYmV0d2VlbiBkaWZmZXJlbnQgbW9kZWxzXG5leHBvcnQgZW51bSBTaGFyZWRPcHRpb25zIHtcbiAgICAvL1RleHRcbiAgICBtYXhfdG9rZW5zID0gXCJtYXhfdG9rZW5zXCIsXG4gICAgdGVtcGVyYXR1cmUgPSBcInRlbXBlcmF0dXJlXCIsXG4gICAgdG9wX3AgPSBcInRvcF9wXCIsXG4gICAgdG9wX2sgPSBcInRvcF9rXCIsXG4gICAgcHJlc2VuY2VfcGVuYWx0eSA9IFwicHJlc2VuY2VfcGVuYWx0eVwiLFxuICAgIGZyZXF1ZW5jeV9wZW5hbHR5ID0gXCJmcmVxdWVuY3lfcGVuYWx0eVwiLFxuICAgIHN0b3Bfc2VxdWVuY2UgPSBcInN0b3Bfc2VxdWVuY2VcIixcblxuICAgIC8vSW1hZ2VcbiAgICBzZWVkID0gXCJzZWVkXCIsXG4gICAgbnVtYmVyX29mX2ltYWdlcyA9IFwibnVtYmVyX29mX2ltYWdlc1wiLFxufVxuXG5leHBvcnQgZW51bSBPcHRpb25UeXBlIHtcbiAgICBudW1lcmljID0gXCJudW1lcmljXCIsXG4gICAgZW51bSA9IFwiZW51bVwiLFxuICAgIGJvb2xlYW4gPSBcImJvb2xlYW5cIixcbiAgICBzdHJpbmdfbGlzdCA9IFwic3RyaW5nX2xpc3RcIlxufVxuXG4vLyA9PT09PT09PT09PT09PSBNb2RlbCBPcHRpb25zID09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBNb2RlbE9wdGlvbnMgPSBUZXh0RmFsbGJhY2tPcHRpb25zIHwgVmVydGV4QUlPcHRpb25zIHwgQmVkcm9ja09wdGlvbnMgfCBPcGVuQWlPcHRpb25zIHwgR3JvcU9wdGlvbnM7XG5cbi8vID09PT09PT09PT09PT09IE9wdGlvbiBJbmZvID09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsT3B0aW9uc0luZm8ge1xuICAgIG9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXTtcbiAgICBfb3B0aW9uX2lkOiBzdHJpbmc7IC8vU2hvdWxkIGZvbGxvdyBzYW1lIGlkcyBhcyBNb2RlbE9wdGlvbnNcbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxPcHRpb25JbmZvSXRlbSA9IE51bWVyaWNPcHRpb25JbmZvIHwgRW51bU9wdGlvbkluZm8gfCBCb29sZWFuT3B0aW9uSW5mbyB8IFN0cmluZ0xpc3RPcHRpb25JbmZvO1xuaW50ZXJmYWNlIE9wdGlvbkluZm9Qcm90b3R5cGUge1xuICAgIHR5cGU6IE9wdGlvblR5cGU7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLy9JZiB0aGlzIGlzIHRydWUsIHdoZXRoZXIgb3RoZXIgb3B0aW9ucyBhcHBseSBpcyBkZXBlbmRlbnQgb24gdGhpcyBvcHRpb25cbiAgICAvL1RoZXJlZm9yZSwgaWYgdGhpcyBvcHRpb24gaXMgY2hhbmdlZCwgdGhlIHNldCBvZiBhdmFpbGFibGUgb3B0aW9ucyBzaG91bGQgYmUgcmVmcmVzaGVkLlxuICAgIHJlZnJlc2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE51bWVyaWNPcHRpb25JbmZvIGV4dGVuZHMgT3B0aW9uSW5mb1Byb3RvdHlwZSB7XG4gICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljO1xuICAgIHZhbHVlPzogbnVtYmVyO1xuICAgIG1pbj86IG51bWJlcjtcbiAgICBtYXg/OiBudW1iZXI7XG4gICAgc3RlcD86IG51bWJlcjtcbiAgICBpbnRlZ2VyPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudW1PcHRpb25JbmZvIGV4dGVuZHMgT3B0aW9uSW5mb1Byb3RvdHlwZSB7XG4gICAgdHlwZTogT3B0aW9uVHlwZS5lbnVtO1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICAgIGVudW06IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgZGVmYXVsdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb29sZWFuT3B0aW9uSW5mbyBleHRlbmRzIE9wdGlvbkluZm9Qcm90b3R5cGUge1xuICAgIHR5cGU6IE9wdGlvblR5cGUuYm9vbGVhbjtcbiAgICB2YWx1ZT86IGJvb2xlYW47XG4gICAgZGVmYXVsdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nTGlzdE9wdGlvbkluZm8gZXh0ZW5kcyBPcHRpb25JbmZvUHJvdG90eXBlIHtcbiAgICB0eXBlOiBPcHRpb25UeXBlLnN0cmluZ19saXN0O1xuICAgIHZhbHVlPzogc3RyaW5nW107XG4gICAgZGVmYXVsdD86IHN0cmluZ1tdO1xufVxuXG4vLyA9PT09PT09PT09PT09PSBQcm9tcHRzID09PT09PT09PT09PT09PVxuZXhwb3J0IGVudW0gUHJvbXB0Um9sZSB7XG4gICAgc2FmZXR5ID0gXCJzYWZldHlcIixcbiAgICBzeXN0ZW0gPSBcInN5c3RlbVwiLFxuICAgIHVzZXIgPSBcInVzZXJcIixcbiAgICBhc3Npc3RhbnQgPSBcImFzc2lzdGFudFwiLFxuICAgIG5lZ2F0aXZlID0gXCJuZWdhdGl2ZVwiLFxuICAgIG1hc2sgPSBcIm1hc2tcIixcbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHNlbmQgdGhlIHJlc3BvbnNlIG9mIGEgdG9vbFxuICAgICAqL1xuICAgIHRvb2wgPSBcInRvb2xcIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFNlZ21lbnQge1xuICAgIHJvbGU6IFByb21wdFJvbGU7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b29sIHVzZSBpZCBpZiB0aGUgc2VnbWVudCBpcyBhIHRvb2wgcmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b29sX3VzZV9pZD86IHN0cmluZztcbiAgICBmaWxlcz86IERhdGFTb3VyY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvblRva2VuVXNhZ2Uge1xuICAgIHByb21wdD86IG51bWJlcjtcbiAgICByZXN1bHQ/OiBudW1iZXI7XG4gICAgdG90YWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBlbnVtIE1vZGFsaXRpZXMge1xuICAgIHRleHQgPSBcInRleHRcIixcbiAgICBpbWFnZSA9IFwiaW1hZ2VcIixcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBvdXRwdXQgYW5kIGlucHV0IG1vZGFsaXRpZXMgYSBtb2RlbCBjYW4gc3VwcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsTW9kYWxpdGllcyB7XG4gICAgdGV4dD86IGJvb2xlYW47XG4gICAgaW1hZ2U/OiBib29sZWFuO1xuICAgIHZpZGVvPzogYm9vbGVhbjtcbiAgICBhdWRpbz86IGJvb2xlYW47XG4gICAgZW1iZWQ/OiBib29sZWFuOyAvL09ubHkgZm9yIG91dHB1dFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ2FwYWJpbGl0aWVzIHtcbiAgICBpbnB1dDogTW9kZWxNb2RhbGl0aWVzO1xuICAgIG91dHB1dDogTW9kZWxNb2RhbGl0aWVzO1xuICAgIHRvb2xfc3VwcG9ydD86IGJvb2xlYW47IC8vaWYgdGhlIG1vZGVsIHN1cHBvcnRzIHRvb2wgdXNlXG4gICAgdG9vbF9zdXBwb3J0X3N0cmVhbWluZz86IGJvb2xlYW47IC8vaWYgdGhlIG1vZGVsIHN1cHBvcnRzIHRvb2wgdXNlIHdpdGggc3RyZWFtaW5nXG59XG5cbi8vID09PT09PT09PT09PT09IEFJIE1PREVMID09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlNb2RlbDxQcm92aWRlcktleXMgPSBzdHJpbmc+IHtcbiAgICBpZDogc3RyaW5nOyAvL2lkIG9mIHRoZSBtb2RlbCBrbm93biBieSB0aGUgcHJvdmlkZXJcbiAgICBuYW1lOiBzdHJpbmc7IC8vaHVtYW4gcmVhZGFibGUgbmFtZVxuICAgIHByb3ZpZGVyOiBQcm92aWRlcktleXM7IC8vcHJvdmlkZXIgbmFtZVxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7IC8vaWYgYW55IHZlcnNpb24gaXMgc3BlY2lmaWVkXG4gICAgdHlwZT86IE1vZGVsVHlwZTsgLy90eXBlIG9mIHRoZSBtb2RlbFxuICAgIHRhZ3M/OiBzdHJpbmdbXTsgLy90YWdzIGZvciBzZWFyY2hpbmdcbiAgICBvd25lcj86IHN0cmluZzsgLy9vd25lciBvZiB0aGUgbW9kZWxcbiAgICBzdGF0dXM/OiBBSU1vZGVsU3RhdHVzOyAvL3N0YXR1cyBvZiB0aGUgbW9kZWxcbiAgICBjYW5fc3RyZWFtPzogYm9vbGVhbjsgLy9pZiB0aGUgbW9kZWwncyByZXNwb25zZSBjYW4gYmUgc3RyZWFtZWRcbiAgICBpc19jdXN0b20/OiBib29sZWFuOyAvL2lmIHRoZSBtb2RlbCBpcyBhIGN1c3RvbSBtb2RlbCAoYSB0cmFpbmVkIG1vZGVsKVxuICAgIGlzX211bHRpbW9kYWw/OiBib29sZWFuIC8vaWYgdGhlIG1vZGVsIHN1cHBvcnQgZmlsZXMgYW5kIGltYWdlc1xuICAgIGlucHV0X21vZGFsaXRpZXM/OiBzdHJpbmdbXTsgLy9JbnB1dCBtb2RhbGl0aWVzIHN1cHBvcnRlZCBieSB0aGUgbW9kZWwgKGUuZy4gdGV4dCwgaW1hZ2UsIHZpZGVvLCBhdWRpbylcbiAgICBvdXRwdXRfbW9kYWxpdGllcz86IHN0cmluZ1tdOyAvL091dHB1dCBtb2RhbGl0aWVzIHN1cHBvcnRlZCBieSB0aGUgbW9kZWwgKGUuZy4gdGV4dCwgaW1hZ2UsIHZpZGVvLCBhdWRpbylcbiAgICB0b29sX3N1cHBvcnQ/OiBib29sZWFuOyAvL2lmIHRoZSBtb2RlbCBzdXBwb3J0cyB0b29sIHVzZVxuICAgIGVudmlyb25tZW50Pzogc3RyaW5nOyAvL3RoZSBlbnZpcm9ubWVudCBuYW1lXG59XG5cbmV4cG9ydCBlbnVtIEFJTW9kZWxTdGF0dXMge1xuICAgIEF2YWlsYWJsZSA9IFwiYXZhaWxhYmxlXCIsXG4gICAgUGVuZGluZyA9IFwicGVuZGluZ1wiLFxuICAgIFN0b3BwZWQgPSBcInN0b3BwZWRcIixcbiAgICBVbmF2YWlsYWJsZSA9IFwidW5hdmFpbGFibGVcIixcbiAgICBVbmtub3duID0gXCJ1bmtub3duXCIsXG4gICAgTGVnYWN5ID0gXCJsZWdhY3lcIixcbn1cblxuLyoqXG4gKiBwYXlsb2FkIHRvIGxpc3QgYXZhaWxhYmxlIG1vZGVscyBmb3IgYW4gZW52aXJvbm1lbnRcbiAqIEBwYXJhbSBlbnZpcm9ubWVudElkIGlkIG9mIHRoZSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHF1ZXJ5IHRleHQgdG8gc2VhcmNoIGZvciBpbiBtb2RlbCBuYW1lL2Rlc2NyaXB0aW9uXG4gKiBAcGFyYW0gdHlwZSB0eXBlIG9mIHRoZSBtb2RlbFxuICogQHBhcmFtIHRhZ3MgdGFncyBmb3Igc2VhcmNoaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxTZWFyY2hQYXlsb2FkIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgdHlwZT86IE1vZGVsVHlwZTtcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgb3duZXI/OiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGVudW0gTW9kZWxUeXBlIHtcbiAgICBDbGFzc2lmaWVyID0gXCJjbGFzc2lmaWVyXCIsXG4gICAgUmVncmVzc29yID0gXCJyZWdyZXNzb3JcIixcbiAgICBDbHVzdGVyaW5nID0gXCJjbHVzdGVyaW5nXCIsXG4gICAgQW5vbWFseURldGVjdGlvbiA9IFwiYW5vbWFseS1kZXRlY3Rpb25cIixcbiAgICBUaW1lU2VyaWVzID0gXCJ0aW1lLXNlcmllc1wiLFxuICAgIFRleHQgPSBcInRleHRcIixcbiAgICBJbWFnZSA9IFwiaW1hZ2VcIixcbiAgICBBdWRpbyA9IFwiYXVkaW9cIixcbiAgICBWaWRlbyA9IFwidmlkZW9cIixcbiAgICBFbWJlZGRpbmcgPSBcImVtYmVkZGluZ1wiLFxuICAgIENoYXQgPSBcImNoYXRcIixcbiAgICBDb2RlID0gXCJjb2RlXCIsXG4gICAgTkxQID0gXCJubHBcIixcbiAgICBNdWx0aU1vZGFsID0gXCJtdWx0aS1tb2RhbFwiLFxuICAgIFRlc3QgPSBcInRlc3RcIixcbiAgICBPdGhlciA9IFwib3RoZXJcIixcbiAgICBVbmtub3duID0gXCJ1bmtub3duXCJcbn1cblxuXG4vLyA9PT09PT09PT09PT09PSB0cmFpbmluZyA9PT09PT09PT09PT09PT09PT09PT1cblxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVNvdXJjZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1pbWVfdHlwZT86IHN0cmluZztcbiAgICBnZXRTdHJlYW0oKTogUHJvbWlzZTxSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5IHwgc3RyaW5nPj47XG4gICAgZ2V0VVJMKCk6IFByb21pc2U8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpbmluZ09wdGlvbnMge1xuICAgIG5hbWU6IHN0cmluZzsgLy8gdGhlIG5ldyBtb2RlbCBuYW1lXG4gICAgbW9kZWw6IHN0cmluZzsgLy8gdGhlIG1vZGVsIHRvIHRyYWluXG4gICAgcGFyYW1zPzogSlNPTk9iamVjdDsgLy8gdGhlIHRyYWluaW5nIHBhcmFtZXRlcnNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpbmluZ1Byb21wdE9wdGlvbnMge1xuICAgIHNlZ21lbnRzOiBQcm9tcHRTZWdtZW50W107XG4gICAgY29tcGxldGlvbjogc3RyaW5nIHwgSlNPTk9iamVjdDtcbiAgICBtb2RlbDogc3RyaW5nOyAvLyB0aGUgbW9kZWwgdG8gdHJhaW5cbiAgICBzY2hlbWE/OiBKU09OU2NoZW1hOyAvLyB0aGUgcmVzdWx0IHNjaGVtYSBmIGFueVxufVxuXG5leHBvcnQgZW51bSBUcmFpbmluZ0pvYlN0YXR1cyB7XG4gICAgcnVubmluZyA9IFwicnVubmluZ1wiLFxuICAgIHN1Y2NlZWRlZCA9IFwic3VjY2VlZGVkXCIsXG4gICAgZmFpbGVkID0gXCJmYWlsZWRcIixcbiAgICBjYW5jZWxsZWQgPSBcImNhbmNlbGxlZFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nSm9iIHtcbiAgICBpZDogc3RyaW5nOyAvLyBpZCBvZiB0aGUgdHJhaW5pbmcgam9iXG4gICAgc3RhdHVzOiBUcmFpbmluZ0pvYlN0YXR1czsgLy8gc3RhdHVzIG9mIHRoZSB0cmFpbmluZyBqb2IgLSBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgIGRldGFpbHM/OiBzdHJpbmc7XG4gICAgbW9kZWw/OiBzdHJpbmc7IC8vIHRoZSBuYW1lIG9mIHRoZSBmaW5lIHR1bmVkIG1vZGVsIHdoaWNoIGlzIGNyZWF0ZWRcbn1cblxuZXhwb3J0IHR5cGUgSlNPTlByaW1pdGl2ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuZXhwb3J0IHR5cGUgSlNPTkFycmF5ID0gSlNPTlZhbHVlW107XG5leHBvcnQgdHlwZSBKU09OT2JqZWN0ID0geyBba2V5OiBzdHJpbmddOiBKU09OVmFsdWUgfTtcbmV4cG9ydCB0eXBlIEpTT05Db21wb3NpdGUgPSBKU09OQXJyYXkgfCBKU09OT2JqZWN0O1xuZXhwb3J0IHR5cGUgSlNPTlZhbHVlID0gSlNPTlByaW1pdGl2ZSB8IEpTT05Db21wb3NpdGU7XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBSZXRyeVBvbGljeSB9IGZyb20gJy4vcmV0cnktcG9saWN5JztcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IFZlcnNpb25pbmdJbnRlbnQgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbmV4cG9ydCBjb25zdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUgPSB7XG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9ICh0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKVtrZXlvZiB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsIGRlY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDAsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAxLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDIsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJlbW90ZSBhY3Rpdml0eSBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgdG8gdXNlIGZvciB0cmFja2luZyB0aGUgYWN0aXZpdHkgaW4gV29ya2Zsb3cgaGlzdG9yeS5cbiAgICogVGhlIGBhY3Rpdml0eUlkYCBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIGFjdGl2aXR5IGZ1bmN0aW9uLlxuICAgKiBEb2VzIG5vdCBuZWVkIHRvIGJlIHVuaXF1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYW4gaW5jcmVtZW50YWwgc2VxdWVuY2UgbnVtYmVyXG4gICAqL1xuICBhY3Rpdml0eUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGN1cnJlbnQgd29ya2VyIHRhc2sgcXVldWVcbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSGVhcnRiZWF0IGludGVydmFsLiBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCBiZWZvcmUgdGhpcyBpbnRlcnZhbCBwYXNzZXMgYWZ0ZXIgYSBsYXN0IGhlYXJ0YmVhdCBvciBhY3Rpdml0eSBzdGFydC5cbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBoZWFydGJlYXRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lIGhvdyBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBzZXJ2ZXItZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuIFRvIGVuc3VyZSB6ZXJvIHJldHJpZXMsIHNldCBtYXhpbXVtIGF0dGVtcHRzIHRvIDEuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgb2YgYSBzaW5nbGUgQWN0aXZpdHkgZXhlY3V0aW9uIGF0dGVtcHQuIE5vdGUgdGhhdCB0aGUgVGVtcG9yYWwgU2VydmVyIGRvZXNuJ3QgZGV0ZWN0IFdvcmtlciBwcm9jZXNzXG4gICAqIGZhaWx1cmVzIGRpcmVjdGx5OiBpbnN0ZWFkLCBpdCByZWxpZXMgb24gdGhpcyB0aW1lb3V0IHRvIGRldGVjdCB0aGF0IGFuIEFjdGl2aXR5IGRpZG4ndCBjb21wbGV0ZSBvbiB0aW1lLiBUaGVyZWZvcmUsIHRoaXNcbiAgICogdGltZW91dCBzaG91bGQgYmUgYXMgc2hvcnQgYXMgdGhlIGxvbmdlc3QgcG9zc2libGUgZXhlY3V0aW9uIG9mIHRoZSBBY3Rpdml0eSBib2R5LiBQb3RlbnRpYWxseSBsb25nLXJ1bm5pbmdcbiAgICogQWN0aXZpdGllcyBtdXN0IHNwZWNpZnkge0BsaW5rIGhlYXJ0YmVhdFRpbWVvdXR9IGFuZCBjYWxsIHtAbGluayBhY3Rpdml0eS5Db250ZXh0LmhlYXJ0YmVhdH0gcGVyaW9kaWNhbGx5IGZvclxuICAgKiB0aW1lbHkgZmFpbHVyZSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRpbWUgdGhhdCB0aGUgQWN0aXZpdHkgVGFzayBjYW4gc3RheSBpbiB0aGUgVGFzayBRdWV1ZSBiZWZvcmUgaXQgaXMgcGlja2VkIHVwIGJ5IGEgV29ya2VyLiBEbyBub3Qgc3BlY2lmeSB0aGlzIHRpbWVvdXQgdW5sZXNzIHVzaW5nIGhvc3Qtc3BlY2lmaWMgVGFzayBRdWV1ZXMgZm9yIEFjdGl2aXR5IFRhc2tzIGFyZSBiZWluZyB1c2VkIGZvciByb3V0aW5nLlxuICAgKiBgc2NoZWR1bGVUb1N0YXJ0VGltZW91dGAgaXMgYWx3YXlzIG5vbi1yZXRyeWFibGUuIFJldHJ5aW5nIGFmdGVyIHRoaXMgdGltZW91dCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYXMgaXQgd291bGQganVzdCBwdXQgdGhlIEFjdGl2aXR5IFRhc2sgYmFjayBpbnRvIHRoZSBzYW1lIFRhc2sgUXVldWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBvciB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRvdGFsIHRpbWUgdGhhdCBhIHdvcmtmbG93IGlzIHdpbGxpbmcgdG8gd2FpdCBmb3IgdGhlIEFjdGl2aXR5IHRvIGNvbXBsZXRlLlxuICAgKiBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgbGltaXRzIHRoZSB0b3RhbCB0aW1lIG9mIGFuIEFjdGl2aXR5J3MgZXhlY3V0aW9uIGluY2x1ZGluZyByZXRyaWVzICh1c2Uge0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IHRvIGxpbWl0IHRoZSB0aW1lIG9mIGEgc2luZ2xlIGF0dGVtcHQpLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hhdCB0aGUgU0RLIGRvZXMgd2hlbiB0aGUgQWN0aXZpdHkgaXMgY2FuY2VsbGVkLlxuICAgKiAtIGBUUllfQ0FOQ0VMYCAtIEluaXRpYXRlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydCBjYW5jZWxsYXRpb24gdG8gdGhlIHdvcmtmbG93LlxuICAgKiAtIGBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURgIC0gV2FpdCBmb3IgYWN0aXZpdHkgY2FuY2VsbGF0aW9uIGNvbXBsZXRpb24uIE5vdGUgdGhhdCBhY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCB0byByZWNlaXZlIGFcbiAgICogICBjYW5jZWxsYXRpb24gbm90aWZpY2F0aW9uLiBUaGlzIGNhbiBibG9jayB0aGUgY2FuY2VsbGF0aW9uIGZvciBhIGxvbmcgdGltZSBpZiBhY3Rpdml0eSBkb2Vzbid0XG4gICAqICAgaGVhcnRiZWF0IG9yIGNob29zZXMgdG8gaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdC5cbiAgICogLSBgQUJBTkRPTmAgLSBEbyBub3QgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgdGhlIGFjdGl2aXR5IGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uIHRvIHRoZSB3b3JrZmxvdy5cbiAgICovXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEVhZ2VyIGRpc3BhdGNoIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IGltcHJvdmVzIHRoZSB0aHJvdWdocHV0IGFuZCBsb2FkIG9uIHRoZSBzZXJ2ZXIgZm9yIHNjaGVkdWxpbmcgQWN0aXZpdGllcy5cbiAgICogV2hlbiB1c2VkLCB0aGUgc2VydmVyIHdpbGwgaGFuZCBvdXQgQWN0aXZpdHkgdGFza3MgYmFjayB0byB0aGUgV29ya2VyIHdoZW4gaXQgY29tcGxldGVzIGEgV29ya2Zsb3cgdGFzay5cbiAgICogSXQgaXMgYXZhaWxhYmxlIGZyb20gc2VydmVyIHZlcnNpb24gMS4xNyBiZWhpbmQgdGhlIGBzeXN0ZW0uZW5hYmxlQWN0aXZpdHlFYWdlckV4ZWN1dGlvbmAgZmVhdHVyZSBmbGFnLlxuICAgKlxuICAgKiBFYWdlciBkaXNwYXRjaCB3aWxsIG9ubHkgYmUgdXNlZCBpZiBgYWxsb3dFYWdlckRpc3BhdGNoYCBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgYW5kIHtAbGluayB0YXNrUXVldWV9IGlzIGVpdGhlclxuICAgKiBvbWl0dGVkIG9yIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhbGxvd0VhZ2VyRGlzcGF0Y2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIEFjdGl2aXR5IHNob3VsZCBydW4gb24gYVxuICAgKiB3b3JrZXIgd2l0aCBhIGNvbXBhdGlibGUgQnVpbGQgSWQgb3Igbm90LiBTZWUge0BsaW5rIFZlcnNpb25pbmdJbnRlbnR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ09NUEFUSUJMRSdcbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lcyBob3cgYW4gYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgU0RLLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLlxuICAgKiBOb3RlIHRoYXQgbG9jYWwgYWN0aXZpdGllcyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgbWF4aW11bSBhdHRlbXB0cyBpcyBzZXQgdG8gMSBkdWUgdG8gV29ya2Zsb3cgdGFzayByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHRhc2sgaXMgZGlzcGF0Y2hlZC4gVGhpc1xuICAgKiB0aW1lb3V0IGlzIGFsd2F5cyByZXRyeWFibGUuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqIElmIHNldCwgdGhpcyBtdXN0IGJlIDw9IHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbWl0cyB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBjYW4gaWRsZSBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBleGVjdXRlZC4gVGhhdCBjYW4gaGFwcGVuIGlmXG4gICAqIHRoZSB3b3JrZXIgaXMgY3VycmVudGx5IGF0IG1heCBjb25jdXJyZW50IGxvY2FsIGFjdGl2aXR5IGV4ZWN1dGlvbnMuIFRoaXMgdGltZW91dCBpcyBhbHdheXNcbiAgICogbm9uIHJldHJ5YWJsZSBhcyBhbGwgYSByZXRyeSB3b3VsZCBhY2hpZXZlIGlzIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHNhbWUgcXVldWUuIERlZmF1bHRzXG4gICAqIHRvIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpZiBub3Qgc3BlY2lmaWVkIGFuZCB0aGF0IGlzIHNldC4gTXVzdCBiZSA8PVxuICAgKiB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gd2hlbiBzZXQsIG90aGVyd2lzZSwgaXQgd2lsbCBiZSBjbGFtcGVkIGRvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0IGZvciBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uLiBMaW1pdHMgaG93XG4gICAqIGxvbmcgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZC5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWN0aXZpdHkgaXMgcmV0cnlpbmcgYW5kIGJhY2tvZmYgd291bGQgZXhjZWVkIHRoaXMgdmFsdWUsIGEgc2VydmVyIHNpZGUgdGltZXIgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gICAqIE90aGVyd2lzZSwgYmFja29mZiB3aWxsIGhhcHBlbiBpbnRlcm5hbGx5IGluIHRoZSBTREsuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiovXG4gIGxvY2FsUmV0cnlUaHJlc2hvbGQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGF0IHRoZSBTREsgZG9lcyB3aGVuIHRoZSBBY3Rpdml0eSBpcyBjYW5jZWxsZWQuXG4gICAqIC0gYFRSWV9DQU5DRUxgIC0gSW5pdGlhdGUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvbiB0byB0aGUgd29ya2Zsb3cuXG4gICAqIC0gYFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRGAgLSBXYWl0IGZvciBhY3Rpdml0eSBjYW5jZWxsYXRpb24gY29tcGxldGlvbi4gTm90ZSB0aGF0IGFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IHRvIHJlY2VpdmUgYVxuICAgKiAgIGNhbmNlbGxhdGlvbiBub3RpZmljYXRpb24uIFRoaXMgY2FuIGJsb2NrIHRoZSBjYW5jZWxsYXRpb24gZm9yIGEgbG9uZyB0aW1lIGlmIGFjdGl2aXR5IGRvZXNuJ3RcbiAgICogICBoZWFydGJlYXQgb3IgY2hvb3NlcyB0byBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LlxuICAgKiAtIGBBQkFORE9OYCAtIERvIG5vdCByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiB0aGUgYWN0aXZpdHkgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydCBjYW5jZWxsYXRpb24gdG8gdGhlIHdvcmtmbG93LlxuICAgKi9cbiAgY2FuY2VsbGF0aW9uVHlwZT86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZTtcbn1cbiIsImltcG9ydCB7IERlZmF1bHRGYWlsdXJlQ29udmVydGVyLCBGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBQYXlsb2FkQ29kZWMgfSBmcm9tICcuL3BheWxvYWQtY29kZWMnO1xuaW1wb3J0IHsgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsIFBheWxvYWRDb252ZXJ0ZXIgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcblxuLyoqXG4gKiBXaGVuIHlvdXIgZGF0YSAoYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzKSBpcyBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHN0b3JlZCBieSBUZW1wb3JhbCBTZXJ2ZXIsIGl0IGlzIGVuY29kZWQgaW5cbiAqIGJpbmFyeSBpbiBhIHtAbGluayBQYXlsb2FkfSBQcm90b2J1ZiBtZXNzYWdlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCBzdXBwb3J0cyBgdW5kZWZpbmVkYCwgYFVpbnQ4QXJyYXlgLCBhbmQgSlNPTiBzZXJpYWxpemFibGVzIChzbyBpZlxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5I2Rlc2NyaXB0aW9uIHwgYEpTT04uc3RyaW5naWZ5KHlvdXJBcmdPclJldHZhbClgfVxuICogd29ya3MsIHRoZSBkZWZhdWx0IGRhdGEgY29udmVydGVyIHdpbGwgd29yaykuIFByb3RvYnVmcyBhcmUgc3VwcG9ydGVkIHZpYVxuICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RhdGEtY29udmVydGVycyNwcm90b2J1ZnMgfCB0aGlzIEFQSX0uXG4gKlxuICogVXNlIGEgY3VzdG9tIGBEYXRhQ29udmVydGVyYCB0byBjb250cm9sIHRoZSBjb250ZW50cyBvZiB5b3VyIHtAbGluayBQYXlsb2FkfXMuIENvbW1vbiByZWFzb25zIGZvciB1c2luZyBhIGN1c3RvbVxuICogYERhdGFDb252ZXJ0ZXJgIGFyZTpcbiAqIC0gQ29udmVydGluZyB2YWx1ZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgZGVmYXVsdCBgRGF0YUNvbnZlcnRlcmAgKGZvciBleGFtcGxlLCBgSlNPTi5zdHJpbmdpZnkoKWAgZG9lc24ndFxuICogICBoYW5kbGUgYEJpZ0ludGBzLCBzbyBpZiB5b3Ugd2FudCB0byByZXR1cm4gYHsgdG90YWw6IDEwMDBuIH1gIGZyb20gYSBXb3JrZmxvdywgU2lnbmFsLCBvciBBY3Rpdml0eSwgeW91IG5lZWQgeW91clxuICogICBvd24gYERhdGFDb252ZXJ0ZXJgKS5cbiAqIC0gRW5jcnlwdGluZyB2YWx1ZXMgdGhhdCBtYXkgY29udGFpbiBwcml2YXRlIGluZm9ybWF0aW9uIHRoYXQgeW91IGRvbid0IHdhbnQgc3RvcmVkIGluIHBsYWludGV4dCBpbiBUZW1wb3JhbCBTZXJ2ZXInc1xuICogICBkYXRhYmFzZS5cbiAqIC0gQ29tcHJlc3NpbmcgdmFsdWVzIHRvIHJlZHVjZSBkaXNrIG9yIG5ldHdvcmsgdXNhZ2UuXG4gKlxuICogVG8gdXNlIHlvdXIgY3VzdG9tIGBEYXRhQ29udmVydGVyYCwgcHJvdmlkZSBpdCB0byB0aGUge0BsaW5rIFdvcmtmbG93Q2xpZW50fSwge0BsaW5rIFdvcmtlcn0sIGFuZFxuICoge0BsaW5rIGJ1bmRsZVdvcmtmbG93Q29kZX0gKGlmIHlvdSB1c2UgaXQpOlxuICogLSBgbmV3IFdvcmtmbG93Q2xpZW50KHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgV29ya2VyLmNyZWF0ZSh7IC4uLiwgZGF0YUNvbnZlcnRlciB9KWBcbiAqIC0gYGJ1bmRsZVdvcmtmbG93Q29kZSh7IC4uLiwgcGF5bG9hZENvbnZlcnRlclBhdGggfSlgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBQYXRoIG9mIGEgZmlsZSB0aGF0IGhhcyBhIGBwYXlsb2FkQ29udmVydGVyYCBuYW1lZCBleHBvcnQuXG4gICAqIGBwYXlsb2FkQ29udmVydGVyYCBzaG91bGQgYmUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqIElmIG5vIHBhdGggaXMgcHJvdmlkZWQsIHtAbGluayBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcn0gaXMgdXNlZC5cbiAgICovXG4gIHBheWxvYWRDb252ZXJ0ZXJQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIG9mIGEgZmlsZSB0aGF0IGhhcyBhIGBmYWlsdXJlQ29udmVydGVyYCBuYW1lZCBleHBvcnQuXG4gICAqIGBmYWlsdXJlQ29udmVydGVyYCBzaG91bGQgYmUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgRmFpbHVyZUNvbnZlcnRlcn0uXG4gICAqIElmIG5vIHBhdGggaXMgcHJvdmlkZWQsIHtAbGluayBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcn0gaXMgdXNlZC5cbiAgICovXG4gIGZhaWx1cmVDb252ZXJ0ZXJQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZENvZGVjfSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIFBheWxvYWRzIGFyZSBlbmNvZGVkIGluIHRoZSBvcmRlciBvZiB0aGUgYXJyYXkgYW5kIGRlY29kZWQgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYVxuICAgKiBjb21wcmVzc2lvbiBjb2RlYyBhbmQgYW4gZW5jcnlwdGlvbiBjb2RlYywgdGhlbiB5b3Ugd2FudCBkYXRhIHRvIGJlIGVuY29kZWQgd2l0aCB0aGUgY29tcHJlc3Npb24gY29kZWMgZmlyc3QsIHNvXG4gICAqIHlvdSdkIGRvIGBwYXlsb2FkQ29kZWNzOiBbY29tcHJlc3Npb25Db2RlYywgZW5jcnlwdGlvbkNvZGVjXWAuXG4gICAqL1xuICBwYXlsb2FkQ29kZWNzPzogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGF0YUNvbnZlcnRlcn0gdGhhdCBoYXMgYmVlbiBsb2FkZWQgdmlhIHtAbGluayBsb2FkRGF0YUNvbnZlcnRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRGF0YUNvbnZlcnRlciB7XG4gIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXI7XG4gIGZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXI7XG4gIHBheWxvYWRDb2RlY3M6IFBheWxvYWRDb2RlY1tdO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHtAbGluayBGYWlsdXJlQ29udmVydGVyfSB1c2VkIGJ5IHRoZSBTREsuXG4gKlxuICogRXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyBhcmUgc2VyaXphbGl6ZWQgYXMgcGxhaW4gdGV4dC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyOiBGYWlsdXJlQ29udmVydGVyID0gbmV3IERlZmF1bHRGYWlsdXJlQ29udmVydGVyKCk7XG5cbi8qKlxuICogQSBcImxvYWRlZFwiIGRhdGEgY29udmVydGVyIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBzZXQgb2YgZmFpbHVyZSBhbmQgcGF5bG9hZCBjb252ZXJ0ZXJzLlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdERhdGFDb252ZXJ0ZXI6IExvYWRlZERhdGFDb252ZXJ0ZXIgPSB7XG4gIHBheWxvYWRDb252ZXJ0ZXI6IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBmYWlsdXJlQ29udmVydGVyOiBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgcGF5bG9hZENvZGVjczogW10sXG59O1xuIiwiaW1wb3J0IHtcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBcHBsaWNhdGlvbkZhaWx1cmUsXG4gIENhbmNlbGxlZEZhaWx1cmUsXG4gIENoaWxkV29ya2Zsb3dGYWlsdXJlLFxuICBkZWNvZGVSZXRyeVN0YXRlLFxuICBkZWNvZGVUaW1lb3V0VHlwZSxcbiAgZW5jb2RlUmV0cnlTdGF0ZSxcbiAgZW5jb2RlVGltZW91dFR5cGUsXG4gIEZBSUxVUkVfU09VUkNFLFxuICBQcm90b0ZhaWx1cmUsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7IGlzRXJyb3IgfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvVHMgfSBmcm9tICcuLi90aW1lJztcbmltcG9ydCB7IGFycmF5RnJvbVBheWxvYWRzLCBmcm9tUGF5bG9hZHNBdEluZGV4LCBQYXlsb2FkQ29udmVydGVyLCB0b1BheWxvYWRzIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbmZ1bmN0aW9uIGNvbWJpbmVSZWdFeHAoLi4ucmVnZXhwczogUmVnRXhwW10pOiBSZWdFeHAge1xuICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleHBzLm1hcCgoeCkgPT4gYCg/OiR7eC5zb3VyY2V9KWApLmpvaW4oJ3wnKSk7XG59XG5cbi8qKlxuICogU3RhY2sgdHJhY2VzIHdpbGwgYmUgY3V0b2ZmIHdoZW4gb24gb2YgdGhlc2UgcGF0dGVybnMgaXMgbWF0Y2hlZFxuICovXG5jb25zdCBDVVRPRkZfU1RBQ0tfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogQWN0aXZpdHkgZXhlY3V0aW9uICovXG4gIC9cXHMrYXQgQWN0aXZpdHlcXC5leGVjdXRlIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBhY3RpdmF0aW9uICovXG4gIC9cXHMrYXQgQWN0aXZhdG9yXFwuXFxTK05leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtmbG93W1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVybmFsc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBydW4gYW55dGhpbmcgaW4gY29udGV4dCAqL1xuICAvXFxzK2F0IFNjcmlwdFxcLnJ1bkluQ29udGV4dCBcXCgoPzpub2RlOnZtfHZtXFwuanMpOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQW55IHN0YWNrIHRyYWNlIGZyYW1lcyB0aGF0IG1hdGNoIGFueSBvZiB0aG9zZSB3aWwgYmUgZG9wcGVkLlxuICogVGhlIFwibnVsbC5cIiBwcmVmaXggb24gc29tZSBjYXNlcyBpcyB0byBhdm9pZCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQyNDE3XG4gKi9cbmNvbnN0IERST1BQRURfU1RBQ0tfRlJBTUVTX1BBVFRFUk5TID0gY29tYmluZVJlZ0V4cChcbiAgLyoqIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNoYWluIGludGVyY2VwdG9ycyAqL1xuICAvXFxzK2F0IChudWxsXFwuKT9uZXh0IFxcKC4qW1xcXFwvXWNvbW1vbltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11pbnRlcmNlcHRvcnNcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP2V4ZWN1dGVOZXh0SGFuZGxlciBcXCguKltcXFxcL113b3JrZXJbXFxcXC9dKD86c3JjfGxpYilbXFxcXC9dYWN0aXZpdHlcXC5banRdczpcXGQrOlxcZCtcXCkvXG4pO1xuXG4vKipcbiAqIEN1dHMgb3V0IHRoZSBmcmFtZXdvcmsgcGFydCBvZiBhIHN0YWNrIHRyYWNlLCBsZWF2aW5nIG9ubHkgdXNlciBjb2RlIGVudHJpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1dG9mZlN0YWNrVHJhY2Uoc3RhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IChzdGFjayA/PyAnJykuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgYWNjID0gQXJyYXk8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBpZiAoQ1VUT0ZGX1NUQUNLX1BBVFRFUk5TLnRlc3QobGluZSkpIGJyZWFrO1xuICAgIGlmICghRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMudGVzdChsaW5lKSkgYWNjLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGFjYy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBBIGBGYWlsdXJlQ29udmVydGVyYCBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyBmcm9tIHByb3RvIGBGYWlsdXJlYCBpbnN0YW5jZXMgdG8gSlMgYEVycm9yc2AgYW5kIGJhY2suXG4gKlxuICogV2UgcmVjb21tZW5kZWQgdXNpbmcgdGhlIHtAbGluayBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlcn0gaW5zdGVhZCBvZiBjdXN0b21pemluZyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbiBvcmRlclxuICogdG8gbWFpbnRhaW4gY3Jvc3MtbGFuZ3VhZ2UgRmFpbHVyZSBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZUNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGNhdWdodCBlcnJvciB0byBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZS5cbiAgICovXG4gIGVycm9yVG9GYWlsdXJlKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFByb3RvRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCBlcnJvciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGBUZW1wb3JhbEZhaWx1cmVgLlxuICAgKi9cbiAgZmFpbHVyZVRvRXJyb3IoZXJyOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBUZW1wb3JhbEZhaWx1cmU7XG59XG5cbi8qKlxuICogVGhlIFwic2hhcGVcIiBvZiB0aGUgYXR0cmlidXRlcyBzZXQgYXMgdGhlIHtAbGluayBQcm90b0ZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXN9IHBheWxvYWQgaW4gY2FzZVxuICoge0BsaW5rIERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXMuZW5jb2RlQ29tbW9uQXR0cmlidXRlc30gaXMgc2V0IHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzdGFja190cmFjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJ9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuY29kZSBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIChmb3IgZW5jcnlwdGluZyB0aGVzZSBhdHRyaWJ1dGVzIHVzZSBhIHtAbGluayBQYXlsb2FkQ29kZWN9KS5cbiAgICovXG4gIGVuY29kZUNvbW1vbkF0dHJpYnV0ZXM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVmYXVsdCwgY3Jvc3MtbGFuZ3VhZ2UtY29tcGF0aWJsZSBGYWlsdXJlIGNvbnZlcnRlci5cbiAqXG4gKiBCeSBkZWZhdWx0LCBpdCB3aWxsIGxlYXZlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgYXMgcGxhaW4gdGV4dC4gSW4gb3JkZXIgdG8gZW5jcnlwdCB0aGVtLCBzZXRcbiAqIGBlbmNvZGVDb21tb25BdHRyaWJ1dGVzYCB0byBgdHJ1ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMgYW5kIHVzZSBhIHtAbGluayBQYXlsb2FkQ29kZWN9IHRoYXQgY2FuIGVuY3J5cHQgL1xuICogZGVjcnlwdCBQYXlsb2FkcyBpbiB5b3VyIHtAbGluayBXb3JrZXJPcHRpb25zLmRhdGFDb252ZXJ0ZXIgfCBXb3JrZXJ9IGFuZFxuICoge0BsaW5rIENsaWVudE9wdGlvbnMuZGF0YUNvbnZlcnRlciB8IENsaWVudCBvcHRpb25zfS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRGYWlsdXJlQ29udmVydGVyIGltcGxlbWVudHMgRmFpbHVyZUNvbnZlcnRlciB7XG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IFBhcnRpYWw8RGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zPikge1xuICAgIGNvbnN0IHsgZW5jb2RlQ29tbW9uQXR0cmlidXRlcyB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBlbmNvZGVDb21tb25BdHRyaWJ1dGVzOiBlbmNvZGVDb21tb25BdHRyaWJ1dGVzID8/IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBGYWlsdXJlIHByb3RvIG1lc3NhZ2UgdG8gYSBKUyBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIERvZXMgbm90IHNldCBjb21tb24gcHJvcGVydGllcywgdGhhdCBpcyBkb25lIGluIHtAbGluayBmYWlsdXJlVG9FcnJvcn0uXG4gICAqL1xuICBmYWlsdXJlVG9FcnJvcklubmVyKGZhaWx1cmU6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFRlbXBvcmFsRmFpbHVyZSB7XG4gICAgaWYgKGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby50eXBlLFxuICAgICAgICBCb29sZWFuKGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuc2VydmVyRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgU2VydmVyRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgQm9vbGVhbihmYWlsdXJlLnNlcnZlckZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS50aW1lb3V0RmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgVGltZW91dEZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZyb21QYXlsb2Fkc0F0SW5kZXgocGF5bG9hZENvbnZlcnRlciwgMCwgZmFpbHVyZS50aW1lb3V0RmFpbHVyZUluZm8ubGFzdEhlYXJ0YmVhdERldGFpbHM/LnBheWxvYWRzKSxcbiAgICAgICAgZGVjb2RlVGltZW91dFR5cGUoZmFpbHVyZS50aW1lb3V0RmFpbHVyZUluZm8udGltZW91dFR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS50ZXJtaW5hdGVkRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgVGVybWluYXRlZEZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5jYW5jZWxlZEZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IENhbmNlbGxlZEZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuY2FuY2VsZWRGYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5yZXNldFdvcmtmbG93RmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25GYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICAnUmVzZXRXb3JrZmxvdycsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLnJlc2V0V29ya2Zsb3dGYWlsdXJlSW5mby5sYXN0SGVhcnRiZWF0RGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICBjb25zdCB7IG5hbWVzcGFjZSwgd29ya2Zsb3dUeXBlLCB3b3JrZmxvd0V4ZWN1dGlvbiwgcmV0cnlTdGF0ZSB9ID0gZmFpbHVyZS5jaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm87XG4gICAgICBpZiAoISh3b3JrZmxvd1R5cGU/Lm5hbWUgJiYgd29ya2Zsb3dFeGVjdXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYXR0cmlidXRlcyBvbiBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm8nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUoXG4gICAgICAgIG5hbWVzcGFjZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHdvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICB3b3JrZmxvd1R5cGUubmFtZSxcbiAgICAgICAgZGVjb2RlUmV0cnlTdGF0ZShyZXRyeVN0YXRlKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8pIHtcbiAgICAgIGlmICghZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5VHlwZT8ubmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2aXR5VHlwZT8ubmFtZSBvbiBhY3Rpdml0eUZhaWx1cmVJbmZvJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IEFjdGl2aXR5RmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLmFjdGl2aXR5VHlwZS5uYW1lLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlJZCA/PyB1bmRlZmluZWQsXG4gICAgICAgIGRlY29kZVJldHJ5U3RhdGUoZmFpbHVyZS5hY3Rpdml0eUZhaWx1cmVJbmZvLnJldHJ5U3RhdGUpLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uaWRlbnRpdHkgPz8gdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZW1wb3JhbEZhaWx1cmUoXG4gICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICApO1xuICB9XG5cbiAgZmFpbHVyZVRvRXJyb3IoZmFpbHVyZTogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogVGVtcG9yYWxGYWlsdXJlIHtcbiAgICBpZiAoZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgYXR0cnMgPSBwYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkPERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXM+KGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMpO1xuICAgICAgLy8gRG9uJ3QgYXBwbHkgZW5jb2RlZEF0dHJpYnV0ZXMgdW5sZXNzIHRoZXkgY29uZm9ybSB0byBhbiBleHBlY3RlZCBzY2hlbWFcbiAgICAgIGlmICh0eXBlb2YgYXR0cnMgPT09ICdvYmplY3QnICYmIGF0dHJzICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgc3RhY2tfdHJhY2UgfSA9IGF0dHJzO1xuICAgICAgICAvLyBBdm9pZCBtdXRhdGluZyB0aGUgYXJndW1lbnRcbiAgICAgICAgZmFpbHVyZSA9IHsgLi4uZmFpbHVyZSB9O1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmFpbHVyZS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0YWNrX3RyYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGZhaWx1cmUuc3RhY2tUcmFjZSA9IHN0YWNrX3RyYWNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3JJbm5lcihmYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyKTtcbiAgICBlcnIuc3RhY2sgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgZXJyLmZhaWx1cmUgPSBmYWlsdXJlO1xuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBQcm90b0ZhaWx1cmUge1xuICAgIGNvbnN0IGZhaWx1cmUgPSB0aGlzLmVycm9yVG9GYWlsdXJlSW5uZXIoZXJyLCBwYXlsb2FkQ29udmVydGVyKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuY29kZUNvbW1vbkF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZSwgc3RhY2tUcmFjZSB9ID0gZmFpbHVyZTtcbiAgICAgIGZhaWx1cmUubWVzc2FnZSA9ICdFbmNvZGVkIGZhaWx1cmUnO1xuICAgICAgZmFpbHVyZS5zdGFja1RyYWNlID0gJyc7XG4gICAgICBmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzID0gcGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQoeyBtZXNzYWdlLCBzdGFja190cmFjZTogc3RhY2tUcmFjZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWx1cmU7XG4gIH1cblxuICBlcnJvclRvRmFpbHVyZUlubmVyKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgICAgaWYgKGVyci5mYWlsdXJlKSByZXR1cm4gZXJyLmZhaWx1cmU7XG4gICAgICBjb25zdCBiYXNlID0ge1xuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoZXJyLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2aXR5RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgYWN0aXZpdHlUeXBlOiB7IG5hbWU6IGVyci5hY3Rpdml0eVR5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIC4uLmVycixcbiAgICAgICAgICAgIHJldHJ5U3RhdGU6IGVuY29kZVJldHJ5U3RhdGUoZXJyLnJldHJ5U3RhdGUpLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IGVyci5leGVjdXRpb24sXG4gICAgICAgICAgICB3b3JrZmxvd1R5cGU6IHsgbmFtZTogZXJyLndvcmtmbG93VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhcHBsaWNhdGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICB0eXBlOiBlcnIudHlwZSxcbiAgICAgICAgICAgIG5vblJldHJ5YWJsZTogZXJyLm5vblJldHJ5YWJsZSxcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCAuLi5lcnIuZGV0YWlscykgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmV4dFJldHJ5RGVsYXk6IG1zT3B0aW9uYWxUb1RzKGVyci5uZXh0UmV0cnlEZWxheSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjYW5jZWxlZEZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBkZXRhaWxzOlxuICAgICAgICAgICAgICBlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgLi4uZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0aW1lb3V0RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHRpbWVvdXRUeXBlOiBlbmNvZGVUaW1lb3V0VHlwZShlcnIudGltZW91dFR5cGUpLFxuICAgICAgICAgICAgbGFzdEhlYXJ0YmVhdERldGFpbHM6IGVyci5sYXN0SGVhcnRiZWF0RGV0YWlsc1xuICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzKSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgU2VydmVyRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgc2VydmVyRmFpbHVyZUluZm86IHsgbm9uUmV0cnlhYmxlOiBlcnIubm9uUmV0cnlhYmxlIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVybWluYXRlZEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRlcm1pbmF0ZWRGYWlsdXJlSW5mbzoge30sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBKdXN0IGEgVGVtcG9yYWxGYWlsdXJlXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlID0ge1xuICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICB9O1xuXG4gICAgaWYgKGlzRXJyb3IoZXJyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nKGVyci5tZXNzYWdlKSA/PyAnJyxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoKGVyciBhcyBhbnkpLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBgIFtBIG5vbi1FcnJvciB2YWx1ZSB3YXMgdGhyb3duIGZyb20geW91ciBjb2RlLiBXZSByZWNvbW1lbmQgdGhyb3dpbmcgRXJyb3Igb2JqZWN0cyBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIGEgc3RhY2sgdHJhY2VdYDtcblxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogZXJyICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IG1lc3NhZ2UgKyByZWNvbW1lbmRhdGlvbiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IFN0cmluZyhlcnIpICsgcmVjb21tZW5kYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdCBpZiBkZWZpbmVkIG9yIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cbiAgb3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKFxuICAgIGZhaWx1cmU6IFByb3RvRmFpbHVyZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlclxuICApOiBUZW1wb3JhbEZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmYWlsdXJlID8gdGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBlcnJvciB0byBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSBpZiBkZWZpbmVkIG9yIHJldHVybnMgdW5kZWZpbmVkXG4gICAqL1xuICBvcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZXJyID8gdGhpcy5lcnJvclRvRmFpbHVyZShlcnIsIHBheWxvYWRDb252ZXJ0ZXIpIDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQYXlsb2FkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogYFBheWxvYWRDb2RlY2AgaXMgYW4gb3B0aW9uYWwgc3RlcCB0aGF0IGhhcHBlbnMgYmV0d2VlbiB0aGUgd2lyZSBhbmQgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyfTpcbiAqXG4gKiBUZW1wb3JhbCBTZXJ2ZXIgPC0tPiBXaXJlIDwtLT4gYFBheWxvYWRDb2RlY2AgPC0tPiBgUGF5bG9hZENvbnZlcnRlcmAgPC0tPiBVc2VyIGNvZGVcbiAqXG4gKiBJbXBsZW1lbnQgdGhpcyB0byB0cmFuc2Zvcm0gYW4gYXJyYXkgb2Yge0BsaW5rIFBheWxvYWR9cyB0by9mcm9tIHRoZSBmb3JtYXQgc2VudCBvdmVyIHRoZSB3aXJlIGFuZCBzdG9yZWQgYnkgVGVtcG9yYWwgU2VydmVyLlxuICogQ29tbW9uIHRyYW5zZm9ybWF0aW9ucyBhcmUgZW5jcnlwdGlvbiBhbmQgY29tcHJlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvZGVjIHtcbiAgLyoqXG4gICAqIEVuY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIGZvciBzZW5kaW5nIG92ZXIgdGhlIHdpcmUuXG4gICAqIEBwYXJhbSBwYXlsb2FkcyBNYXkgaGF2ZSBsZW5ndGggMC5cbiAgICovXG4gIGVuY29kZShwYXlsb2FkczogUGF5bG9hZFtdKTogUHJvbWlzZTxQYXlsb2FkW10+O1xuXG4gIC8qKlxuICAgKiBEZWNvZGUgYW4gYXJyYXkgb2Yge0BsaW5rIFBheWxvYWR9cyByZWNlaXZlZCBmcm9tIHRoZSB3aXJlLlxuICAgKi9cbiAgZGVjb2RlKHBheWxvYWRzOiBQYXlsb2FkW10pOiBQcm9taXNlPFBheWxvYWRbXT47XG59XG4iLCJpbXBvcnQgeyBkZWNvZGUsIGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7IFBheWxvYWRDb252ZXJ0ZXJFcnJvciwgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQYXlsb2FkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBlbmNvZGluZ0tleXMsIGVuY29kaW5nVHlwZXMsIE1FVEFEQVRBX0VOQ09ESU5HX0tFWSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBzZXJpYWxpemUvZGVzZXJpYWxpemUgZGF0YSBsaWtlIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZXMuXG4gKlxuICogVGhpcyBpcyBjYWxsZWQgaW5zaWRlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20gfCBXb3JrZmxvdyBpc29sYXRlfS5cbiAqIFRvIHdyaXRlIGFzeW5jIGNvZGUgb3IgdXNlIE5vZGUgQVBJcyAob3IgdXNlIHBhY2thZ2VzIHRoYXQgdXNlIE5vZGUgQVBJcyksIHVzZSBhIHtAbGluayBQYXlsb2FkQ29kZWN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXIge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIFNob3VsZCB0aHJvdyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgdW5hYmxlIHRvIGNvbnZlcnQuXG4gICAqL1xuICB0b1BheWxvYWQ8VD4odmFsdWU6IFQpOiBQYXlsb2FkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVDtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGNvbnZlcnNpb24gb2YgYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVyXG4gKiBAcGFyYW0gdmFsdWVzIEpTIHZhbHVlcyB0byBjb252ZXJ0IHRvIFBheWxvYWRzXG4gKiBAcmV0dXJuIGxpc3Qgb2Yge0BsaW5rIFBheWxvYWR9c1xuICogQHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgY29udmVyc2lvbiBvZiB0aGUgdmFsdWUgcGFzc2VkIGFzIHBhcmFtZXRlciBmYWlsZWQgZm9yIGFueVxuICogICAgIHJlYXNvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUGF5bG9hZHMoY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCAuLi52YWx1ZXM6IHVua25vd25bXSk6IFBheWxvYWRbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gY29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlci50b1BheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIG1hcC5cbiAqXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIGFueSB2YWx1ZSBpbiB0aGUgbWFwIGZhaWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1BheWxvYWRzPEsgZXh0ZW5kcyBzdHJpbmc+KGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgbWFwOiBSZWNvcmQ8SywgYW55Pik6IFJlY29yZDxLLCBQYXlsb2FkPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCB2XSk6IFtLLCBQYXlsb2FkXSA9PiBbayBhcyBLLCBjb252ZXJ0ZXIudG9QYXlsb2FkKHYpXSlcbiAgKSBhcyBSZWNvcmQ8SywgUGF5bG9hZD47XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGFuIGFycmF5IG9mIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIFVzZWZ1bCBmb3IgZGVzZXJpYWxpemluZ1xuICogYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIHBheWxvYWRzXG4gKiBAcGFyYW0gcGF5bG9hZHMgc2VyaWFsaXplZCB2YWx1ZSB0byBjb252ZXJ0IHRvIEpTIHZhbHVlcy5cbiAqIEByZXR1cm4gY29udmVydGVkIEpTIHZhbHVlXG4gKiBAdGhyb3dzIHtAbGluayBQYXlsb2FkQ29udmVydGVyRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIGRhdGEgcGFzc2VkIGFzIHBhcmFtZXRlciBmYWlsZWQgZm9yIGFueVxuICogICAgIHJlYXNvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QYXlsb2Fkc0F0SW5kZXg8VD4oY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBpbmRleDogbnVtYmVyLCBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwpOiBUIHtcbiAgLy8gVG8gbWFrZSBhZGRpbmcgYXJndW1lbnRzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlXG4gIGlmIChwYXlsb2FkcyA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWRzID09PSBudWxsIHx8IGluZGV4ID49IHBheWxvYWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIHJldHVybiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZHNbaW5kZXhdKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGcm9tUGF5bG9hZHMoY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwpOiB1bmtub3duW10ge1xuICBpZiAoIXBheWxvYWRzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBwYXlsb2Fkcy5tYXAoKHBheWxvYWQ6IFBheWxvYWQpID0+IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBGcm9tUGF5bG9hZHM8SyBleHRlbmRzIHN0cmluZz4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgbWFwPzogUmVjb3JkPEssIFBheWxvYWQ+IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogUmVjb3JkPEssIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG1hcCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcCkubWFwKChbaywgcGF5bG9hZF0pOiBbSywgdW5rbm93bl0gPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCBhcyBQYXlsb2FkKTtcbiAgICAgIHJldHVybiBbayBhcyBLLCB2YWx1ZV07XG4gICAgfSlcbiAgKSBhcyBSZWNvcmQ8SywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuIEV4YW1wbGUgdmFsdWVzIGluY2x1ZGUgdGhlIFdvcmtmbG93IGFyZ3Mgc2VudCBmcm9tIHRoZSBDbGllbnQgYW5kIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYSBXb3JrZmxvdyBvciBBY3Rpdml0eS5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQYXlsb2FkfSwgb3IgYHVuZGVmaW5lZGAgaWYgdW5hYmxlIHRvIGNvbnZlcnQuXG4gICAqL1xuICB0b1BheWxvYWQ8VD4odmFsdWU6IFQpOiBQYXlsb2FkIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHtAbGluayBQYXlsb2FkfSBiYWNrIHRvIGEgdmFsdWUuXG4gICAqL1xuICBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVDtcblxuICByZWFkb25seSBlbmNvZGluZ1R5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmllcyB0byBjb252ZXJ0IHZhbHVlcyB0byB7QGxpbmsgUGF5bG9hZH1zIHVzaW5nIHRoZSB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZ31zIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3RvciwgaW4gdGhlIG9yZGVyIHByb3ZpZGVkLlxuICpcbiAqIENvbnZlcnRzIFBheWxvYWRzIHRvIHZhbHVlcyBiYXNlZCBvbiB0aGUgYFBheWxvYWQubWV0YWRhdGEuZW5jb2RpbmdgIGZpZWxkLCB3aGljaCBtYXRjaGVzIHRoZSB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZy5lbmNvZGluZ1R5cGV9XG4gKiBvZiB0aGUgY29udmVydGVyIHRoYXQgY3JlYXRlZCB0aGUgUGF5bG9hZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAgcmVhZG9ubHkgY29udmVydGVyczogUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZ1tdO1xuICByZWFkb25seSBjb252ZXJ0ZXJCeUVuY29kaW5nOiBNYXA8c3RyaW5nLCBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvciguLi5jb252ZXJ0ZXJzOiBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nW10pIHtcbiAgICBpZiAoY29udmVydGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBQYXlsb2FkQ29udmVydGVyRXJyb3IoJ011c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZycpO1xuICAgIH1cblxuICAgIHRoaXMuY29udmVydGVycyA9IGNvbnZlcnRlcnM7XG4gICAgZm9yIChjb25zdCBjb252ZXJ0ZXIgb2YgY29udmVydGVycykge1xuICAgICAgdGhpcy5jb252ZXJ0ZXJCeUVuY29kaW5nLnNldChjb252ZXJ0ZXIuZW5jb2RpbmdUeXBlLCBjb252ZXJ0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byBydW4gYC50b1BheWxvYWQodmFsdWUpYCBvbiBlYWNoIGNvbnZlcnRlciBpbiB0aGUgb3JkZXIgcHJvdmlkZWQgYXQgY29uc3RydWN0aW9uLlxuICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlc3VsdCwgdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiB0aGVyZSBpcyBubyBjb252ZXJ0ZXIgdGhhdCBjYW4gaGFuZGxlIHRoZSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyB0b1BheWxvYWQ8VD4odmFsdWU6IFQpOiBQYXlsb2FkIHtcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0ICR7dmFsdWV9IHRvIHBheWxvYWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZnJvbVBheWxvYWR9IGJhc2VkIG9uIHRoZSBgZW5jb2RpbmdgIG1ldGFkYXRhIG9mIHRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZC5tZXRhZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGluZyA9IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhW01FVEFEQVRBX0VOQ09ESU5HX0tFWV0pO1xuICAgIGNvbnN0IGNvbnZlcnRlciA9IHRoaXMuY29udmVydGVyQnlFbmNvZGluZy5nZXQoZW5jb2RpbmcpO1xuICAgIGlmIChjb252ZXJ0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVua25vd24gZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIEpTIHVuZGVmaW5lZCBhbmQgTlVMTCBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRlZmluZWRQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEw7XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oX2NvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTsgLy8gSnVzdCByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGJpbmFyeSBkYXRhIHR5cGVzIGFuZCBSQVcgUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgQmluYXJ5UGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVc7XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiAoXG4gICAgICAvLyBXcmFwIHdpdGggVWludDhBcnJheSBmcm9tIHRoaXMgY29udGV4dCB0byBlbnN1cmUgYGluc3RhbmNlb2ZgIHdvcmtzXG4gICAgICAoXG4gICAgICAgIGNvbnRlbnQuZGF0YSA/IG5ldyBVaW50OEFycmF5KGNvbnRlbnQuZGF0YS5idWZmZXIsIGNvbnRlbnQuZGF0YS5ieXRlT2Zmc2V0LCBjb250ZW50LmRhdGEubGVuZ3RoKSA6IGNvbnRlbnQuZGF0YVxuICAgICAgKSBhcyBhbnlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBub24tdW5kZWZpbmVkIHZhbHVlcyBhbmQgc2VyaWFsaXplZCBKU09OIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25QYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX0pTT047XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCBqc29uO1xuICAgIHRyeSB7XG4gICAgICBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTixcbiAgICAgIH0sXG4gICAgICBkYXRhOiBlbmNvZGUoanNvbiksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKGNvbnRlbnQuZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGNvbnRlbnQuZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0dvdCBwYXlsb2FkIHdpdGggbm8gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGUoY29udGVudC5kYXRhKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBTZWFyY2ggQXR0cmlidXRlIHZhbHVlcyB1c2luZyBKc29uUGF5bG9hZENvbnZlcnRlclxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG4gIHZhbGlkTm9uRGF0ZVR5cGVzID0gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nXTtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlczogdW5rbm93bik6IFBheWxvYWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgU2VhcmNoQXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBmaXJzdFR5cGUgPSB0eXBlb2YgZmlyc3RWYWx1ZTtcbiAgICAgIGlmIChmaXJzdFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBhcnJheXMgb2Ygc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIERhdGVzLiBUaGUgdmFsdWUgJHt2YWx1ZX0gYXQgaW5kZXggJHtpZHh9IGlzIG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZE5vbkRhdGVUeXBlcy5pbmNsdWRlcyhmaXJzdFR5cGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2lkeCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBmaXJzdFR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgQWxsIFNlYXJjaEF0dHJpYnV0ZSBhcnJheSB2YWx1ZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlLiBUaGUgZmlyc3QgdmFsdWUgJHtmaXJzdFZhbHVlfSBvZiB0eXBlICR7Zmlyc3RUeXBlfSBkb2Vzbid0IG1hdGNoIHZhbHVlICR7dmFsdWV9IG9mIHR5cGUgJHt0eXBlb2YgdmFsdWV9IGF0IGluZGV4ICR7aWR4fWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgdGFrZXMgY2FyZSBvZiBjb252ZXJ0aW5nIERhdGVzIHRvIElTTyBzdHJpbmdzXG4gICAgY29uc3QgcmV0ID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZXMpO1xuICAgIGlmIChyZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHBheWxvYWRzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogRGF0ZXRpbWUgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBgRGF0ZWBzXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZC5tZXRhZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5qc29uQ29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpO1xuICAgIGxldCBhcnJheVdyYXBwZWRWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgY29uc3Qgc2VhcmNoQXR0cmlidXRlVHlwZSA9IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpO1xuICAgIGlmIChzZWFyY2hBdHRyaWJ1dGVUeXBlID09PSAnRGF0ZXRpbWUnKSB7XG4gICAgICBhcnJheVdyYXBwZWRWYWx1ZSA9IGFycmF5V3JhcHBlZFZhbHVlLm1hcCgoZGF0ZVN0cmluZykgPT4gbmV3IERhdGUoZGF0ZVN0cmluZykpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlXcmFwcGVkVmFsdWUgYXMgdW5rbm93biBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyID0gbmV3IFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuZXhwb3J0IGNsYXNzIERlZmF1bHRQYXlsb2FkQ29udmVydGVyIGV4dGVuZHMgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciB7XG4gIC8vIE1hdGNoIHRoZSBvcmRlciB1c2VkIGluIG90aGVyIFNES3MsIGJ1dCBleGNsdWRlIFByb3RvYnVmIGNvbnZlcnRlcnMgc28gdGhhdCB0aGUgY29kZSwgaW5jbHVkaW5nXG4gIC8vIGBwcm90bzMtanNvbi1zZXJpYWxpemVyYCwgZG9lc24ndCB0YWtlIHNwYWNlIGluIFdvcmtmbG93IGJ1bmRsZXMgdGhhdCBkb24ndCB1c2UgUHJvdG9idWZzLiBUbyB1c2UgUHJvdG9idWZzLCB1c2VcbiAgLy8ge0BsaW5rIERlZmF1bHRQYXlsb2FkQ29udmVydGVyV2l0aFByb3RvYnVmc30uXG4gIC8vXG4gIC8vIEdvIFNESzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLWdvL2Jsb2IvNWU1NjQ1ZjBjNTUwZGNmNzE3YzA5NWFlMzJjNzZhNzA4N2QyZTk4NS9jb252ZXJ0ZXIvZGVmYXVsdF9kYXRhX2NvbnZlcnRlci5nbyNMMjhcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIobmV3IFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIoKSwgbmV3IEJpbmFyeVBheWxvYWRDb252ZXJ0ZXIoKSwgbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCkpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy4gU3VwcG9ydHMgYFVpbnQ4QXJyYXlgIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgcGF5bG9hZCBjb252ZXJ0ZXIgd2lsbCB3b3JrKS5cbiAqXG4gKiBUbyBhbHNvIHN1cHBvcnQgUHJvdG9idWZzLCBjcmVhdGUgYSBjdXN0b20gcGF5bG9hZCBjb252ZXJ0ZXIgd2l0aCB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIGBjb25zdCBteUNvbnZlcnRlciA9IG5ldyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcih7IHByb3RvYnVmUm9vdCB9KWBcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKCk7XG4iLCJpbXBvcnQgeyBlbmNvZGUgfSBmcm9tICcuLi9lbmNvZGluZyc7XG5cbmV4cG9ydCBjb25zdCBNRVRBREFUQV9FTkNPRElOR19LRVkgPSAnZW5jb2RpbmcnO1xuZXhwb3J0IGNvbnN0IGVuY29kaW5nVHlwZXMgPSB7XG4gIE1FVEFEQVRBX0VOQ09ESU5HX05VTEw6ICdiaW5hcnkvbnVsbCcsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1JBVzogJ2JpbmFyeS9wbGFpbicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX0pTT046ICdqc29uL3BsYWluJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTjogJ2pzb24vcHJvdG9idWYnLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRjogJ2JpbmFyeS9wcm90b2J1ZicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRW5jb2RpbmdUeXBlID0gKHR5cGVvZiBlbmNvZGluZ1R5cGVzKVtrZXlvZiB0eXBlb2YgZW5jb2RpbmdUeXBlc107XG5cbmV4cG9ydCBjb25zdCBlbmNvZGluZ0tleXMgPSB7XG4gIE1FVEFEQVRBX0VOQ09ESU5HX05VTEw6IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEwpLFxuICBNRVRBREFUQV9FTkNPRElOR19SQVc6IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVyksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX0pTT046IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX0pTT04pLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRl9KU09OOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRl9KU09OKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUY6IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGKSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBNRVRBREFUQV9NRVNTQUdFX1RZUEVfS0VZID0gJ21lc3NhZ2VUeXBlJztcbiIsImltcG9ydCAqIGFzIHRpbWUgZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IHR5cGUgVGltZXN0YW1wLCBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUudHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNOdW1iZXJUb1RzKG1pbGxpcyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIHRpbWUubXNUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb1RzKHN0cjogRHVyYXRpb24gfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5tc09wdGlvbmFsVG9UcyhzdHIpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb051bWJlcih2YWwpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvTnVtYmVyKHZhbDogRHVyYXRpb24pOiBudW1iZXIge1xuICByZXR1cm4gdGltZS5tc1RvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9EYXRlKHRzOiBUaW1lc3RhbXApOiBEYXRlIHtcbiAgcmV0dXJuIHRpbWUudHNUb0RhdGUodHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm9wdGlvbmFsVHNUb0RhdGUodHMpO1xufVxuIiwiLy8gUGFzdGVkIHdpdGggbW9kaWZpY2F0aW9ucyBmcm9tOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYW5vbnljby9GYXN0ZXN0U21hbGxlc3RUZXh0RW5jb2RlckRlY29kZXIvbWFzdGVyL0VuY29kZXJEZWNvZGVyVG9nZXRoZXIuc3JjLmpzXG4vKiBlc2xpbnQgbm8tZmFsbHRocm91Z2g6IDAgKi9cblxuY29uc3QgZnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbmNvbnN0IGVuY29kZXJSZWdleHAgPSAvW1xceDgwLVxcdUQ3ZmZcXHVEQzAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0/L2c7XG5jb25zdCB0bXBCdWZmZXJVMTYgPSBuZXcgVWludDE2QXJyYXkoMzIpO1xuXG5leHBvcnQgY2xhc3MgVGV4dERlY29kZXIge1xuICBkZWNvZGUoaW5wdXRBcnJheU9yQnVmZmVyOiBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaW5wdXRBczggPSBpbnB1dEFycmF5T3JCdWZmZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gaW5wdXRBcnJheU9yQnVmZmVyIDogbmV3IFVpbnQ4QXJyYXkoaW5wdXRBcnJheU9yQnVmZmVyKTtcblxuICAgIGxldCByZXN1bHRpbmdTdHJpbmcgPSAnJyxcbiAgICAgIHRtcFN0ciA9ICcnLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgbmV4dEVuZCA9IDAsXG4gICAgICBjcDAgPSAwLFxuICAgICAgY29kZVBvaW50ID0gMCxcbiAgICAgIG1pbkJpdHMgPSAwLFxuICAgICAgY3AxID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICB0bXAgPSAtMTtcbiAgICBjb25zdCBsZW4gPSBpbnB1dEFzOC5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGxlbk1pbnVzMzIgPSAobGVuIC0gMzIpIHwgMDtcbiAgICAvLyBOb3RlIHRoYXQgdG1wIHJlcHJlc2VudHMgdGhlIDJuZCBoYWxmIG9mIGEgc3Vycm9nYXRlIHBhaXIgaW5jYXNlIGEgc3Vycm9nYXRlIGdldHMgZGl2aWRlZCBiZXR3ZWVuIGJsb2Nrc1xuICAgIGZvciAoOyBpbmRleCA8IGxlbjsgKSB7XG4gICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICBmb3IgKDsgcG9zIDwgbmV4dEVuZDsgaW5kZXggPSAoaW5kZXggKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgICAgY3AwID0gaW5wdXRBczhbaW5kZXhdICYgMHhmZjtcbiAgICAgICAgc3dpdGNoIChjcDAgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBpZiAoY3AxID4+IDYgIT09IDBiMTAgfHwgMGIxMTExMDExMSA8IGNwMCkge1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSAoKGNwMCAmIDBiMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSA1OyAvLyAyMCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IDB4MTAwOyAvLyAga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPDw9IDY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgfD0gKChjcDAgJiAwYjExMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IGNwMSA+PiA2ID09PSAwYjEwID8gKG1pbkJpdHMgKyA0KSB8IDAgOiAyNDsgLy8gMjQgZW5zdXJlcyBpdCBuZXZlciBwYXNzZXMgLT4gYWxsIGludmFsaWQgcmVwbGFjZW1lbnRzXG4gICAgICAgICAgICBjcDAgPSAoY3AwICsgMHgxMDApICYgMHgzMDA7IC8vIGtlZXAgdHJhY2sgb2YgdGggYml0IHNpemVcbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPDw9IDY7XG4gICAgICAgICAgICBjb2RlUG9pbnQgfD0gKChjcDAgJiAwYjExMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSAobWluQml0cyArIDcpIHwgMDtcblxuICAgICAgICAgICAgLy8gTm93LCBwcm9jZXNzIHRoZSBjb2RlIHBvaW50XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBsZW4gJiYgY3AxID4+IDYgPT09IDBiMTAgJiYgY29kZVBvaW50ID4+IG1pbkJpdHMgJiYgY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY3AwID0gY29kZVBvaW50O1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSAoY29kZVBvaW50IC0gMHgxMDAwMCkgfCAwO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb2RlUG9pbnQgLyoweGZmZmYgPCBjb2RlUG9pbnQqLykge1xuICAgICAgICAgICAgICAgIC8vIEJNUCBjb2RlIHBvaW50XG4gICAgICAgICAgICAgICAgLy9uZXh0RW5kID0gbmV4dEVuZCAtIDF8MDtcblxuICAgICAgICAgICAgICAgIHRtcCA9ICgoY29kZVBvaW50ID4+IDEwKSArIDB4ZDgwMCkgfCAwOyAvLyBoaWdoU3Vycm9nYXRlXG4gICAgICAgICAgICAgICAgY3AwID0gKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApIHwgMDsgLy8gbG93U3Vycm9nYXRlICh3aWxsIGJlIGluc2VydGVkIGxhdGVyIGluIHRoZSBzd2l0Y2gtc3RhdGVtZW50KVxuXG4gICAgICAgICAgICAgICAgaWYgKHBvcyA8IDMxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBub3RpY2UgMzEgaW5zdGVhZCBvZiAzMlxuICAgICAgICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSB0bXA7XG4gICAgICAgICAgICAgICAgICBwb3MgPSAocG9zICsgMSkgfCAwO1xuICAgICAgICAgICAgICAgICAgdG1wID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIGVsc2UsIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dEFzOCBhbmQgbGV0IHRtcDAgYmUgZmlsbGVkIGluIGxhdGVyIG9uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFIHRoYXQgY3AxIGlzIGJlaW5nIHVzZWQgYXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgZm9yIHRoZSBzd2FwcGluZyBvZiB0bXAgd2l0aCBjcDBcbiAgICAgICAgICAgICAgICAgIGNwMSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHRtcCA9IGNwMDtcbiAgICAgICAgICAgICAgICAgIGNwMCA9IGNwMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBuZXh0RW5kID0gKG5leHRFbmQgKyAxKSB8IDA7IC8vIGJlY2F1c2Ugd2UgYXJlIGFkdmFuY2luZyBpIHdpdGhvdXQgYWR2YW5jaW5nIHBvc1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb2RlIHBvaW50IG1lYW5zIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgd2l0aCBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgY3AwID4+PSA4O1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIGNwMCAtIDEpIHwgMDsgLy8gcmVzZXQgaW5kZXggIGJhY2sgdG8gd2hhdCBpdCB3YXMgYmVmb3JlXG4gICAgICAgICAgICAgIGNwMCA9IDB4ZmZmZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmluYWxseSwgcmVzZXQgdGhlIHZhcmlhYmxlcyBmb3IgdGhlIG5leHQgZ28tYXJvdW5kXG4gICAgICAgICAgICBtaW5CaXRzID0gMDtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IDA7XG4gICAgICAgICAgICBuZXh0RW5kID0gaW5kZXggPD0gbGVuTWludXMzMiA/IDMyIDogKGxlbiAtIGluZGV4KSB8IDA7XG4gICAgICAgICAgLypjYXNlIDExOlxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICBjYXNlIDk6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBjb2RlUG9pbnQgPyBjb2RlUG9pbnQgPSAwIDogY3AwID0gMHhmZmZkOyAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICBjYXNlIDY6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgY29udGludWU7Ki9cbiAgICAgICAgICBkZWZhdWx0OiAvLyBmaWxsIHdpdGggaW52YWxpZCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIHRtcEJ1ZmZlclUxNltwb3NdID0gY3AwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgIH1cbiAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgfVxuICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZShcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls1XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls4XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMThdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMTldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjFdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjNdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjRdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjZdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjddLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMjldLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzBdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbMzFdXG4gICAgICApO1xuICAgICAgaWYgKHBvcyA8IDMyKSB0bXBTdHIgPSB0bXBTdHIuc2xpY2UoMCwgKHBvcyAtIDMyKSB8IDApOyAvLy0oMzItcG9zKSk7XG4gICAgICBpZiAoaW5kZXggPCBsZW4pIHtcbiAgICAgICAgLy9mcm9tQ2hhckNvZGUuYXBwbHkoMCwgdG1wQnVmZmVyVTE2IDogVWludDhBcnJheSA/ICB0bXBCdWZmZXJVMTYuc3ViYXJyYXkoMCxwb3MpIDogdG1wQnVmZmVyVTE2LnNsaWNlKDAscG9zKSk7XG4gICAgICAgIHRtcEJ1ZmZlclUxNlswXSA9IHRtcDtcbiAgICAgICAgcG9zID0gfnRtcCA+Pj4gMzE7IC8vdG1wICE9PSAtMSA/IDEgOiAwO1xuICAgICAgICB0bXAgPSAtMTtcblxuICAgICAgICBpZiAodG1wU3RyLmxlbmd0aCA8IHJlc3VsdGluZ1N0cmluZy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICh0bXAgIT09IC0xKSB7XG4gICAgICAgIHRtcFN0ciArPSBmcm9tQ2hhckNvZGUodG1wKTtcbiAgICAgIH1cblxuICAgICAgcmVzdWx0aW5nU3RyaW5nICs9IHRtcFN0cjtcbiAgICAgIHRtcFN0ciA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdTdHJpbmc7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmZ1bmN0aW9uIGVuY29kZXJSZXBsYWNlcihub25Bc2NpaUNoYXJzOiBzdHJpbmcpIHtcbiAgLy8gbWFrZSB0aGUgVVRGIHN0cmluZyBpbnRvIGEgYmluYXJ5IFVURi04IGVuY29kZWQgc3RyaW5nXG4gIGxldCBwb2ludCA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgwKSB8IDA7XG4gIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICBpZiAocG9pbnQgPD0gMHhkYmZmKSB7XG4gICAgICBjb25zdCBuZXh0Y29kZSA9IG5vbkFzY2lpQ2hhcnMuY2hhckNvZGVBdCgxKSB8IDA7IC8vIGRlZmF1bHRzIHRvIDAgd2hlbiBOYU4sIGNhdXNpbmcgbnVsbCByZXBsYWNlbWVudCBjaGFyYWN0ZXJcblxuICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgcG9pbnQgPSAoKHBvaW50IDw8IDEwKSArIG5leHRjb2RlIC0gMHgzNWZkYzAwKSB8IDA7XG4gICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZilcbiAgICAgICAgICByZXR1cm4gZnJvbUNoYXJDb2RlKFxuICAgICAgICAgICAgKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gMTIpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgIH1cbiAgfVxuICAvKmlmIChwb2ludCA8PSAweDAwN2YpIHJldHVybiBub25Bc2NpaUNoYXJzO1xuICBlbHNlICovIGlmIChwb2ludCA8PSAweDA3ZmYpIHtcbiAgICByZXR1cm4gZnJvbUNoYXJDb2RlKCgweDYgPDwgNSkgfCAocG9pbnQgPj4gNiksICgweDIgPDwgNikgfCAocG9pbnQgJiAweDNmKSk7XG4gIH0gZWxzZVxuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAoMHhlIC8qMGIxMTEwKi8gPDwgNCkgfCAocG9pbnQgPj4gMTIpLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqL1xuICAgICk7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0RW5jb2RlciB7XG4gIHB1YmxpYyBlbmNvZGUoaW5wdXRTdHJpbmc6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIC8vIDB4YzAgPT4gMGIxMTAwMDAwMDsgMHhmZiA9PiAwYjExMTExMTExOyAweGMwLTB4ZmYgPT4gMGIxMXh4eHh4eFxuICAgIC8vIDB4ODAgPT4gMGIxMDAwMDAwMDsgMHhiZiA9PiAwYjEwMTExMTExOyAweDgwLTB4YmYgPT4gMGIxMHh4eHh4eFxuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAnJyArIGlucHV0U3RyaW5nLFxuICAgICAgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwO1xuICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheSgoKGxlbiA8PCAxKSArIDgpIHwgMCk7XG4gICAgbGV0IHRtcFJlc3VsdDogVWludDhBcnJheTtcbiAgICBsZXQgaSA9IDAsXG4gICAgICBwb3MgPSAwLFxuICAgICAgcG9pbnQgPSAwLFxuICAgICAgbmV4dGNvZGUgPSAwO1xuICAgIGxldCB1cGdyYWRlZGVkQXJyYXlTaXplID0gIVVpbnQ4QXJyYXk7IC8vIG5vcm1hbCBhcnJheXMgYXJlIGF1dG8tZXhwYW5kaW5nXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwLCBwb3MgPSAocG9zICsgMSkgfCAwKSB7XG4gICAgICBwb2ludCA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdChpKSB8IDA7XG4gICAgICBpZiAocG9pbnQgPD0gMHgwMDdmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gcG9pbnQ7XG4gICAgICB9IGVsc2UgaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgICAgICByZXN1bHRbcG9zXSA9ICgweDYgPDwgNSkgfCAocG9pbnQgPj4gNik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2lkZW5DaGVjazoge1xuICAgICAgICAgIGlmICgweGQ4MDAgPD0gcG9pbnQpIHtcbiAgICAgICAgICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgICAgICAgICAgbmV4dGNvZGUgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoKGkgPSAoaSArIDEpIHwgMCkpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICAgICAgICAgIGlmICgweGRjMDAgPD0gbmV4dGNvZGUgJiYgbmV4dGNvZGUgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgICAgLy9wb2ludCA9ICgocG9pbnQgLSAweEQ4MDApPDwxMCkgKyBuZXh0Y29kZSAtIDB4REMwMCArIDB4MTAwMDB8MDtcbiAgICAgICAgICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnQgPiAweGZmZmYpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFtwb3NdID0gKDB4MWUgLyowYjExMTEwKi8gPDwgMykgfCAocG9pbnQgPj4gMTgpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrIHdpZGVuQ2hlY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdXBncmFkZWRlZEFycmF5U2l6ZSAmJiBpIDw8IDEgPCBwb3MgJiYgaSA8PCAxIDwgKChwb3MgLSA3KSB8IDApKSB7XG4gICAgICAgICAgICB1cGdyYWRlZGVkQXJyYXlTaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIHRtcFJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbiAqIDMpO1xuICAgICAgICAgICAgdG1wUmVzdWx0LnNldChyZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdG1wUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcG9zXSA9ICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMik7XG4gICAgICAgIHJlc3VsdFsocG9zID0gKHBvcyArIDEpIHwgMCldID0gKDB4MiAvKjBiMTAqLyA8PCA2KSB8ICgocG9pbnQgPj4gNikgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVaW50OEFycmF5ID8gcmVzdWx0LnN1YmFycmF5KDAsIHBvcykgOiByZXN1bHQuc2xpY2UoMCwgcG9zKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmNvZGVJbnRvKGlucHV0U3RyaW5nOiBzdHJpbmcsIHU4QXJyOiBVaW50OEFycmF5KTogeyB3cml0dGVuOiBudW1iZXI7IHJlYWQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbmNvZGVkU3RyaW5nID0gaW5wdXRTdHJpbmcgPT09IHZvaWQgMCA/ICcnIDogKCcnICsgaW5wdXRTdHJpbmcpLnJlcGxhY2UoZW5jb2RlclJlZ2V4cCwgZW5jb2RlclJlcGxhY2VyKTtcbiAgICBsZXQgbGVuID0gZW5jb2RlZFN0cmluZy5sZW5ndGggfCAwLFxuICAgICAgaSA9IDAsXG4gICAgICBjaGFyID0gMCxcbiAgICAgIHJlYWQgPSAwO1xuICAgIGNvbnN0IHU4QXJyTGVuID0gdThBcnIubGVuZ3RoIHwgMDtcbiAgICBjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0U3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgaWYgKHU4QXJyTGVuIDwgbGVuKSBsZW4gPSB1OEFyckxlbjtcbiAgICBwdXRDaGFyczoge1xuICAgICAgZm9yICg7IGkgPCBsZW47IGkgPSAoaSArIDEpIHwgMCkge1xuICAgICAgICBjaGFyID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgICAgc3dpdGNoIChjaGFyID4+IDQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgIC8vIGV4dGVuc2lvbiBwb2ludHM6XG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBpZiAoKChpICsgMSkgfCAwKSA8IHU4QXJyTGVuKSB7XG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGlmICgoKGkgKyAyKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgLy9pZiAoIShjaGFyID09PSAweEVGICYmIGVuY29kZWRTdHJpbmcuc3Vic3RyKGkrMXwwLDIpID09PSBcIlxceEJGXFx4QkRcIikpXG4gICAgICAgICAgICAgIHJlYWQgPSAocmVhZCArIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGlmICgoKGkgKyAzKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWsgcHV0Q2hhcnM7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWFkID0gcmVhZCArICgoY2hhciA+PiA2KSAhPT0gMikgfDA7XG4gICAgICAgIHU4QXJyW2ldID0gY2hhcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgd3JpdHRlbjogaSwgcmVhZDogaW5wdXRMZW5ndGggPCByZWFkID8gaW5wdXRMZW5ndGggOiByZWFkIH07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIFRleHRFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUocyk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgVWludDhBcnJheSBpbnRvIGEgVVRGLTggc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGUoYTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBUZXh0RGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlKGEpO1xufVxuIiwiaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8qKlxuICogVGhyb3duIGZyb20gY29kZSB0aGF0IHJlY2VpdmVzIGEgdmFsdWUgdGhhdCBpcyB1bmV4cGVjdGVkIG9yIHRoYXQgaXQncyB1bmFibGUgdG8gaGFuZGxlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1ZhbHVlRXJyb3InKVxuZXhwb3J0IGNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgUGF5bG9hZCBDb252ZXJ0ZXIgaXMgbWlzY29uZmlndXJlZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdQYXlsb2FkQ29udmVydGVyRXJyb3InKVxuZXhwb3J0IGNsYXNzIFBheWxvYWRDb252ZXJ0ZXJFcnJvciBleHRlbmRzIFZhbHVlRXJyb3Ige31cblxuLyoqXG4gKiBVc2VkIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgU0RLIHRvIG5vdGUgdGhhdCBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXMgaGFwcGVuZWQuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignSWxsZWdhbFN0YXRlRXJyb3InKVxuZXhwb3J0IGNsYXNzIElsbGVnYWxTdGF0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIFdvcmtmbG93IHdpdGggdGhlIGdpdmVuIElkIGlzIG5vdCBrbm93biB0byBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBJdCBjb3VsZCBiZSBiZWNhdXNlOlxuICogLSBJZCBwYXNzZWQgaXMgaW5jb3JyZWN0XG4gKiAtIFdvcmtmbG93IGlzIGNsb3NlZCAoZm9yIHNvbWUgY2FsbHMsIGUuZy4gYHRlcm1pbmF0ZWApXG4gKiAtIFdvcmtmbG93IHdhcyBkZWxldGVkIGZyb20gdGhlIFNlcnZlciBhZnRlciByZWFjaGluZyBpdHMgcmV0ZW50aW9uIGxpbWl0XG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dOb3RGb3VuZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd05vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgaXMgbm90IGtub3duIHRvIFRlbXBvcmFsIFNlcnZlci5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOYW1lc3BhY2VOb3RGb3VuZEVycm9yJylcbmV4cG9ydCBjbGFzcyBOYW1lc3BhY2VOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgTmFtZXNwYWNlIG5vdCBmb3VuZDogJyR7bmFtZXNwYWNlfSdgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSwgaXNSZWNvcmQsIFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IGNvbnN0IEZBSUxVUkVfU09VUkNFID0gJ1R5cGVTY3JpcHRTREsnO1xuZXhwb3J0IHR5cGUgUHJvdG9GYWlsdXJlID0gdGVtcG9yYWwuYXBpLmZhaWx1cmUudjEuSUZhaWx1cmU7XG5cbmV4cG9ydCBjb25zdCBUaW1lb3V0VHlwZSA9IHtcbiAgU1RBUlRfVE9fQ0xPU0U6ICdTVEFSVF9UT19DTE9TRScsXG4gIFNDSEVEVUxFX1RPX1NUQVJUOiAnU0NIRURVTEVfVE9fU1RBUlQnLFxuICBTQ0hFRFVMRV9UT19DTE9TRTogJ1NDSEVEVUxFX1RPX0NMT1NFJyxcbiAgSEVBUlRCRUFUOiAnSEVBUlRCRUFUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTVEFSVF9UT19DTE9TRX0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NUQVJUX1RPX0NMT1NFOiAnU1RBUlRfVE9fQ0xPU0UnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU0NIRURVTEVfVE9fU1RBUlR9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNDSEVEVUxFX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBIRUFSVEJFQVR9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9IRUFSVEJFQVQ6ICdIRUFSVEJFQVQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRpbWVvdXRUeXBlID0gKHR5cGVvZiBUaW1lb3V0VHlwZSlba2V5b2YgdHlwZW9mIFRpbWVvdXRUeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVUaW1lb3V0VHlwZSwgZGVjb2RlVGltZW91dFR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIFRpbWVvdXRUeXBlLFxuICAnVElNRU9VVF9UWVBFXydcbj4oXG4gIHtcbiAgICBbVGltZW91dFR5cGUuU1RBUlRfVE9fQ0xPU0VdOiAxLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19TVEFSVF06IDIsXG4gICAgW1RpbWVvdXRUeXBlLlNDSEVEVUxFX1RPX0NMT1NFXTogMyxcbiAgICBbVGltZW91dFR5cGUuSEVBUlRCRUFUXTogNCxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4pO1xuXG5leHBvcnQgY29uc3QgUmV0cnlTdGF0ZSA9IHtcbiAgSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG4gIE5PTl9SRVRSWUFCTEVfRkFJTFVSRTogJ05PTl9SRVRSWUFCTEVfRkFJTFVSRScsXG4gIFRJTUVPVVQ6ICdUSU1FT1VUJyxcbiAgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEOiAnTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEJyxcbiAgUkVUUllfUE9MSUNZX05PVF9TRVQ6ICdSRVRSWV9QT0xJQ1lfTk9UX1NFVCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gIENBTkNFTF9SRVFVRVNURUQ6ICdDQU5DRUxfUkVRVUVTVEVEJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTl9QUk9HUkVTU30gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBOT05fUkVUUllBQkxFX0ZBSUxVUkV9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX05PTl9SRVRSWUFCTEVfRkFJTFVSRTogJ05PTl9SRVRSWUFCTEVfRkFJTFVSRScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBUSU1FT1VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9USU1FT1VUOiAnVElNRU9VVCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBSRVRSWV9QT0xJQ1lfTk9UX1NFVH0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfUkVUUllfUE9MSUNZX05PVF9TRVQ6ICdSRVRSWV9QT0xJQ1lfTk9UX1NFVCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTlRFUk5BTF9TRVJWRVJfRVJST1J9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDQU5DRUxfUkVRVUVTVEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9DQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB1bmRlZmluZWRgIGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZXRyeVN0YXRlID0gKHR5cGVvZiBSZXRyeVN0YXRlKVtrZXlvZiB0eXBlb2YgUmV0cnlTdGF0ZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlUmV0cnlTdGF0ZSwgZGVjb2RlUmV0cnlTdGF0ZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICB0eXBlb2YgUmV0cnlTdGF0ZSxcbiAgJ1JFVFJZX1NUQVRFXydcbj4oXG4gIHtcbiAgICBbUmV0cnlTdGF0ZS5JTl9QUk9HUkVTU106IDEsXG4gICAgW1JldHJ5U3RhdGUuTk9OX1JFVFJZQUJMRV9GQUlMVVJFXTogMixcbiAgICBbUmV0cnlTdGF0ZS5USU1FT1VUXTogMyxcbiAgICBbUmV0cnlTdGF0ZS5NQVhJTVVNX0FUVEVNUFRTX1JFQUNIRURdOiA0LFxuICAgIFtSZXRyeVN0YXRlLlJFVFJZX1BPTElDWV9OT1RfU0VUXTogNSxcbiAgICBbUmV0cnlTdGF0ZS5JTlRFUk5BTF9TRVJWRVJfRVJST1JdOiA2LFxuICAgIFtSZXRyeVN0YXRlLkNBTkNFTF9SRVFVRVNURURdOiA3LFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnUkVUUllfU1RBVEVfJ1xuKTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dFeGVjdXRpb24gPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklXb3JrZmxvd0V4ZWN1dGlvbjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGZhaWx1cmVzIHRoYXQgY2FuIGNyb3NzIFdvcmtmbG93IGFuZCBBY3Rpdml0eSBib3VuZGFyaWVzLlxuICpcbiAqICoqTmV2ZXIgZXh0ZW5kIHRoaXMgY2xhc3Mgb3IgYW55IG9mIGl0cyBjaGlsZHJlbi4qKlxuICpcbiAqIFRoZSBvbmx5IGNoaWxkIGNsYXNzIHlvdSBzaG91bGQgZXZlciB0aHJvdyBmcm9tIHlvdXIgY29kZSBpcyB7QGxpbmsgQXBwbGljYXRpb25GYWlsdXJlfS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdUZW1wb3JhbEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlbXBvcmFsRmFpbHVyZSBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBmYWlsdXJlIHRoYXQgY29uc3RydWN0ZWQgdGhpcyBlcnJvci5cbiAgICpcbiAgICogT25seSBwcmVzZW50IGlmIHRoaXMgZXJyb3Igd2FzIGdlbmVyYXRlZCBmcm9tIGFuIGV4dGVybmFsIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmYWlsdXJlPzogUHJvdG9GYWlsdXJlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKiogRXhjZXB0aW9ucyBvcmlnaW5hdGVkIGF0IHRoZSBUZW1wb3JhbCBzZXJ2aWNlLiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdTZXJ2ZXJGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBTZXJ2ZXJGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU6IGJvb2xlYW4sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYHMgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZmFpbHVyZXMgaW4gV29ya2Zsb3dzIGFuZCBBY3Rpdml0aWVzLlxuICpcbiAqIFRoZSB7QGxpbmsgdHlwZX0gcHJvcGVydHkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSB0byBkZXRlcm1pbmUgaWYgYW4gaW5zdGFuY2VcbiAqIG9mIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLiBBbm90aGVyIHdheSB0byBhdm9pZCByZXRyeWluZyBpcyBieSBzZXR0aW5nIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHRvIGB0cnVlYC5cbiAqXG4gKiBJbiBXb3JrZmxvd3MsIGlmIHlvdSB0aHJvdyBhIG5vbi1gQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IFRhc2sgd2lsbCBmYWlsIGFuZCBiZSByZXRyaWVkLiBJZiB5b3UgdGhyb3cgYW5cbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgLCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIHdpbGwgZmFpbC5cbiAqXG4gKiBJbiBBY3Rpdml0aWVzLCB5b3UgY2FuIGVpdGhlciB0aHJvdyBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCBvciBhbm90aGVyIGBFcnJvcmAgdG8gZmFpbCB0aGUgQWN0aXZpdHkgVGFzay4gSW4gdGhlXG4gKiBsYXR0ZXIgY2FzZSwgdGhlIGBFcnJvcmAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuIFRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYXMgZm9sbG93aW5nOlxuICpcbiAqIC0gYHR5cGVgIGlzIHNldCB0byBgZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZWBcbiAqIC0gYG1lc3NhZ2VgIGlzIHNldCB0byBgZXJyb3IubWVzc2FnZWBcbiAqIC0gYG5vblJldHJ5YWJsZWAgaXMgc2V0IHRvIGZhbHNlXG4gKiAtIGBkZXRhaWxzYCBhcmUgc2V0IHRvIG51bGxcbiAqIC0gc3RhY2sgdHJhY2UgaXMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIGVycm9yXG4gKlxuICogV2hlbiBhbiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYW4tYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIGFuIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogRmlyc3QgY2FsbHMge0BsaW5rIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZSB8IGBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUoZXJyb3IpYH0gYW5kIHRoZW4gb3ZlcnJpZGVzIGFueSBmaWVsZHNcbiAgICogcHJvdmlkZWQgaW4gYG92ZXJyaWRlc2AuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IgfCB1bmtub3duLCBvdmVycmlkZXM/OiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCBmYWlsdXJlID0gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKTtcbiAgICBPYmplY3QuYXNzaWduKGZhaWx1cmUsIG92ZXJyaWRlcyk7XG4gICAgcmV0dXJuIGZhaWx1cmU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB3aWxsIGJlIHJldHJ5YWJsZSAodW5sZXNzIGl0cyBgdHlwZWAgaXMgaW5jbHVkZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMpOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlID0gZmFsc2UsIGRldGFpbHMsIG5leHRSZXRyeURlbGF5LCBjYXVzZSB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlLCBkZXRhaWxzLCBjYXVzZSwgbmV4dFJldHJ5RGVsYXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAqICAtIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSUQgaXMgY3VycmVudGx5IHJ1bm5pbmcgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeX0gaXMgYFdPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV9GQUlMYFxuICogIC0gVGhlcmUgaXMgYSBjbG9zZWQgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYFxuICogIC0gVGhlcmUgaXMgY2xvc2VkIFdvcmtmbG93IGluIHRoZSBgQ29tcGxldGVkYCBzdGF0ZSB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElkIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkUmV1c2VQb2xpY3l9XG4gKiAgICBpcyBgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWWBcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvciBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIElmIGBlcnJvcmAgaXMgYWxyZWFkeSBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCwgcmV0dXJucyBgZXJyb3JgLlxuICpcbiAqIE90aGVyd2lzZSwgY29udmVydHMgYGVycm9yYCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGg6XG4gKlxuICogLSBgbWVzc2FnZWA6IGBlcnJvci5tZXNzYWdlYCBvciBgU3RyaW5nKGVycm9yKWBcbiAqIC0gYHR5cGVgOiBgZXJyb3IuY29uc3RydWN0b3IubmFtZWAgb3IgYGVycm9yLm5hbWVgXG4gKiAtIGBzdGFja2A6IGBlcnJvci5zdGFja2Agb3IgYCcnYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yOiB1bmtub3duKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBwbGljYXRpb25GYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB8fCBTdHJpbmcoZXJyb3IpO1xuICBjb25zdCB0eXBlID0gKGlzUmVjb3JkKGVycm9yKSAmJiAoZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZSkpIHx8IHVuZGVmaW5lZDtcbiAgY29uc3QgZmFpbHVyZSA9IEFwcGxpY2F0aW9uRmFpbHVyZS5jcmVhdGUoeyBtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGU6IGZhbHNlIH0pO1xuICBmYWlsdXJlLnN0YWNrID0gKGlzUmVjb3JkKGVycm9yKSAmJiBTdHJpbmcoZXJyb3Iuc3RhY2spKSB8fCAnJztcbiAgcmV0dXJuIGZhaWx1cmU7XG59XG5cbi8qKlxuICogSWYgYGVycmAgaXMgYW4gRXJyb3IgaXQgaXMgdHVybmVkIGludG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuXG4gKlxuICogSWYgYGVycmAgd2FzIGFscmVhZHkgYSBgVGVtcG9yYWxGYWlsdXJlYCwgcmV0dXJucyB0aGUgb3JpZ2luYWwgZXJyb3IuXG4gKlxuICogT3RoZXJ3aXNlIHJldHVybnMgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCBgU3RyaW5nKGVycilgIGFzIHRoZSBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlVGVtcG9yYWxGYWlsdXJlKGVycjogdW5rbm93bik6IFRlbXBvcmFsRmFpbHVyZSB7XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIHJldHVybiBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUoZXJyKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJvb3QgY2F1c2UgbWVzc2FnZSBvZiBnaXZlbiBgZXJyb3JgLlxuICpcbiAqIEluIGNhc2UgYGVycm9yYCBpcyBhIHtAbGluayBUZW1wb3JhbEZhaWx1cmV9LCByZWN1cnNlIHRoZSBgY2F1c2VgIGNoYWluIGFuZCByZXR1cm4gdGhlIHJvb3QgYGNhdXNlLm1lc3NhZ2VgLlxuICogT3RoZXJ3aXNlLCByZXR1cm4gYGVycm9yLm1lc3NhZ2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm9vdENhdXNlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycm9yLmNhdXNlID8gcm9vdENhdXNlKGVycm9yLmNhdXNlKSA6IGVycm9yLm1lc3NhZ2U7XG4gIH1cbiAgcmV0dXJuIGVycm9yTWVzc2FnZShlcnJvcik7XG59XG4iLCIvKipcbiAqIENvbW1vbiBsaWJyYXJ5IGZvciBjb2RlIHRoYXQncyB1c2VkIGFjcm9zcyB0aGUgQ2xpZW50LCBXb3JrZXIsIGFuZC9vciBXb3JrZmxvd1xuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgKiBhcyBlbmNvZGluZyBmcm9tICcuL2VuY29kaW5nJztcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FjdGl2aXR5LW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXIvZGF0YS1jb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXIvZmFpbHVyZS1jb252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb2RlYyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2RlcHJlY2F0ZWQtdGltZSc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhaWx1cmUnO1xuZXhwb3J0IHsgSGVhZGVycywgTmV4dCB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5leHBvcnQgdHlwZSB7IFRpbWVzdGFtcCwgRHVyYXRpb24sIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi90aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3ctb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcblxuLyoqXG4gKiBFbmNvZGUgYSBVVEYtOCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdTgoczogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIHJldHVybiBlbmNvZGluZy5lbmNvZGUocyk7XG59XG5cbi8qKlxuICogRGVjb2RlIGEgVWludDhBcnJheSBpbnRvIGEgVVRGLTggc3RyaW5nXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cihhcnI6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICByZXR1cm4gZW5jb2RpbmcuZGVjb2RlKGFycik7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5tZXNzYWdlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBoZWxwZXJzLmVycm9yTWVzc2FnZShlcnJvcik7XG59XG5cbi8qKlxuICogR2V0IGBlcnJvci5jb2RlYCAob3IgYHVuZGVmaW5lZGAgaWYgbm90IHByZXNlbnQpXG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBoZWxwZXJzLmVycm9yQ29kZShlcnJvcik7XG59XG4iLCJpbXBvcnQgeyBBbnlGdW5jLCBPbWl0TGFzdFBhcmFtIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgUGF5bG9hZCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogVHlwZSBvZiB0aGUgbmV4dCBmdW5jdGlvbiBmb3IgYSBnaXZlbiBpbnRlcmNlcHRvciBmdW5jdGlvblxuICpcbiAqIENhbGxlZCBmcm9tIGFuIGludGVyY2VwdG9yIHRvIGNvbnRpbnVlIHRoZSBpbnRlcmNlcHRpb24gY2hhaW5cbiAqL1xuZXhwb3J0IHR5cGUgTmV4dDxJRiwgRk4gZXh0ZW5kcyBrZXlvZiBJRj4gPSBSZXF1aXJlZDxJRj5bRk5dIGV4dGVuZHMgQW55RnVuYyA/IE9taXRMYXN0UGFyYW08UmVxdWlyZWQ8SUY+W0ZOXT4gOiBuZXZlcjtcblxuLyoqIEhlYWRlcnMgYXJlIGp1c3QgYSBtYXBwaW5nIG9mIGhlYWRlciBuYW1lIHRvIFBheWxvYWQgKi9cbmV4cG9ydCB0eXBlIEhlYWRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPjtcblxuLyoqXG4gKiBDb21wb3NlIGFsbCBpbnRlcmNlcHRvciBtZXRob2RzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQ2FsbGluZyB0aGUgY29tcG9zZWQgZnVuY3Rpb24gcmVzdWx0cyBpbiBjYWxsaW5nIGVhY2ggb2YgdGhlIHByb3ZpZGVkIGludGVyY2VwdG9yLCBpbiBvcmRlciAoZnJvbSB0aGUgZmlyc3QgdG9cbiAqIHRoZSBsYXN0KSwgZm9sbG93ZWQgYnkgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHByb3ZpZGVkIGFzIGFyZ3VtZW50IHRvIGBjb21wb3NlSW50ZXJjZXB0b3JzKClgLlxuICpcbiAqIEBwYXJhbSBpbnRlcmNlcHRvcnMgYSBsaXN0IG9mIGludGVyY2VwdG9yc1xuICogQHBhcmFtIG1ldGhvZCB0aGUgbmFtZSBvZiB0aGUgaW50ZXJjZXB0b3IgbWV0aG9kIHRvIGNvbXBvc2VcbiAqIEBwYXJhbSBuZXh0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBpbnRlcmNlcHRpb24gY2hhaW5cbiAqL1xuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHQgKGltcG9ydGVkIHZpYSBsaWIvaW50ZXJjZXB0b3JzKVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VJbnRlcmNlcHRvcnM8SSwgTSBleHRlbmRzIGtleW9mIEk+KGludGVyY2VwdG9yczogSVtdLCBtZXRob2Q6IE0sIG5leHQ6IE5leHQ8SSwgTT4pOiBOZXh0PEksIE0+IHtcbiAgZm9yIChsZXQgaSA9IGludGVyY2VwdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIGNvbnN0IGludGVyY2VwdG9yID0gaW50ZXJjZXB0b3JzW2ldO1xuICAgIGlmIChpbnRlcmNlcHRvclttZXRob2RdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBuZXh0O1xuICAgICAgLy8gV2UgbG9zZSB0eXBlIHNhZmV0eSBoZXJlIGJlY2F1c2UgVHlwZXNjcmlwdCBjYW4ndCBkZWR1Y2UgdGhhdCBpbnRlcmNlcHRvclttZXRob2RdIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICAvLyB0aGUgc2FtZSB0eXBlIGFzIE5leHQ8SSwgTT5cbiAgICAgIG5leHQgPSAoKGlucHV0OiBhbnkpID0+IChpbnRlcmNlcHRvclttZXRob2RdIGFzIGFueSkoaW5wdXQsIHByZXYpKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXh0O1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuZXhwb3J0IHR5cGUgUGF5bG9hZCA9IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVBheWxvYWQ7XG5cbi8qKiBUeXBlIHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSBXb3JrZmxvdyBgZXhlY3V0ZWAgZnVuY3Rpb24gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmV0dXJuVHlwZSA9IFByb21pc2U8YW55PjtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+IHwgYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1VwZGF0ZVR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICB2YWxpZGF0b3I/OiBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGU7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93U2lnbmFsVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUgPSB7XG4gIGhhbmRsZXI6IFdvcmtmbG93U2lnbmFsVHlwZTtcbiAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93UXVlcnlUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSA9IHsgaGFuZGxlcjogV29ya2Zsb3dRdWVyeVR5cGU7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQnJvYWQgV29ya2Zsb3cgZnVuY3Rpb24gZGVmaW5pdGlvbiwgc3BlY2lmaWMgV29ya2Zsb3dzIHdpbGwgdHlwaWNhbGx5IHVzZSBhIG5hcnJvd2VyIHR5cGUgZGVmaW5pdGlvbiwgZS5nOlxuICogYGBgdHNcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93ID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBXb3JrZmxvd1JldHVyblR5cGU7XG5cbmRlY2xhcmUgY29uc3QgYXJnc0JyYW5kOiB1bmlxdWUgc3ltYm9sO1xuZGVjbGFyZSBjb25zdCByZXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgdXBkYXRlIGRlZmluaXRpb24sIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVVwZGF0ZX1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHVwZGF0ZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAndXBkYXRlJztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IGFyZ3MuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbYXJnc0JyYW5kXTogQXJncztcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFVwZGF0ZURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFtyZXRCcmFuZF06IFJldDtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgc2lnbmFsIGRlZmluaXRpb24sIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVNpZ25hbH1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHNpZ25hbCBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbERlZmluaXRpb248QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3NpZ25hbCc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBTaWduYWxEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHF1ZXJ5IGRlZmluaXRpb24gYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lUXVlcnl9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGFuZCBgUmV0YCBjYW4gYmUgdXNlZCBmb3IgcGFyYW1ldGVyIHR5cGUgaW5mZXJlbmNlIGluIGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBXb3JrZmxvd0hhbmRsZSBtZXRob2RzLlxuICogYE5hbWVgIGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCB3aXRoIGEgc3RyaW5nIGxpdGVyYWwgdHlwZSB0byBwcmVzZXJ2ZSB0eXBlLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgcXVlcnkgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAncXVlcnknO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBRdWVyeURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IHJldHVybiB0eXBlcy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFtyZXRCcmFuZF06IFJldDtcbn1cblxuLyoqIEdldCB0aGUgXCJ1bndyYXBwZWRcIiByZXR1cm4gdHlwZSAod2l0aG91dCBQcm9taXNlKSBvZiB0aGUgZXhlY3V0ZSBoYW5kbGVyIGZyb20gV29ya2Zsb3cgdHlwZSBgV2AgKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93UmVzdWx0VHlwZTxXIGV4dGVuZHMgV29ya2Zsb3c+ID0gUmV0dXJuVHlwZTxXPiBleHRlbmRzIFByb21pc2U8aW5mZXIgUj4gPyBSIDogbmV2ZXI7XG5cbi8qKlxuICogSWYgYW5vdGhlciBTREsgY3JlYXRlcyBhIFNlYXJjaCBBdHRyaWJ1dGUgdGhhdCdzIG5vdCBhbiBhcnJheSwgd2Ugd3JhcCBpdCBpbiBhbiBhcnJheS5cbiAqXG4gKiBEYXRlcyBhcmUgc2VyaWFsaXplZCBhcyBJU08gc3RyaW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlcyA9IFJlY29yZDxzdHJpbmcsIFNlYXJjaEF0dHJpYnV0ZVZhbHVlIHwgUmVhZG9ubHk8U2VhcmNoQXR0cmlidXRlVmFsdWU+IHwgdW5kZWZpbmVkPjtcbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVbXTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUZ1bmN0aW9uPFAgZXh0ZW5kcyBhbnlbXSA9IGFueVtdLCBSID0gYW55PiB7XG4gICguLi5hcmdzOiBQKTogUHJvbWlzZTxSPjtcbn1cblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqIEBkZXByZWNhdGVkIG5vdCByZXF1aXJlZCBhbnltb3JlLCBmb3IgdW50eXBlZCBhY3Rpdml0aWVzIHVzZSB7QGxpbmsgVW50eXBlZEFjdGl2aXRpZXN9XG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5SW50ZXJmYWNlID0gUmVjb3JkPHN0cmluZywgQWN0aXZpdHlGdW5jdGlvbj47XG5cbi8qKlxuICogTWFwcGluZyBvZiBBY3Rpdml0eSBuYW1lIHRvIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFVudHlwZWRBY3Rpdml0aWVzID0gUmVjb3JkPHN0cmluZywgQWN0aXZpdHlGdW5jdGlvbj47XG5cbi8qKlxuICogQSB3b3JrZmxvdydzIGhpc3RvcnkgYW5kIElELiBVc2VmdWwgZm9yIHJlcGxheS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5QW5kV29ya2Zsb3dJZCB7XG4gIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgaGlzdG9yeTogdGVtcG9yYWwuYXBpLmhpc3RvcnkudjEuSGlzdG9yeSB8IHVua25vd24gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUG9saWN5IGRlZmluaW5nIGFjdGlvbnMgdGFrZW4gd2hlbiBhIHdvcmtmbG93IGV4aXRzIHdoaWxlIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlcnMgYXJlIHJ1bm5pbmcuXG4gKiBUaGUgd29ya2Zsb3cgZXhpdCBtYXkgYmUgZHVlIHRvIHN1Y2Nlc3NmdWwgcmV0dXJuLCBmYWlsdXJlLCBjYW5jZWxsYXRpb24sIG9yIGNvbnRpbnVlLWFzLW5ldy5cbiAqL1xuZXhwb3J0IGNvbnN0IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5ID0ge1xuICAvKipcbiAgICogSXNzdWUgYSB3YXJuaW5nIGluIGFkZGl0aW9uIHRvIGFiYW5kb25pbmcgdGhlIGhhbmRsZXIgZXhlY3V0aW9uLiBUaGUgd2FybmluZyB3aWxsIG5vdCBiZSBpc3N1ZWQgaWYgdGhlIHdvcmtmbG93IGZhaWxzLlxuICAgKi9cbiAgV0FSTl9BTkRfQUJBTkRPTjogJ1dBUk5fQU5EX0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBBYmFuZG9uIHRoZSBoYW5kbGVyIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogSW4gdGhlIGNhc2Ugb2YgYW4gdXBkYXRlIGhhbmRsZXIgdGhpcyBtZWFucyB0aGF0IHRoZSBjbGllbnQgd2lsbCByZWNlaXZlIGFuIGVycm9yIHJhdGhlciB0aGFuXG4gICAqIHRoZSB1cGRhdGUgcmVzdWx0LlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5ID0gKHR5cGVvZiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSlba2V5b2YgdHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5XTtcbiIsImltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgRXhhY3QsIFJlbW92ZVByZWZpeCwgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5cbi8qKlxuICogQ3JlYXRlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIHRoZSBudW1lcmljIGBlbnVtYCB0eXBlcyBwcm9kdWNlZCBieSBvdXJcbiAqIFByb3RvYnVmIGNvbXBpbGVyIGFuZCBcImNvbnN0IG9iamVjdCBvZiBzdHJpbmdzXCIgZW51bSB2YWx1ZXMgdGhhdCB3ZSBleHBvc2UgaW4gb3VyIHB1YmxpYyBBUElzLlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqIE5ld2x5IGludHJvZHVjZWQgZW51bXMgc2hvdWxkIGZvbGxvdyB0aGUgZm9sbG93aW5nIHBhdHRlcm46XG4gKlxuICogYGBgdHNcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqICAgICBjb25zdCBQYXJlbnRDbG9zZVBvbGljeSA9IHtcbiAqICAgICAgIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG4gKiAgICAgICBBQkFORE9OOiAnQUJBTkRPTicsXG4gKiAgICAgICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcbiAqICAgICB9IGFzIGNvbnN0O1xuICpcbiAqICAgICBjb25zdCBbZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksIGRlY29kZVBhcmVudENsb3NlUG9saWN5XSA9IC8vXG4gKiAgICAgICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAqICAgICAgICAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgICdQQVJFTlRfQ0xPU0VfUE9MSUNZXycgIC8vIFRoaXMgbWF5IGJlIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcHJvdG8gZW51bSBkb2Vzbid0IGFkZCBhIHJlcGVhdGVkIHByZWZpeCBvbiB2YWx1ZXNcbiAqICAgICAgID4oXG4gKiAgICAgICAgIHtcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFXTogMSwgLy8gVGhlc2UgbnVtYmVycyBtdXN0IG1hdGNoIHRoZSBvbmVzIGluIHRoZSBwcm90byBlbnVtXG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LkFCQU5ET05dOiAyLFxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5SRVFVRVNUX0NBTkNFTF06IDMsXG4gKlxuICogICAgICAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICogICAgICAgICB9IGFzIGNvbnN0LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4gKiAgICAgICApO1xuICogYGBgXG4gKlxuICogYG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzYCBzdXBwb3J0cyBvdGhlciB1c2FnZSBwYXR0ZXJucywgYnV0IHRoZXkgYXJlIG9ubHkgbWVhbnQgZm9yXG4gKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZm9ybWVyIGVudW0gZGVmaW5pdGlvbnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgbmV3IGVudW1zLlxuICpcbiAqICMjIyBDb250ZXh0XG4gKlxuICogVGVtcG9yYWwncyBQcm90b2J1ZiBBUElzIGRlZmluZSBzZXZlcmFsIGBlbnVtYCB0eXBlczsgb3VyIFByb3RvYnVmIGNvbXBpbGVyIHRyYW5zZm9ybXMgdGhlc2UgdG9cbiAqIHRyYWRpdGlvbmFsIChpLmUuIG5vbi1jb25zdCkgW1R5cGVTY3JpcHQgbnVtZXJpYyBgZW51bWBzXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9lbnVtcy5odG1sI251bWVyaWMtZW51bXMpLlxuICpcbiAqIEZvciB2YXJpb3VzIHJlYXNvbnMsIHRoaXMgaXMgZmFyIGZyb20gaWRlYWw6XG4gKlxuICogIC0gRHVlIHRvIHRoZSBkdWFsIG5hdHVyZSBvZiBub24tY29uc3QgVHlwZVNjcmlwdCBgZW51bWBzICh0aGV5IGFyZSBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSksXG4gKiAgICBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVmZXIgdG8gYW4gZW51bSB2YWx1ZSBmcm9tIGNvZGUgd2l0aG91dCBhIFwicmVhbFwiIGltcG9ydCBvZiB0aGUgZW51bSB0eXBlXG4gKiAgICAoaS5lLiBjYW4ndCBzaW1wbHkgZG8gYGltcG9ydCB0eXBlIC4uLmApLiBJbiBXb3JrZmxvdyBjb2RlLCBzdWNoIGFuIGltcG9ydCB3b3VsZCByZXN1bHQgaW5cbiAqICAgIGxvYWRpbmcgb3VyIGVudGlyZSBQcm90b2J1ZiBkZWZpbml0aW9ucyBpbnRvIHRoZSB3b3JrZmxvdyBzYW5kYm94LCBhZGRpbmcgc2V2ZXJhbCBtZWdhYnl0ZXMgdG9cbiAqICAgIHRoZSBwZXItd29ya2Zsb3cgbWVtb3J5IGZvb3RwcmludCwgd2hpY2ggaXMgdW5hY2NlcHRhYmxlOyB0byBhdm9pZCB0aGF0LCB3ZSBuZWVkIHRvIG1haW50YWluXG4gKiAgICBhIG1pcnJvciBjb3B5IG9mIGVhY2ggZW51bSB0eXBlcyB1c2VkIGJ5IGluLXdvcmtmbG93IEFQSXMsIGFuZCBleHBvcnQgdGhlc2UgZnJvbSBlaXRoZXJcbiAqICAgIGBAdGVtcG9yYWxpby9jb21tb25gIG9yIGBAdGVtcG9yYWxpby93b3JrZmxvd2AuXG4gKiAgLSBJdCBpcyBub3QgZGVzaXJhYmxlIGZvciB1c2VycyB0byBuZWVkIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgb24gYEB0ZW1wb3JhbGlvL3Byb3RvYCBqdXN0IHRvXG4gKiAgICBnZXQgYWNjZXNzIHRvIHRoZXNlIGVudW0gdHlwZXM7IHdlIHRoZXJlZm9yZSBtYWRlIGl0IGEgY29tbW9uIHByYWN0aWNlIHRvIHJlZXhwb3J0IHRoZXNlIGVudW1zXG4gKiAgICBmcm9tIG91ciBwdWJsaWMgZmFjaW5nIHBhY2thZ2VzLiBIb3dldmVyLCBleHBlcmllbmNlIGRlbW9udHJhdGVkIHRoYXQgdGhlc2UgcmVleHBvcnRzIGVmZmVjdGl2ZWx5XG4gKiAgICByZXN1bHRlZCBpbiBwb29yIGFuZCBpbmNvbnNpc3RlbnQgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBjb21wYXJlZCB0byBtaXJyb3JlZCBlbnVtcyB0eXBlcy5cbiAqICAtIE91ciBQcm90b2J1ZiBlbnVtIHR5cGVzIHRlbmQgdG8gZm9sbG93IGEgdmVyYm9zZSBhbmQgcmVkdW5kYW50IG5hbWluZyBjb252ZW50aW9uLCB3aGljaCBmZWVsc1xuICogICAgdW5hdHVyYWwgYW5kIGV4Y2Vzc2l2ZSBhY2NvcmRpbmcgdG8gbW9zdCBUeXBlU2NyaXB0IHN0eWxlIGd1aWRlczsgZS5nLiBpbnN0ZWFkIG9mXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1JFSkVDVF9EVVBMSUNBVEVgLFxuICogICAgYSBUeXBlU2NyaXB0IGRldmVsb3BlciB3b3VsZCBnZW5lcmFsbHkgZXhwZWN0IHRvIGJlIGFibGUgdG8gd3JpdGUgc29tZXRoaW5nIHNpbWlsYXIgdG9cbiAqICAgIGB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6ICdSRUpFQ1RfRFVQTElDQVRFJ2AuXG4gKiAgLSBCZWNhdXNlIG9mIHRoZSB3YXkgUHJvdG9idWYgd29ya3MsIG1hbnkgb2Ygb3VyIGVudW0gdHlwZXMgY29udGFpbiBhbiBgVU5TUEVDSUZJRURgIHZhbHVlLCB3aGljaFxuICogICAgaXMgdXNlZCB0byBleHBsaWNpdGx5IGlkZW50aWZ5IGEgdmFsdWUgdGhhdCBpcyB1bnNldC4gSW4gVHlwZVNjcmlwdCBjb2RlLCB0aGUgYHVuZGVmaW5lZGAgdmFsdWVcbiAqICAgIGFscmVhZHkgc2VydmVzIHRoYXQgcHVycG9zZSwgYW5kIGlzIGRlZmluaXRlbHkgbW9yZSBpZGlvbWF0aWMgdG8gVFMgZGV2ZWxvcGVycywgd2hlcmVhcyB0aGVzZVxuICogICAgYFVOU1BFQ0lGSUVEYCB2YWx1ZXMgY3JlYXRlIG5vaXNlIGFuZCBjb25mdXNpb24gaW4gb3VyIEFQSXMuXG4gKiAgLSBUeXBlU2NyaXB0IGVkaXRvcnMgZ2VuZXJhbGx5IGRvIGEgdmVyeSBiYWQgam9iIGF0IHByb3ZpZGluZyBhdXRvY29tcGxldGlvbiB0aGF0IGltcGxpZXMgcmVhY2hpbmdcbiAqICAgIGZvciB2YWx1ZXMgb2YgYSBUeXBlU2NyaXB0IGVudW0gdHlwZSwgZm9yY2luZyBkZXZlbG9wZXJzIHRvIGV4cGxpY2l0bHkgdHlwZSBpbiBhdCBsZWFzdCBwYXJ0XG4gKiAgICBvZiB0aGUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIGJlZm9yZSB0aGV5IGNhbiBnZXQgYXV0b2NvbXBsZXRpb24gZm9yIGl0cyB2YWx1ZXMuIE9uIHRoZSBvdGhlclxuICogICAgaGFuZCwgYWxsIFRTIGVkaXRvcnMgaW1tZWRpYXRlbHkgcHJvdmlkZSBhdXRvY29tcGxldGlvbiBmb3Igc3RyaW5nIHVuaW9uIHR5cGVzLlxuICogIC0gVGhlIFtUeXBlU2NyaXB0J3Mgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNvYmplY3RzLXZzLWVudW1zKVxuICogICAgaXRzZWxmIHN1Z2dlc3RzIHRoYXQsIGluIG1vZGVybiBUeXBlU2NyaXB0LCB0aGUgdXNlIG9mIGBhcyBjb25zdGAgb2JqZWN0cyBtYXkgZ2VuZXJhbGx5IHN1ZmZpY2VcbiAqICAgIGFuZCBtYXkgYmUgYWR2YW50YWdlb3VzIG92ZXIgdGhlIHVzZSBvZiBgZW51bWAgdHlwZXMuXG4gKlxuICogQSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncywgY29tYmluZWQgd2l0aCBhIHVuaW9uIHR5cGUgb2YgcG9zc2libGUgc3RyaW5nIHZhbHVlcywgcHJvdmlkZXMgYSBtdWNoXG4gKiBtb3JlIGlkaW9tYXRpYyBzeW50YXggYW5kIGEgYmV0dGVyIERYIGZvciBUeXBlU2NyaXB0IGRldmVsb3BlcnMuIFRoaXMgaG93ZXZlciByZXF1aXJlcyBhIHdheSB0b1xuICogY29udmVydCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSBgZW51bWAgdmFsdWVzIHByb2R1Y2VkIGJ5IHRoZSBQcm90b2J1ZiBjb21waWxlciBhbmQgdGhlXG4gKiBlcXVpdmFsZW50IHN0cmluZyB2YWx1ZXMuXG4gKlxuICogVGhpcyBoZWxwZXIgZHluYW1pY2FsbHkgY3JlYXRlcyB0aGVzZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgYSBnaXZlbiBQcm90b2J1ZiBlbnVtIHR5cGUsXG4gKiBzdHJvbmdseSBidWlsZGluZyB1cG9uIHNwZWNpZmljIGNvbnZlbnRpb25zIHRoYXQgd2UgaGF2ZSBhZG9wdGVkIGluIG91ciBQcm90b2J1ZiBkZWZpbml0aW9ucy5cbiAqXG4gKiAjIyMgVmFsaWRhdGlvbnNcbiAqXG4gKiBUaGUgY29tcGxleCB0eXBlIHNpZ25hdHVyZSBvZiB0aGlzIGhlbHBlciBpcyB0aGVyZSB0byBwcmV2ZW50IG1vc3QgcG90ZW50aWFsIGluY29oZXJlbmNpZXNcbiAqIHRoYXQgY291bGQgcmVzdWx0IGZyb20gaGF2aW5nIHRvIG1hbnVhbGx5IHN5bmNocm9uaXplIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIGFuZCB0aGVcbiAqIGNvbnZlcnNpb24gdGFibGUgd2l0aCB0aGUgcHJvdG8gZW51bSwgd2hpbGUgbm90IHJlcXVpcmluZyBhIHJlZ3VsYXIgaW1wb3J0IG9uIHRoZSBQcm90b2J1ZiBlbnVtXG4gKiBpdHNlbGYgKHNvIGl0IGNhbiBiZSB1c2VkIHNhZmVseSBmb3IgZW51bXMgbWVhbnQgdG8gYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvZGUpLlxuICpcbiAqIEluIHBhcnRpY3VsYXIsIGZhaWxpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyB3aWxsIHJlc3VsdCBpbiBidWlsZCB0aW1lIGVycm9yczpcbiAqXG4gKiAtIEZvciBldmVyeSBrZXkgb2YgdGhlIGZvcm0gYFBSRUZJWF9LRVk6IG51bWJlcmAgaW4gdGhlIHByb3RvIGVudW0sIGV4Y2x1ZGluZyB0aGUgYFVOU1BFQ0lGSUVEYCBrZXk6XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogJ0tFWSdgIGVudHJ5IGluIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtO1xuICogICAtIFRoZXJlIE1BWSBiZSBhIGNvcnJlc3BvbmRpbmcgYFBSRUZJWF9LRVk6ICdLRVknYCBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogICAgICh0aGlzIGlzIG1lYW50IHRvIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZm9ybWVyIHN5bnRheDsgc3VjaCBhbGlhc2VzIHNob3VsZFxuICogICAgIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGFuZCBlbnVtIGVudHJpZXMgaW50cm9kdWNlZCBnb2luZyBmb3J3YXJkKTtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGEgY29ycmVzcG9uZGluZyBgS0VZOiBudW1iZXJgIGluIHRoZSBtYXBwaW5nIHRhYmxlLlxuICogLSBJZiB0aGUgcHJvdG8gZW51bSBjb250YWlucyBhIGBQUkVGSVhfVU5TUEVDSUZJRURgIGVudHJ5LCB0aGVuOlxuICogICAtIFRoZXJlIE1BWSBiZSBhIGNvcnJlc3BvbmRpbmcgYFBSRUZJWF9VTlNQRUNJRklFRDogdW5kZWZpbmVkYCBhbmQvb3IgYFVOU1BFQ0lGSUVEOiB1bmRlZmluZWRgXG4gKiAgICAgZW50cmllcyBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSDigJQgdGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gKiAgICAgd2l0aCB0aGUgZm9ybWVyIHN5bnRheDsgdGhpcyBhbGlhcyBzaG91bGQgbm90IGJlIGFkZGVkIGZvciBuZXcgZW51bXMgaW50cm9kdWNlZCBnb2luZyBmb3J3YXJkO1xuICogICAtIFRoZXJlIE1VU1QgYmUgYW4gYFVOU1BFQ0lGSUVEOiAwYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gVGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0gTVVTVCBOT1QgY29udGFpbiBhbnkgb3RoZXIga2V5cyB0aGFuIHRoZSBvbmVzIG1hbmRhdGVkIG9yXG4gKiAgIG9wdGlvbmFsbHkgYWxsb3dlZCBiZSB0aGUgcHJlY2VlZGluZyBydWxlcy5cbiAqIC0gVGhlIG1hcHBpbmcgdGFibGUgTVVTVCBOT1QgY29udGFpbiBhbnkgb3RoZXIga2V5cyB0aGFuIHRoZSBvbmVzIG1hbmRhdGVkIGFib3ZlLlxuICpcbiAqIFRoZXNlIHJ1bGVzIG5vdGFibHkgZW5zdXJlIHRoYXQgd2hlbmV2ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgUHJvdG8gZW51bSwgdGhlIGNvZGVcbiAqIHdpbGwgZmFpbCB0byBjb21waWxlIHVudGlsIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGlzIGFkZGVkIG9uIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtXG4gKiBhbmQgdGhlIG1hcHBpbmcgdGFibGUuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFN0cmluZ0VudW1UeXBlQWN0dWFsIGV4dGVuZHMgRXhhY3Q8U3RyaW5nRW51bVR5cGUsIFN0cmluZ0VudW1UeXBlQWN0dWFsPixcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICAvL1xuICAvLyBQYXJhbWV0ZXJzIGFmdGVyIHRoaXMgcG9pbnQgd2lsbCBiZSBpbmZlcnJlZDsgdGhleSdyZSBub3QgbWVhbnQgbm90IHRvIGJlIHNwZWNpZmllZCBieSBkZXZlbG9wZXJzXG4gIFVuc3BlY2lmaWVkID0gUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fVVOU1BFQ0lGSUVEYCA/ICdVTlNQRUNJRklFRCcgOiBuZXZlcixcbiAgU2hvcnRTdHJpbmdFbnVtS2V5IGV4dGVuZHMgUmVtb3ZlUHJlZml4PFByZWZpeCwgUHJvdG9FbnVtS2V5PiA9IEV4Y2x1ZGU8XG4gICAgUmVtb3ZlUHJlZml4PFByZWZpeCwgUHJvdG9FbnVtS2V5PixcbiAgICBVbnNwZWNpZmllZFxuICA+LFxuICBTdHJpbmdFbnVtVHlwZSBleHRlbmRzIFByb3RvQ29uc3RPYmplY3RPZlN0cmluZ3NFbnVtPFxuICAgIFNob3J0U3RyaW5nRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWRcbiAgPiA9IFByb3RvQ29uc3RPYmplY3RPZlN0cmluZ3NFbnVtPFNob3J0U3RyaW5nRW51bUtleSwgUHJlZml4LCBVbnNwZWNpZmllZD4sXG4gIE1hcFRhYmxlIGV4dGVuZHMgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4gPSBQcm90b0VudW1Ub0NvbnN0T2JqZWN0T2ZTdHJpbmdNYXBUYWJsZTxcbiAgICBTdHJpbmdFbnVtVHlwZSxcbiAgICBQcm90b0VudW1WYWx1ZSxcbiAgICBQcm90b0VudW0sXG4gICAgUHJvdG9FbnVtS2V5LFxuICAgIFByZWZpeCxcbiAgICBVbnNwZWNpZmllZCxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXlcbiAgPixcbj4oXG4gIG1hcFRhYmxlOiBNYXBUYWJsZSxcbiAgcHJlZml4OiBQcmVmaXhcbik6IFtcbiAgKFxuICAgIGlucHV0OiBTaG9ydFN0cmluZ0VudW1LZXkgfCBgJHtQcmVmaXh9JHtTaG9ydFN0cmluZ0VudW1LZXl9YCB8IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApID0+IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkLCAvL1xuICAoaW5wdXQ6IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gU2hvcnRTdHJpbmdFbnVtS2V5IHwgdW5kZWZpbmVkLCAvL1xuXSB7XG4gIGNvbnN0IHJldmVyc2VUYWJsZTogUmVjb3JkPFByb3RvRW51bVZhbHVlLCBTaG9ydFN0cmluZ0VudW1LZXk+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG1hcFRhYmxlKS5tYXAoKFtrLCB2XSkgPT4gW3YsIGtdKVxuICApO1xuICBjb25zdCBoYXNVbnNwZWNpZmllZCA9IChtYXBUYWJsZSBhcyBhbnkpWydVTlNQRUNJRklFRCddID09PSAwIHx8IChtYXBUYWJsZSBhcyBhbnkpW2Ake3ByZWZpeH1VTlNQRUNJRklFRGBdID09PSAwO1xuXG4gIGZ1bmN0aW9uIGlzU2hvcnRTdHJpbmdFbnVtS2V5cyh4OiB1bmtub3duKTogeCBpcyBTaG9ydFN0cmluZ0VudW1LZXkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiYgeCBpbiBtYXBUYWJsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTnVtZXJpY0VudW1WYWx1ZSh4OiB1bmtub3duKTogeCBpcyBQcm90b0VudW1ba2V5b2YgUHJvdG9FbnVtXSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnbnVtYmVyJyAmJiB4IGluIHJldmVyc2VUYWJsZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuY29kZShcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogUHJvdG9FbnVtVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IHNob3J0ZW46IHN0cmluZyA9IGlucHV0O1xuICAgICAgaWYgKHNob3J0ZW4uc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIHNob3J0ZW4gPSBzaG9ydGVuLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2hvcnRTdHJpbmdFbnVtS2V5cyhzaG9ydGVuKSkge1xuICAgICAgICByZXR1cm4gbWFwVGFibGVbc2hvcnRlbl07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nYCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIGVudW0gdmFsdWU6ICcke2lucHV0fScgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGUoaW5wdXQ6IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaGFzVW5zcGVjaWZpZWQgJiYgaW5wdXQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTnVtZXJpY0VudW1WYWx1ZShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIHJldmVyc2VUYWJsZVtpbnB1dF07XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGdvdCBhIHByb3RvIGVudW0gdmFsdWUgdGhhdCB3ZSBkb24ndCB5ZXQga25vdyBhYm91dCAoaS5lLiBpdCBkaWRuJ3QgZXhpc3Qgd2hlbiB0aGlzIGNvZGVcbiAgICAgIC8vIHdhcyBjb21waWxlZCkuIFRoaXMgaXMgY2VydGFpbmx5IGEgcG9zc2liaWxpdHksIGJ1dCBnaXZlbiBob3cgb3VyIEFQSXMgZXZvbHZlLCB0aGlzIGlzIGlzXG4gICAgICAvLyB1bmxpa2VseSB0byBiZSBhIHRlcnJpYmx5IGJhZCB0aGluZyBieSBpdHNlbGYgKHdlIGF2b2lkIGFkZGluZyBuZXcgZW51bSB2YWx1ZXMgaW4gcGxhY2VzXG4gICAgICAvLyB0aGF0IHdvdWxkIGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBkZXBsb3llZCBjb2RlKS4gVGhlcmVmb3JlLCB0aHJvd2luZ1xuICAgICAgLy8gb24gXCJ1bmV4cGVjdGVkXCIgdmFsdWVzIGlzIGxpa2VseSB0byBlbmQgdXAgY2F1c2luZyBtb3JlIHByb2JsZW1zIHRoYW4gaXQgbWlnaHQgYXZvaWQsXG4gICAgICAvLyBlc3BlY2lhbGx5IGdpdmVuIHRoYXQgdGhlIGRlY29kZWQgdmFsdWUgbWF5IGFjdHVhbGx5IG5ldmVyIGdldCByZWFkIGFud3lheS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGVyZWZvcmUsIHdlIGluc3RlYWQgY2hlYXQgb24gdHlwZSBjb25zdHJhaW50cyBhbmQgcmV0dXJuIGEgc3RyaW5nIG9mIHRoZSBmb3JtIFwidW5rbm93bl8yM1wiLlxuICAgICAgLy8gVGhhdCBzb21ld2hhdCBtaXJyb3JzIHRoZSBiZWhhdmlvciB3ZSdkIGdldCB3aXRoIHRoZSBwdXJlIG51bWVyaWNhbCBhcHByb2FjaC5cbiAgICAgIHJldHVybiBgdW5rbm93bl8ke2lucHV0fWAgYXMgU2hvcnRTdHJpbmdFbnVtS2V5O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHByb3RvIGVudW0gdmFsdWU6ICcke2lucHV0fScgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbiAgfVxuXG4gIHJldHVybiBbZW5jb2RlLCBkZWNvZGVdIGFzIGNvbnN0O1xufVxuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtLFxuICogZS5nLiB0aGUgdHlwZSB0aGF0IHRoZSBkZXZlbG9wZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgIFRFUk1JTkFURTogXCJURVJNSU5BVEVcIjtcbiAqICAgQUJBTkRPTjogXCJBQkFORE9OXCI7XG4gKiAgIFJFUVVFU1RfQ0FOQ0VMOiBcIlJFUVVFU1RfQ0FOQ0VMXCI7XG4gKlxuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURT86IFwiVEVSTUlOQVRFXCI7XG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTj86IFwiQUJBTkRPTlwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMPzogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9VTlNQRUNJRklFRD86IHVuZGVmaW5lZDtcbiAqIH1cbiAqL1xudHlwZSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgU2hvcnRTdHJpbmdFbnVtS2V5IGV4dGVuZHMgc3RyaW5nLFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4gIFVuc3BlY2lmaWVkLCAvLyBlLmcuICdVTlNQRUNJRklFRCdcbj4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICB8IHtcbiAgICAgIC8vIGUuZy46IFwiVEVSTUlOQVRFXCI6IFwiVEVSTUlOQVRFXCJcbiAgICAgIHJlYWRvbmx5IFtrIGluIFNob3J0U3RyaW5nRW51bUtleV06IGs7XG4gICAgfVxuICB8IHtcbiAgICAgIFtrIGluIFNob3J0U3RyaW5nRW51bUtleV06IFByZWZpeCBleHRlbmRzICcnXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURVwiPzogXCJURVJNSU5BVEVcIlxuICAgICAgICAgICAgcmVhZG9ubHkgW2trIGluIGAke1ByZWZpeH0ke2t9YF0/OiBrO1xuICAgICAgICAgIH07XG4gICAgfVtTaG9ydFN0cmluZ0VudW1LZXldXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRURcIj86IHVuZGVmaW5lZFxuICAgICAgICAgIFtrIGluIGAke1ByZWZpeH0ke1Vuc3BlY2lmaWVkfWBdPzogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICA6IG9iamVjdClcbiAgfCAoVW5zcGVjaWZpZWQgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8ge1xuICAgICAgICAgIC8vIGUuZy46IFwiVU5TUEVDSUZJRURcIj86IHVuZGVmaW5lZFxuICAgICAgICAgIFtrIGluIGAke1Vuc3BlY2lmaWVkfWBdPzogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICA6IG9iamVjdClcbj47XG5cbi8qKlxuICogR2l2ZW4gdGhlIGV4cGxvZGVkIHBhcmFtZXRlcnMgb2YgYSBwcm90byBlbnVtIChpLmUuIHNob3J0IGtleXMsIHByZWZpeCwgYW5kIHNob3J0IGtleSBvZiB0aGVcbiAqIHVuc3BlY2lmaWVkIHZhbHVlKSwgbWFrZSBhIHR5cGUgdGhhdCBfZXhhY3RseV8gY29ycmVzcG9uZHMgdG8gdGhlIG1hcHBpbmcgdGFibGUgdGhhdCB0aGUgdXNlciBpc1xuICogZXhwZWN0ZWQgdG8gcHJvdmlkZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZm9yIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksIHRoaXMgZXZhbHVhdGVzIHRvOlxuICpcbiAqIHtcbiAqICBVTlNQRUNJRklFRDogMCxcbiAqICBURVJNSU5BVEU6IDEsXG4gKiAgQUJBTkRPTjogMixcbiAqICBSRVFVRVNUX0NBTkNFTDogMyxcbiAqIH1cbiAqL1xudHlwZSBQcm90b0VudW1Ub0NvbnN0T2JqZWN0T2ZTdHJpbmdNYXBUYWJsZTxcbiAgX1N0cmluZ0VudW0gZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBQcm90b0VudW1WYWx1ZSBleHRlbmRzIG51bWJlcixcbiAgUHJvdG9FbnVtIGV4dGVuZHMgeyBbayBpbiBQcm90b0VudW1LZXldOiBQcm90b0VudW1WYWx1ZSB9LFxuICBQcm90b0VudW1LZXkgZXh0ZW5kcyBgJHtQcmVmaXh9JHtzdHJpbmd9YCxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCxcbiAgU2hvcnRTdHJpbmdFbnVtS2V5IGV4dGVuZHMgUmVtb3ZlUHJlZml4PFByZWZpeCwgUHJvdG9FbnVtS2V5Pixcbj4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICB7XG4gICAgW2sgaW4gUHJvdG9FbnVtS2V5XToge1xuICAgICAgW2trIGluIFJlbW92ZVByZWZpeDxQcmVmaXgsIGs+XTogUHJvdG9FbnVtW2tdIGV4dGVuZHMgbnVtYmVyID8gUHJvdG9FbnVtW2tdIDogbmV2ZXI7XG4gICAgfTtcbiAgfVtQcm90b0VudW1LZXldXG4+O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9lbnVtcy1oZWxwZXJzJztcbiIsImV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ1RSQUNFJyB8ICdERUJVRycgfCAnSU5GTycgfCAnV0FSTicgfCAnRVJST1InO1xuXG5leHBvcnQgdHlwZSBMb2dNZXRhZGF0YSA9IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIGFueT47XG5cbi8qKlxuICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGluIG9yZGVyIHRvIGN1c3RvbWl6ZSB3b3JrZXIgbG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gIGxvZyhsZXZlbDogTG9nTGV2ZWwsIG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xufVxuXG4vKipcbiAqIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYHNka0NvbXBvbmVudGAgbWV0YSBhdHRyaWJ1dGVzIG9uIGxvZyBtZXNzYWdlcy4gVGhpc1xuICogYXR0cmlidXRlIGluZGljYXRlcyB3aGljaCBzdWJzeXN0ZW0gZW1pdHRlZCB0aGUgbG9nIG1lc3NhZ2U7IHRoaXMgbWF5IGZvclxuICogZXhhbXBsZSBiZSB1c2VkIHRvIGltcGxlbWVudCBmaW5lLWdyYWluZWQgZmlsdGVyaW5nIG9mIGxvZyBtZXNzYWdlcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBsaXN0IHdpbGwgcmVtYWluIHN0YWJsZSBpbiB0aGVcbiAqIGZ1dHVyZTsgdmFsdWVzIG1heSBiZSBhZGRlZCBvciByZW1vdmVkLCBhbmQgbWVzc2FnZXMgdGhhdCBhcmUgY3VycmVudGx5XG4gKiBlbWl0dGVkIHdpdGggc29tZSBgc2RrQ29tcG9uZW50YCB2YWx1ZSBtYXkgdXNlIGEgZGlmZmVyZW50IHZhbHVlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBlbnVtIFNka0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQgbmFtZSBmb3IgbWVzc2FnZXMgZW1pdGVkIGZyb20gV29ya2Zsb3cgY29kZSwgdXNpbmcgdGhlIHtAbGluayBXb3JrZmxvdyBjb250ZXh0IGxvZ2dlcnx3b3JrZmxvdy5sb2d9LlxuICAgKiBUaGUgU0RLIGl0c2VsZiBuZXZlciBwdWJsaXNoZXMgbWVzc2FnZXMgd2l0aCB0aGlzIGNvbXBvbmVudCBuYW1lLlxuICAgKi9cbiAgd29ya2Zsb3cgPSAnd29ya2Zsb3cnLFxuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgbmFtZSBmb3IgbWVzc2FnZXMgZW1pdGVkIGZyb20gYW4gYWN0aXZpdHksIHVzaW5nIHRoZSB7QGxpbmsgYWN0aXZpdHkgY29udGV4dCBsb2dnZXJ8Q29udGV4dC5sb2d9LlxuICAgKiBUaGUgU0RLIGl0c2VsZiBuZXZlciBwdWJsaXNoZXMgbWVzc2FnZXMgd2l0aCB0aGlzIGNvbXBvbmVudCBuYW1lLlxuICAgKi9cbiAgYWN0aXZpdHkgPSAnYWN0aXZpdHknLFxuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgbmFtZSBmb3IgbWVzc2FnZXMgZW1pdGVkIGZyb20gYSBUZW1wb3JhbCBXb3JrZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIFRoaXMgbm90YWJseSBpbmNsdWRlczpcbiAgICogLSBJc3N1ZXMgd2l0aCBXb3JrZXIgb3IgcnVudGltZSBjb25maWd1cmF0aW9uLCBvciB0aGUgSlMgZXhlY3V0aW9uIGVudmlyb25tZW50O1xuICAgKiAtIFdvcmtlcidzLCBBY3Rpdml0eSdzLCBhbmQgV29ya2Zsb3cncyBsaWZlY3ljbGUgZXZlbnRzO1xuICAgKiAtIFdvcmtmbG93IEFjdGl2YXRpb24gYW5kIEFjdGl2aXR5IFRhc2sgcHJvY2Vzc2luZyBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgYnVuZGxpbmcgbWVzc2FnZXM7XG4gICAqIC0gU2luayBwcm9jZXNzaW5nIGlzc3Vlcy5cbiAgICovXG4gIHdvcmtlciA9ICd3b3JrZXInLFxuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgbmFtZSBmb3IgYWxsIG1lc3NhZ2VzIGVtaXR0ZWQgYnkgdGhlIFJ1c3QgQ29yZSBTREsgbGlicmFyeS5cbiAgICovXG4gIGNvcmUgPSAnY29yZScsXG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IER1cmF0aW9uLCBtc09wdGlvbmFsVG9OdW1iZXIsIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIG9wdGlvbmFsVHNUb01zIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciByZXRyeWluZyBXb3JrZmxvd3MgYW5kIEFjdGl2aXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeVBvbGljeSB7XG4gIC8qKlxuICAgKiBDb2VmZmljaWVudCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV4dCByZXRyeSBpbnRlcnZhbC5cbiAgICogVGhlIG5leHQgcmV0cnkgaW50ZXJ2YWwgaXMgcHJldmlvdXMgaW50ZXJ2YWwgbXVsdGlwbGllZCBieSB0aGlzIGNvZWZmaWNpZW50LlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBkZWZhdWx0IDJcbiAgICovXG4gIGJhY2tvZmZDb2VmZmljaWVudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEludGVydmFsIG9mIHRoZSBmaXJzdCByZXRyeS5cbiAgICogSWYgY29lZmZpY2llbnQgaXMgMSB0aGVuIGl0IGlzIHVzZWQgZm9yIGFsbCByZXRyaWVzXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiBAZGVmYXVsdCAxIHNlY29uZFxuICAgKi9cbiAgaW5pdGlhbEludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cy4gV2hlbiBleGNlZWRlZCwgcmV0cmllcyBzdG9wIChldmVuIGlmIHtAbGluayBBY3Rpdml0eU9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dH1cbiAgICogaGFzbid0IGJlZW4gcmVhY2hlZCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IEluZmluaXR5XG4gICAqL1xuICBtYXhpbXVtQXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGludGVydmFsIGJldHdlZW4gcmV0cmllcy5cbiAgICogRXhwb25lbnRpYWwgYmFja29mZiBsZWFkcyB0byBpbnRlcnZhbCBpbmNyZWFzZS5cbiAgICogVGhpcyB2YWx1ZSBpcyB0aGUgY2FwIG9mIHRoZSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAweCBvZiB7QGxpbmsgaW5pdGlhbEludGVydmFsfVxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIG1heGltdW1JbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFwcGxpY2F0aW9uIGZhaWx1cmVzIHR5cGVzIHRvIG5vdCByZXRyeS5cbiAgICovXG4gIG5vblJldHJ5YWJsZUVycm9yVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgVFMgUmV0cnlQb2xpY3kgaW50byBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVSZXRyeVBvbGljeShyZXRyeVBvbGljeTogUmV0cnlQb2xpY3kpOiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB7XG4gIGlmIChyZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgIT0gbnVsbCAmJiByZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgPD0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5iYWNrb2ZmQ29lZmZpY2llbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICB9XG4gIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgIT0gbnVsbCkge1xuICAgIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgLy8gZHJvcCBmaWVsZCAoSW5maW5pdHkgaXMgdGhlIGRlZmF1bHQpXG4gICAgICBjb25zdCB7IG1heGltdW1BdHRlbXB0czogXywgLi4ud2l0aG91dCB9ID0gcmV0cnlQb2xpY3k7XG4gICAgICByZXRyeVBvbGljeSA9IHdpdGhvdXQ7XG4gICAgfSBlbHNlIGlmIChyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH0gZWxzZSBpZiAoIU51bWJlci5pc0ludGVnZXIocmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWF4aW11bUludGVydmFsID0gbXNPcHRpb25hbFRvTnVtYmVyKHJldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCk7XG4gIGNvbnN0IGluaXRpYWxJbnRlcnZhbCA9IG1zVG9OdW1iZXIocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsID8/IDEwMDApO1xuICBpZiAobWF4aW11bUludGVydmFsID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgMCcpO1xuICB9XG4gIGlmIChpbml0aWFsSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKG1heGltdW1JbnRlcnZhbCAhPSBudWxsICYmIG1heGltdW1JbnRlcnZhbCA8IGluaXRpYWxJbnRlcnZhbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwgY2Fubm90IGJlIGxlc3MgdGhhbiBpdHMgaW5pdGlhbEludGVydmFsJyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG1zVG9Ucyhpbml0aWFsSW50ZXJ2YWwpLFxuICAgIG1heGltdW1JbnRlcnZhbDogbXNPcHRpb25hbFRvVHMobWF4aW11bUludGVydmFsKSxcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBwcm90byBjb21wYXRpYmxlIFJldHJ5UG9saWN5IGludG8gYSBUUyBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb21waWxlUmV0cnlQb2xpY3koXG4gIHJldHJ5UG9saWN5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUmV0cnlQb2xpY3kgfCBudWxsXG4pOiBSZXRyeVBvbGljeSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmV0cnlQb2xpY3kpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUF0dGVtcHRzOiByZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMgPz8gdW5kZWZpbmVkLFxuICAgIG1heGltdW1JbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKSxcbiAgICBpbml0aWFsSW50ZXJ2YWw6IG9wdGlvbmFsVHNUb01zKHJldHJ5UG9saWN5LmluaXRpYWxJbnRlcnZhbCksXG4gICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogcmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlcyA/PyB1bmRlZmluZWQsXG4gIH07XG59XG4iLCJpbXBvcnQgTG9uZyBmcm9tICdsb25nJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdFxuaW1wb3J0IG1zLCB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IHR5cGUgeyBnb29nbGUgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBOT1RFOiB0aGVzZSBhcmUgdGhlIHNhbWUgaW50ZXJmYWNlIGluIEpTXG4vLyBnb29nbGUucHJvdG9idWYuSUR1cmF0aW9uO1xuLy8gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG4vLyBUaGUgY29udmVyc2lvbiBmdW5jdGlvbnMgYmVsb3cgc2hvdWxkIHdvcmsgZm9yIGJvdGhcblxuZXhwb3J0IHR5cGUgVGltZXN0YW1wID0gZ29vZ2xlLnByb3RvYnVmLklUaW1lc3RhbXA7XG5cbi8qKlxuICogQSBkdXJhdGlvbiwgZXhwcmVzc2VkIGVpdGhlciBhcyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIG9yIGFzIGEge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKi9cbmV4cG9ydCB0eXBlIER1cmF0aW9uID0gU3RyaW5nVmFsdWUgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93LlxuICogSWYgdHMgaXMgbnVsbCBvciB1bmRlZmluZWQgcmV0dXJucyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCwgdGhyb3dzIGEgVHlwZUVycm9yLCB3aXRoIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVkVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJHtmaWVsZE5hbWV9IHRvIGJlIGEgdGltZXN0YW1wLCBnb3QgJHt0c31gKTtcbiAgfVxuICByZXR1cm4gdHNUb01zKHRzKTtcbn1cblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3dcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRzVG9Ncyh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGlmICh0cyA9PT0gdW5kZWZpbmVkIHx8IHRzID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIGNvbnN0IHsgc2Vjb25kcywgbmFub3MgfSA9IHRzO1xuICByZXR1cm4gKHNlY29uZHMgfHwgTG9uZy5VWkVSTylcbiAgICAubXVsKDEwMDApXG4gICAgLmFkZChNYXRoLmZsb29yKChuYW5vcyB8fCAwKSAvIDEwMDAwMDApKVxuICAgIC50b051bWJlcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNOdW1iZXJUb1RzKG1pbGxpczogbnVtYmVyKTogVGltZXN0YW1wIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7XG4gIGNvbnN0IG5hbm9zID0gKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMDtcbiAgaWYgKE51bWJlci5pc05hTihzZWNvbmRzKSB8fCBOdW1iZXIuaXNOYU4obmFub3MpKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgbWlsbGlzICR7bWlsbGlzfWApO1xuICB9XG4gIHJldHVybiB7IHNlY29uZHM6IExvbmcuZnJvbU51bWJlcihzZWNvbmRzKSwgbmFub3MgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9UcyhzdHI6IER1cmF0aW9uKTogVGltZXN0YW1wIHtcbiAgcmV0dXJuIG1zTnVtYmVyVG9Ucyhtc1RvTnVtYmVyKHN0cikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyID8gbXNUb1RzKHN0cikgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9OdW1iZXIodmFsOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG1zVG9OdW1iZXIodmFsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcmV0dXJuIG1zV2l0aFZhbGlkYXRpb24odmFsKTtcbn1cblxuZnVuY3Rpb24gbXNXaXRoVmFsaWRhdGlvbihzdHI6IFN0cmluZ1ZhbHVlKTogbnVtYmVyIHtcbiAgY29uc3QgbWlsbGlzID0gbXMoc3RyKTtcbiAgaWYgKG1pbGxpcyA9PSBudWxsIHx8IGlzTmFOKG1pbGxpcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGR1cmF0aW9uIHN0cmluZzogJyR7c3RyfSdgKTtcbiAgfVxuICByZXR1cm4gbWlsbGlzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUodHNUb01zKHRzKSk7XG59XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCwgZmllbGROYW1lOiBzdHJpbmcpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHJlcXVpcmVkVHNUb01zKHRzLCBmaWVsZE5hbWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHQgKGltcG9ydGVkIHZpYSBzY2hlZHVsZS1oZWxwZXJzLnRzKVxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRGF0ZVRvVHMoZGF0ZTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBUaW1lc3RhbXAgfCB1bmRlZmluZWQge1xuICBpZiAoZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IGRhdGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBtc1RvVHMoZGF0ZS5nZXRUaW1lKCkpO1xufVxuIiwiLyoqIFNob3J0aGFuZCBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgQW55RnVuYyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuLyoqIEEgdHVwbGUgd2l0aG91dCBpdHMgbGFzdCBlbGVtZW50ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdDxUPiA9IFQgZXh0ZW5kcyBbLi4uaW5mZXIgUkVTVCwgYW55XSA/IFJFU1QgOiBuZXZlcjtcbi8qKiBGIHdpdGggYWxsIGFyZ3VtZW50cyBidXQgdGhlIGxhc3QgKi9cbmV4cG9ydCB0eXBlIE9taXRMYXN0UGFyYW08RiBleHRlbmRzIEFueUZ1bmM+ID0gKC4uLmFyZ3M6IE9taXRMYXN0PFBhcmFtZXRlcnM8Rj4+KSA9PiBSZXR1cm5UeXBlPEY+O1xuLyoqIFJlcXVpcmUgdGhhdCBUIGhhcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZGVmaW5lZCAqL1xuZXhwb3J0IHR5cGUgUmVxdWlyZUF0TGVhc3RPbmU8VCwgS2V5cyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IFBpY2s8VCwgRXhjbHVkZTxrZXlvZiBULCBLZXlzPj4gJlxuICB7XG4gICAgW0sgaW4gS2V5c10tPzogUmVxdWlyZWQ8UGljazxULCBLPj4gJiBQYXJ0aWFsPFBpY2s8VCwgRXhjbHVkZTxLZXlzLCBLPj4+O1xuICB9W0tleXNdO1xuXG4vKiogVmVyaWZ5IHRoYXQgYW4gdHlwZSBfQ29weSBleHRlbmRzIF9PcmlnICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFeHRlbmRzPF9PcmlnLCBfQ29weSBleHRlbmRzIF9PcmlnPigpOiB2b2lkIHtcbiAgLy8gbm9vcCwganVzdCB0eXBlIGNoZWNrXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxhY2U8QmFzZSwgTmV3PiA9IE9taXQ8QmFzZSwga2V5b2YgTmV3PiAmIE5ldztcblxuLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG4vLyBNSVQgb3IgQ0MwLTEuMCDigJQgSXQgaXMgbWVhbnQgdG8gYmUgY29waWVkIGludG8geW91ciBjb2RlYmFzZSByYXRoZXIgdGhhbiBiZWluZyB1c2VkIGFzIGEgZGVwZW5kZW5jeS5cbmV4cG9ydCB0eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VW5pb24+ID1cbiAgLy8gYGV4dGVuZHMgdW5rbm93bmAgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZSBjYXNlIGFuZCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGBVbmlvbmAgaW50byBhXG4gIC8vIFtkaXN0cmlidXRpdmUgY29uZGl0aW9uYWwgdHlwZV0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svcmVsZWFzZS1ub3Rlcy90eXBlc2NyaXB0LTItOC5odG1sI2Rpc3RyaWJ1dGl2ZS1jb25kaXRpb25hbC10eXBlcykuXG4gIChcbiAgICBVbmlvbiBleHRlbmRzIHVua25vd25cbiAgICAgID8gLy8gVGhlIHVuaW9uIHR5cGUgaXMgdXNlZCBhcyB0aGUgb25seSBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIHNpbmNlIHRoZSB1bmlvblxuICAgICAgICAvLyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaXMgYW4gaW50ZXJzZWN0aW9uLlxuICAgICAgICAoZGlzdHJpYnV0ZWRVbmlvbjogVW5pb24pID0+IHZvaWRcbiAgICAgIDogLy8gVGhpcyB3b24ndCBoYXBwZW4uXG4gICAgICAgIG5ldmVyXG4gICkgZXh0ZW5kcyAvLyBJbmZlciB0aGUgYEludGVyc2VjdGlvbmAgdHlwZSBzaW5jZSBUeXBlU2NyaXB0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWxcbiAgLy8gYXJndW1lbnRzIG9mIHVuaW9ucyBvZiBmdW5jdGlvbnMgYXMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSB1bmlvbi5cbiAgKG1lcmdlZEludGVyc2VjdGlvbjogaW5mZXIgSW50ZXJzZWN0aW9uKSA9PiB2b2lkXG4gICAgPyAvLyBUaGUgYCYgVW5pb25gIGlzIHRvIGFsbG93IGluZGV4aW5nIGJ5IHRoZSByZXN1bHRpbmcgdHlwZVxuICAgICAgSW50ZXJzZWN0aW9uICYgVW5pb25cbiAgICA6IG5ldmVyO1xuXG50eXBlIElzRXF1YWw8QSwgQj4gPSAoPEc+KCkgPT4gRyBleHRlbmRzIEEgPyAxIDogMikgZXh0ZW5kcyA8Rz4oKSA9PiBHIGV4dGVuZHMgQiA/IDEgOiAyID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFByaW1pdGl2ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3ltYm9sIHwgYmlnaW50O1xuXG50eXBlIElzTnVsbDxUPiA9IFtUXSBleHRlbmRzIFtudWxsXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Vua25vd248VD4gPSB1bmtub3duIGV4dGVuZHMgVCAvLyBgVGAgY2FuIGJlIGB1bmtub3duYCBvciBgYW55YFxuICA/IElzTnVsbDxUPiBleHRlbmRzIGZhbHNlIC8vIGBhbnlgIGNhbiBiZSBgbnVsbGAsIGJ1dCBgdW5rbm93bmAgY2FuJ3QgYmVcbiAgICA/IHRydWVcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0VmFsdWU8VCwgSz4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICA/IFRbS11cbiAgOiBUb1N0cmluZzxLPiBleHRlbmRzIGtleW9mIFRcbiAgICA/IFRbVG9TdHJpbmc8Sz5dXG4gICAgOiBLIGV4dGVuZHMgYCR7aW5mZXIgTnVtYmVySyBleHRlbmRzIG51bWJlcn1gXG4gICAgICA/IE51bWJlcksgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICAgID8gVFtOdW1iZXJLXVxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IG5ldmVyO1xuXG50eXBlIFRvU3RyaW5nPFQ+ID0gVCBleHRlbmRzIHN0cmluZyB8IG51bWJlciA/IGAke1R9YCA6IG5ldmVyO1xuXG50eXBlIEtleXNPZlVuaW9uPE9iamVjdFR5cGU+ID0gT2JqZWN0VHlwZSBleHRlbmRzIHVua25vd24gPyBrZXlvZiBPYmplY3RUeXBlIDogbmV2ZXI7XG5cbnR5cGUgQXJyYXlFbGVtZW50PFQ+ID0gVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA/IFRbMF0gOiBuZXZlcjtcblxudHlwZSBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+ID0ge1xuICBbS2V5IGluIGtleW9mIFBhcmFtZXRlclR5cGVdOiBFeGFjdDxQYXJhbWV0ZXJUeXBlW0tleV0sIE9iamVjdFZhbHVlPElucHV0VHlwZSwgS2V5Pj47XG59ICYgUmVjb3JkPEV4Y2x1ZGU8a2V5b2YgSW5wdXRUeXBlLCBLZXlzT2ZVbmlvbjxQYXJhbWV0ZXJUeXBlPj4sIG5ldmVyPjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9XG4gIC8vIEJlZm9yZSBkaXN0cmlidXRpbmcsIGNoZWNrIGlmIHRoZSB0d28gdHlwZXMgYXJlIGVxdWFsIGFuZCBpZiBzbywgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbW1lZGlhdGVseVxuICBJc0VxdWFsPFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGEgcHJpbWl0aXZlLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gICAgICA/IFBhcmFtZXRlclR5cGVcbiAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhbiB1bmtub3duLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICAgIElzVW5rbm93bjxQYXJhbWV0ZXJUeXBlPiBleHRlbmRzIHRydWVcbiAgICAgICAgPyB1bmtub3duXG4gICAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIEZ1bmN0aW9uLCByZXR1cm4gaXQgYXMgaXMgYmVjYXVzZSB0aGlzIHR5cGUgaXMgbm90IGNhcGFibGUgb2YgaGFuZGxpbmcgZnVuY3Rpb24sIGxlYXZlIGl0IHRvIFR5cGVTY3JpcHRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gICAgICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICAgICAgOiAvLyBDb252ZXJ0IHVuaW9uIG9mIGFycmF5IHRvIGFycmF5IG9mIHVuaW9uOiBBW10gJiBCW10gPT4gKEEgJiBCKVtdXG4gICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgdW5rbm93bltdXG4gICAgICAgICAgICA/IEFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgOiAvLyBJbiBUeXBlU2NyaXB0LCBBcnJheSBpcyBhIHN1YnR5cGUgb2YgUmVhZG9ubHlBcnJheSwgc28gYWx3YXlzIHRlc3QgQXJyYXkgYmVmb3JlIFJlYWRvbmx5QXJyYXkuXG4gICAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW11cbiAgICAgICAgICAgICAgPyBSZWFkb25seUFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgICA6IEV4YWN0T2JqZWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT47XG4vLyBFbmQgb2YgYm9ycm93IGZyb20gIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2UvdW5pb24tdG8taW50ZXJzZWN0aW9uLmQudHNcblxuZXhwb3J0IHR5cGUgUmVtb3ZlUHJlZml4PFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5cyBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEtleXNdOiBrIGV4dGVuZHMgYCR7UHJlZml4fSR7aW5mZXIgU3VmZml4fWAgPyBTdWZmaXggOiBuZXZlcjtcbn1bS2V5c107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eTxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcDogWVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcCBpbiByZWNvcmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0aWVzPFggZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcmVjb3JkOiBYLFxuICBwcm9wczogWVtdXG4pOiByZWNvcmQgaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9wcy5ldmVyeSgocHJvcCkgPT4gcHJvcCBpbiByZWNvcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBpc1JlY29yZChlcnJvcikgJiZcbiAgICB0eXBlb2YgZXJyb3IubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAoZXJyb3Iuc3RhY2sgPT0gbnVsbCB8fCB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09ICdzdHJpbmcnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBYm9ydEVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3IgJiB7IG5hbWU6ICdBYm9ydEVycm9yJyB9IHtcbiAgcmV0dXJuIGlzRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLm1lc3NhZ2VgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIEVycm9yV2l0aENvZGUge1xuICBjb2RlOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JXaXRoQ29kZShlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yV2l0aENvZGUge1xuICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLmNvZGVgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBzb21lIHR5cGUgaXMgdGhlIG5ldmVyIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKG1zZzogc3RyaW5nLCB4OiBuZXZlcik6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2cgKyAnOiAnICsgeCk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzPEUgZXh0ZW5kcyBFcnJvcj4gPSB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59O1xuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHRvIGJlIHVzZWQgb24gZXJyb3IgY2xhc3Nlcy4gSXQgYWRkcyB0aGUgJ25hbWUnIHByb3BlcnR5IEFORCBwcm92aWRlcyBhIGN1c3RvbVxuICogJ2luc3RhbmNlb2YnIGhhbmRsZXIgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcjxFIGV4dGVuZHMgRXJyb3I+KG1hcmtlck5hbWU6IHN0cmluZyk6IChjbGF6ejogQ2xhc3M8RT4pID0+IHZvaWQge1xuICByZXR1cm4gKGNsYXp6OiBDbGFzczxFPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fdGVtcG9yYWxfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCAnbmFtZScsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgbWFya2VyLCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9iamVjdC1zaG9ydGhhbmRcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCBlcnJvcjogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICAgIHJldHVybiBpc1JlY29yZChlcnJvcikgJiYgKGVycm9yIGFzIGFueSlbbWFya2VyXSA9PT0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgICAvLyBmcm9tIGNsYXp6J3MgW1N5bWJvbC5oYXNJbnN0YW5jZV0uIElmIHdlIGRvbid0IGhhbmRsZSB0aGlzIHBhcnRpY3VsYXIgc2l0dWF0aW9uLCB0aGVuXG4gICAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWRlYWxseSwgaXQnZCBiZSBwcmVmZXJhYmxlIHRvIGF2b2lkIHRoaXMgY2FzZSBlbnRpcmVseSwgYnkgbWFraW5nIHN1cmUgdGhhdCBhbGwgc3ViY2xhc3NlcyBvZiAnY2xhenonXG4gICAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlcnJvcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG5cbi8vIFRoYW5rcyBNRE46IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9mcmVlemVcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRnJlZXplPFQ+KG9iamVjdDogVCk6IFQge1xuICAvLyBSZXRyaWV2ZSB0aGUgcHJvcGVydHkgbmFtZXMgZGVmaW5lZCBvbiBvYmplY3RcbiAgY29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcblxuICAvLyBGcmVlemUgcHJvcGVydGllcyBiZWZvcmUgZnJlZXppbmcgc2VsZlxuICBmb3IgKGNvbnN0IG5hbWUgb2YgcHJvcE5hbWVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSAob2JqZWN0IGFzIGFueSlbbmFtZV07XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVlcEZyZWV6ZSh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgb2theSwgdGhlcmUgYXJlIHNvbWUgdHlwZWQgYXJyYXlzIHRoYXQgY2Fubm90IGJlIGZyb3plbiAoZW5jb2RpbmdLZXlzKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QuZnJlZXplKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShvYmplY3QpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nSW50ZW50IGFzIFZlcnNpb25pbmdJbnRlbnRTdHJpbmcgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IGFzc2VydE5ldmVyLCBjaGVja0V4dGVuZHMgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8vIEF2b2lkIGltcG9ydGluZyB0aGUgcHJvdG8gaW1wbGVtZW50YXRpb24gdG8gcmVkdWNlIHdvcmtmbG93IGJ1bmRsZSBzaXplXG4vLyBDb3BpZWQgZnJvbSBjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50XG4vKipcbiAqIFByb3RvYnVmIGVudW0gcmVwcmVzZW50YXRpb24gb2Yge0BsaW5rIFZlcnNpb25pbmdJbnRlbnRTdHJpbmd9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvbmluZ0ludGVudCB7XG4gIFVOU1BFQ0lGSUVEID0gMCxcbiAgQ09NUEFUSUJMRSA9IDEsXG4gIERFRkFVTFQgPSAyLFxufVxuXG5jaGVja0V4dGVuZHM8Y29yZXNkay5jb21tb24uVmVyc2lvbmluZ0ludGVudCwgVmVyc2lvbmluZ0ludGVudD4oKTtcbmNoZWNrRXh0ZW5kczxWZXJzaW9uaW5nSW50ZW50LCBjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbmluZ0ludGVudFRvUHJvdG8oaW50ZW50OiBWZXJzaW9uaW5nSW50ZW50U3RyaW5nIHwgdW5kZWZpbmVkKTogVmVyc2lvbmluZ0ludGVudCB7XG4gIHN3aXRjaCAoaW50ZW50KSB7XG4gICAgY2FzZSAnREVGQVVMVCc6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5ERUZBVUxUO1xuICAgIGNhc2UgJ0NPTVBBVElCTEUnOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuQ09NUEFUSUJMRTtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LlVOU1BFQ0lGSUVEO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcignVW5leHBlY3RlZCBWZXJzaW9uaW5nSW50ZW50JywgaW50ZW50KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdXNlciBpbnRlbmRzIGNlcnRhaW4gY29tbWFuZHMgdG8gYmUgcnVuIG9uIGEgY29tcGF0aWJsZSB3b3JrZXIgQnVpbGQgSWQgdmVyc2lvbiBvciBub3QuXG4gKlxuICogYENPTVBBVElCTEVgIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHNob3VsZCBydW4gb24gYSB3b3JrZXIgd2l0aCBjb21wYXRpYmxlIHZlcnNpb24gaWYgcG9zc2libGUuIEl0IG1heSBub3QgYmVcbiAqIHBvc3NpYmxlIGlmIHRoZSB0YXJnZXQgdGFzayBxdWV1ZSBkb2VzIG5vdCBhbHNvIGhhdmUga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IHdvcmtlcidzIEJ1aWxkIElkLlxuICpcbiAqIGBERUZBVUxUYCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBzaG91bGQgcnVuIG9uIHRoZSB0YXJnZXQgdGFzayBxdWV1ZSdzIGN1cnJlbnQgb3ZlcmFsbC1kZWZhdWx0IEJ1aWxkIElkLlxuICpcbiAqIFdoZXJlIHRoaXMgdHlwZSBpcyBhY2NlcHRlZCBvcHRpb25hbGx5LCBhbiB1bnNldCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgU0RLIHNob3VsZCBjaG9vc2UgdGhlIG1vc3Qgc2Vuc2libGUgZGVmYXVsdFxuICogYmVoYXZpb3IgZm9yIHRoZSB0eXBlIG9mIGNvbW1hbmQsIGFjY291bnRpbmcgZm9yIHdoZXRoZXIgdGhlIGNvbW1hbmQgd2lsbCBiZSBydW4gb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyB0aGVcbiAqIGN1cnJlbnQgd29ya2VyLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3Igc3RhcnRpbmcgV29ya2Zsb3dzIGlzIGBERUZBVUxUYC4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIFdvcmtmbG93cyBzdGFydGluZ1xuICogQWN0aXZpdGllcywgc3RhcnRpbmcgQ2hpbGQgV29ya2Zsb3dzLCBvciBDb250aW51aW5nIEFzIE5ldyBpcyBgQ09NUEFUSUJMRWAuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nSW50ZW50ID0gJ0NPTVBBVElCTEUnIHwgJ0RFRkFVTFQnO1xuIiwiaW1wb3J0IHsgV29ya2Zsb3csIFdvcmtmbG93UmVzdWx0VHlwZSwgU2lnbmFsRGVmaW5pdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogQmFzZSBXb3JrZmxvd0hhbmRsZSBpbnRlcmZhY2UsIGV4dGVuZGVkIGluIHdvcmtmbG93IGFuZCBjbGllbnQgbGlicy5cbiAqXG4gKiBUcmFuc2Zvcm1zIGEgd29ya2Zsb3cgaW50ZXJmYWNlIGBUYCBpbnRvIGEgY2xpZW50IGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dIYW5kbGU8VCBleHRlbmRzIFdvcmtmbG93PiB7XG4gIC8qKlxuICAgKiBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBXb3JrZmxvdyBleGVjdXRpb24gY29tcGxldGVzXG4gICAqL1xuICByZXN1bHQoKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4gIC8qKlxuICAgKiBTaWduYWwgYSBydW5uaW5nIFdvcmtmbG93LlxuICAgKlxuICAgKiBAcGFyYW0gZGVmIGEgc2lnbmFsIGRlZmluaXRpb24gYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lU2lnbmFsfVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBhd2FpdCBoYW5kbGUuc2lnbmFsKGluY3JlbWVudFNpZ25hbCwgMyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgICBkZWY6IFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT4gfCBzdHJpbmcsXG4gICAgLi4uYXJnczogQXJnc1xuICApOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2Zsb3dJZCBvZiB0aGUgY3VycmVudCBXb3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZXMsIFdvcmtmbG93IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiBTZWUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGZvciB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYVxuICogV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAqXG4gKiBDb25jZXB0OiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYS13b3JrZmxvdy1pZC1yZXVzZS1wb2xpY3kvIHwgV29ya2Zsb3cgSWQgUmV1c2UgUG9saWN5fVxuICpcbiAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gKlxuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dJZFJldXNlUG9saWN5ID0ge1xuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZS5cbiAgICogQGRlZmF1bHRcbiAgICovXG4gIEFMTE9XX0RVUExJQ0FURTogJ0FMTE9XX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRoZSBXb3JrZmxvdyBjYW4gYmUgc3RhcnRlZCBpZiB0aGUgcHJldmlvdXMgV29ya2Zsb3cgaXMgaW4gYSBDbG9zZWQgc3RhdGUgdGhhdCBpcyBub3QgQ29tcGxldGVkLlxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZOiAnQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbm5vdCBiZSBzdGFydGVkLlxuICAgKi9cbiAgUkVKRUNUX0RVUExJQ0FURTogJ1JFSkVDVF9EVVBMSUNBVEUnLFxuXG4gIC8qKlxuICAgKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgV29ya2Zsb3cgaWYgb25lIGlzIGFscmVhZHkgcnVubmluZzsgb3RoZXJ3aXNlIGFsbG93IHJldXNpbmcgdGhlIFdvcmtmbG93IElELlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEV9IGluc3RlYWQsIGFuZFxuICAgKiAgICAgICAgICAgICBzZXQgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIHRvXG4gICAqICAgICAgICAgICAgIHtAbGluayBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZX1RFUk1JTkFURV9FWElTVElOR30uXG4gICAqICAgICAgICAgICAgIFdoZW4gdXNpbmcgdGhpcyBvcHRpb24sIGBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5YCBtdXN0IGJlIGxlZnQgdW5zcGVjaWZpZWQuXG4gICAqL1xuICBURVJNSU5BVEVfSUZfUlVOTklORzogJ1RFUk1JTkFURV9JRl9SVU5OSU5HJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBObyBuZWVkIHRvIHVzZSB0aGlzLiBJZiBhIGBXb3JrZmxvd0lkUmV1c2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEU6ICdBTExPV19EVVBMSUNBVEUnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZOiAnQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFSkVDVF9EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBURVJNSU5BVEVfSUZfUlVOTklOR30gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1RFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dJZFJldXNlUG9saWN5ID0gKHR5cGVvZiBXb3JrZmxvd0lkUmV1c2VQb2xpY3kpW2tleW9mIHR5cGVvZiBXb3JrZmxvd0lkUmV1c2VQb2xpY3ldO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeSwgZGVjb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5XSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiBXb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuPihcbiAge1xuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFXTogMSxcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LkFMTE9XX0RVUExJQ0FURV9GQUlMRURfT05MWV06IDIsXG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5SRUpFQ1RfRFVQTElDQVRFXTogMyxcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlRFUk1JTkFURV9JRl9SVU5OSU5HXTogNCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZXydcbik7XG5cbi8qKlxuICogRGVmaW5lcyB3aGF0IGhhcHBlbnMgd2hlbiB0cnlpbmcgdG8gc3RhcnQgYSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKlJ1bm5pbmcqIFdvcmtmbG93LlxuICpcbiAqIFNlZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX0gZm9yIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93XG4gKiB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKkNsb3NlZCogV29ya2Zsb3cuXG4gKlxuICogKk5vdGU6IEl0IGlzIG5ldmVyIHBvc3NpYmxlIHRvIGhhdmUgdHdvIF9hY3RpdmVseSBydW5uaW5nXyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XTtcbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmFpc2UgYSBgV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yYC5cbiAgICovXG4gIEZBSUw6ICdGQUlMJyxcblxuICAvKipcbiAgICogRG8gbm90IHN0YXJ0IGEgbmV3IFdvcmtmbG93LiBJbnN0ZWFkIHJldHVybiBhIFdvcmtmbG93IEhhbmRsZSBmb3IgdGhlIGFscmVhZHkgUnVubmluZyBXb3JrZmxvdy5cbiAgICovXG4gIFVTRV9FWElTVElORzogJ1VTRV9FWElTVElORycsXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgbmV3IFdvcmtmbG93LCB0ZXJtaW5hdGluZyB0aGUgY3VycmVudCB3b3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nLlxuICAgKi9cbiAgVEVSTUlOQVRFX0VYSVNUSU5HOiAnVEVSTUlOQVRFX0VYSVNUSU5HJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX0NPTkZMSUNUX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRDb25mbGljdFBvbGljeS5GQUlMXTogMSxcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlVTRV9FWElTVElOR106IDIsXG4gICAgW1dvcmtmbG93SWRDb25mbGljdFBvbGljeS5URVJNSU5BVEVfRVhJU1RJTkddOiAzLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVdvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAgICpcbiAgICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFdvcmtmbG93SWRSZXVzZVBvbGljeS5XT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFfVxuICAgKi9cbiAgd29ya2Zsb3dJZFJldXNlUG9saWN5PzogV29ya2Zsb3dJZFJldXNlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZX1VOU1BFQ0lGSUVEfVxuICAgKi9cbiAgd29ya2Zsb3dJZENvbmZsaWN0UG9saWN5PzogV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5O1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgYSBXb3JrZmxvdyBFeGVjdXRpb24gaXMgcmV0cmllZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgV29ya2Zsb3cgRXhlY3V0aW9ucyBhcmUgbm90IHJldHJpZWQuIERvIG5vdCBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZy5cbiAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcmV0cnktcG9saWN5LyB8IE1vcmUgaW5mb3JtYXRpb259LlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY3JvbiBzY2hlZHVsZSBmb3IgV29ya2Zsb3cuIElmIGEgY3JvbiBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBXb3JrZmxvdyB3aWxsIHJ1biBhcyBhIGNyb24gYmFzZWQgb24gdGhlXG4gICAqIHNjaGVkdWxlLiBUaGUgc2NoZWR1bGluZyB3aWxsIGJlIGJhc2VkIG9uIFVUQyB0aW1lLiBUaGUgc2NoZWR1bGUgZm9yIHRoZSBuZXh0IHJ1biBvbmx5IGhhcHBlbnMgYWZ0ZXIgdGhlIGN1cnJlbnRcbiAgICogcnVuIGlzIGNvbXBsZXRlZC9mYWlsZWQvdGltZW91dC4gSWYgYSBSZXRyeVBvbGljeSBpcyBhbHNvIHN1cHBsaWVkLCBhbmQgdGhlIFdvcmtmbG93IGZhaWxlZCBvciB0aW1lZCBvdXQsIHRoZVxuICAgKiBXb3JrZmxvdyB3aWxsIGJlIHJldHJpZWQgYmFzZWQgb24gdGhlIHJldHJ5IHBvbGljeS4gV2hpbGUgdGhlIFdvcmtmbG93IGlzIHJldHJ5aW5nLCBpdCB3b24ndCBzY2hlZHVsZSBpdHMgbmV4dCBydW4uXG4gICAqIElmIHRoZSBuZXh0IHNjaGVkdWxlIGlzIGR1ZSB3aGlsZSB0aGUgV29ya2Zsb3cgaXMgcnVubmluZyAob3IgcmV0cnlpbmcpLCB0aGVuIGl0IHdpbGwgc2tpcCB0aGF0IHNjaGVkdWxlLiBDcm9uXG4gICAqIFdvcmtmbG93IHdpbGwgbm90IHN0b3AgdW50aWwgaXQgaXMgdGVybWluYXRlZCBvciBjYW5jZWxsZWQgKGJ5IHJldHVybmluZyB0ZW1wb3JhbC5DYW5jZWxlZEVycm9yKS5cbiAgICogaHR0cHM6Ly9jcm9udGFiLmd1cnUvIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyB5b3VyIGNyb24gZXhwcmVzc2lvbnMuXG4gICAqL1xuICBjcm9uU2NoZWR1bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIG5vbi1pbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBUaGUgdmFsdWVzIGNhbiBiZSBhbnl0aGluZyB0aGF0XG4gICAqIGlzIHNlcmlhbGl6YWJsZSBieSB7QGxpbmsgRGF0YUNvbnZlcnRlcn0uXG4gICAqL1xuICBtZW1vPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhZGRpdGlvbmFsIGluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIE1vcmUgaW5mbzpcbiAgICogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RvY3MvdHlwZXNjcmlwdC9zZWFyY2gtYXR0cmlidXRlc1xuICAgKlxuICAgKiBWYWx1ZXMgYXJlIGFsd2F5cyBjb252ZXJ0ZWQgdXNpbmcge0BsaW5rIEpzb25QYXlsb2FkQ29udmVydGVyfSwgZXZlbiB3aGVuIGEgY3VzdG9tIGRhdGEgY29udmVydGVyIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXM7XG59XG5cbmV4cG9ydCB0eXBlIFdpdGhXb3JrZmxvd0FyZ3M8VyBleHRlbmRzIFdvcmtmbG93LCBUPiA9IFQgJlxuICAoUGFyYW1ldGVyczxXPiBleHRlbmRzIFthbnksIC4uLmFueVtdXVxuICAgID8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIFdvcmtmbG93XG4gICAgICAgICAqL1xuICAgICAgICBhcmdzOiBQYXJhbWV0ZXJzPFc+IHwgUmVhZG9ubHk8UGFyYW1ldGVyczxXPj47XG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M/OiBQYXJhbWV0ZXJzPFc+IHwgUmVhZG9ubHk8UGFyYW1ldGVyczxXPj47XG4gICAgICB9KTtcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBydW4gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIHNlcnZpY2UuIERvIG5vdFxuICAgKiByZWx5IG9uIHJ1biB0aW1lb3V0IGZvciBidXNpbmVzcyBsZXZlbCB0aW1lb3V0cy4gSXQgaXMgcHJlZmVycmVkIHRvIHVzZSBpbiB3b3JrZmxvdyB0aW1lcnNcbiAgICogZm9yIHRoaXMgcHVycG9zZS5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICpcbiAgICogVGhlIHRpbWUgYWZ0ZXIgd2hpY2ggd29ya2Zsb3cgZXhlY3V0aW9uICh3aGljaCBpbmNsdWRlcyBydW4gcmV0cmllcyBhbmQgY29udGludWUgYXMgbmV3KSBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90IHJlbHkgb24gZXhlY3V0aW9uIHRpbWVvdXQgZm9yIGJ1c2luZXNzXG4gICAqIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVycyBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93RXhlY3V0aW9uVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgc2luZ2xlIHdvcmtmbG93IHRhc2suIERlZmF1bHQgaXMgMTAgc2Vjb25kcy5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1Rhc2tUaW1lb3V0PzogRHVyYXRpb247XG59XG5cbmV4cG9ydCB0eXBlIENvbW1vbldvcmtmbG93T3B0aW9ucyA9IEJhc2VXb3JrZmxvd09wdGlvbnMgJiBXb3JrZmxvd0R1cmF0aW9uT3B0aW9ucztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RXb3JrZmxvd1R5cGU8VCBleHRlbmRzIFdvcmtmbG93Pih3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuYyA9PT0gJ3N0cmluZycpIHJldHVybiB3b3JrZmxvd1R5cGVPckZ1bmMgYXMgc3RyaW5nO1xuICBpZiAodHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh3b3JrZmxvd1R5cGVPckZ1bmM/Lm5hbWUpIHJldHVybiB3b3JrZmxvd1R5cGVPckZ1bmMubmFtZTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdvcmtmbG93IHR5cGU6IHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBhbm9ueW1vdXMnKTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBJbnZhbGlkIHdvcmtmbG93IHR5cGU6IGV4cGVjdGVkIGVpdGhlciBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLCBnb3QgJyR7dHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuY30nYFxuICApO1xufVxuIiwiLy8gQSBwb3J0IG9mIGFuIGFsZ29yaXRobSBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLmNvbT4sIDIwMTBcbi8vIGh0dHA6Ly9iYWFnb2UuY29tL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdC9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucXVpbmxhbi9iZXR0ZXItcmFuZG9tLW51bWJlcnMtZm9yLWphdmFzY3JpcHQtbWlycm9yXG4vLyBPcmlnaW5hbCB3b3JrIGlzIHVuZGVyIE1JVCBsaWNlbnNlIC1cblxuLy8gQ29weXJpZ2h0IChDKSAyMDEwIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2Uub3JnPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIFRha2VuIGFuZCBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGJhdS9zZWVkcmFuZG9tL2Jsb2IvcmVsZWFzZWQvbGliL2FsZWEuanNcblxuY2xhc3MgQWxlYSB7XG4gIHB1YmxpYyBjOiBudW1iZXI7XG4gIHB1YmxpYyBzMDogbnVtYmVyO1xuICBwdWJsaWMgczE6IG51bWJlcjtcbiAgcHVibGljIHMyOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2VlZDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBtYXNoID0gbmV3IE1hc2goKTtcbiAgICAvLyBBcHBseSB0aGUgc2VlZGluZyBhbGdvcml0aG0gZnJvbSBCYWFnb2UuXG4gICAgdGhpcy5jID0gMTtcbiAgICB0aGlzLnMwID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczEgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMiA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMwIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMCA8IDApIHtcbiAgICAgIHRoaXMuczAgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMSAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczEgPCAwKSB7XG4gICAgICB0aGlzLnMxICs9IDE7XG4gICAgfVxuICAgIHRoaXMuczIgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMyIDwgMCkge1xuICAgICAgdGhpcy5zMiArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZXh0KCk6IG51bWJlciB7XG4gICAgY29uc3QgdCA9IDIwOTE2MzkgKiB0aGlzLnMwICsgdGhpcy5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICB0aGlzLnMwID0gdGhpcy5zMTtcbiAgICB0aGlzLnMxID0gdGhpcy5zMjtcbiAgICByZXR1cm4gKHRoaXMuczIgPSB0IC0gKHRoaXMuYyA9IHQgfCAwKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUk5HID0gKCkgPT4gbnVtYmVyO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxlYShzZWVkOiBudW1iZXJbXSk6IFJORyB7XG4gIGNvbnN0IHhnID0gbmV3IEFsZWEoc2VlZCk7XG4gIHJldHVybiB4Zy5uZXh0LmJpbmQoeGcpO1xufVxuXG5leHBvcnQgY2xhc3MgTWFzaCB7XG4gIHByaXZhdGUgbiA9IDB4ZWZjODI0OWQ7XG5cbiAgcHVibGljIG1hc2goZGF0YTogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIGxldCB7IG4gfSA9IHRoaXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGFbaV07XG4gICAgICBsZXQgaCA9IDAuMDI1MTk2MDMyODI0MTY5MzggKiBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBoICo9IG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIG4gKz0gaCAqIDB4MTAwMDAwMDAwOyAvLyAyXjMyXG4gICAgfVxuICAgIHRoaXMubiA9IG47XG4gICAgcmV0dXJuIChuID4+PiAwKSAqIDIuMzI4MzA2NDM2NTM4Njk2M2UtMTA7IC8vIDJeLTMyXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5pbXBvcnQgeyBDYW5jZWxsZWRGYWlsdXJlLCBEdXJhdGlvbiwgSWxsZWdhbFN0YXRlRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgbXNPcHRpb25hbFRvTnVtYmVyIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgU2RrRmxhZ3MgfSBmcm9tICcuL2ZsYWdzJztcblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbi8qKiBNYWdpYyBzeW1ib2wgdXNlZCB0byBjcmVhdGUgdGhlIHJvb3Qgc2NvcGUgLSBpbnRlbnRpb25hbGx5IG5vdCBleHBvcnRlZCAqL1xuY29uc3QgTk9fUEFSRU5UID0gU3ltYm9sKCdOT19QQVJFTlQnKTtcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIENhbmNlbGxhdGlvblNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NvcGUgY2FuY2VsbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdGVkXG4gICAqL1xuICB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBwcmV2ZW50IG91dGVyIGNhbmNlbGxhdGlvbiBmcm9tIHByb3BhZ2F0aW5nIHRvIGlubmVyIHNjb3BlcywgQWN0aXZpdGllcywgdGltZXJzLCBhbmQgVHJpZ2dlcnMsIGRlZmF1bHRzIHRvIHRydWUuXG4gICAqIChTY29wZSBzdGlsbCBwcm9wYWdhdGVzIENhbmNlbGxlZEZhaWx1cmUgdGhyb3duIGZyb20gd2l0aGluKS5cbiAgICovXG4gIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgQ2FuY2VsbGF0aW9uU2NvcGUgKHVzZWZ1bCBmb3IgcnVubmluZyBiYWNrZ3JvdW5kIHRhc2tzKS5cbiAgICogVGhlIGBOT19QQVJFTlRgIHN5bWJvbCBpcyByZXNlcnZlZCBmb3IgdGhlIHJvb3Qgc2NvcGUuXG4gICAqL1xuICBwYXJlbnQ/OiBDYW5jZWxsYXRpb25TY29wZSB8IHR5cGVvZiBOT19QQVJFTlQ7XG59XG5cbi8qKlxuICogQ2FuY2VsbGF0aW9uIFNjb3BlcyBwcm92aWRlIHRoZSBtZWNoYW5pYyBieSB3aGljaCBhIFdvcmtmbG93IG1heSBncmFjZWZ1bGx5IGhhbmRsZSBpbmNvbWluZyByZXF1ZXN0cyBmb3IgY2FuY2VsbGF0aW9uXG4gKiAoZS5nLiBpbiByZXNwb25zZSB0byB7QGxpbmsgV29ya2Zsb3dIYW5kbGUuY2FuY2VsfSBvciB0aHJvdWdoIHRoZSBVSSBvciBDTEkpLCBhcyB3ZWxsIGFzIHJlcXVlc3QgY2FuY2VsYXRpb24gb2ZcbiAqIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgaXQgb3ducyAoZS5nLiBBY3Rpdml0aWVzLCBUaW1lcnMsIENoaWxkIFdvcmtmbG93cywgZXRjKS5cbiAqXG4gKiBDYW5jZWxsYXRpb24gU2NvcGVzIGZvcm0gYSB0cmVlLCB3aXRoIHRoZSBXb3JrZmxvdydzIG1haW4gZnVuY3Rpb24gcnVubmluZyBpbiB0aGUgcm9vdCBzY29wZSBvZiB0aGF0IHRyZWUuXG4gKiBCeSBkZWZhdWx0LCBjYW5jZWxsYXRpb24gcHJvcGFnYXRlcyBkb3duIGZyb20gYSBwYXJlbnQgc2NvcGUgdG8gaXRzIGNoaWxkcmVuIGFuZCBpdHMgY2FuY2VsbGFibGUgb3BlcmF0aW9ucy5cbiAqIEEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGNhbiByZWNlaXZlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cywgYnV0IGlzIG5ldmVyIGVmZmVjdGl2ZWx5IGNvbnNpZGVyZWQgYXMgY2FuY2VsbGVkLFxuICogdGh1cyBzaGllbGRkaW5nIGl0cyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBTY29wZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgY29uc3RydWN0b3Igb3IgdGhlIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB7QGxpbmsgY2FuY2VsbGFibGV9LFxuICoge0BsaW5rIG5vbkNhbmNlbGxhYmxlfSBhbmQge0BsaW5rIHdpdGhUaW1lb3V0fS4gYHdpdGhUaW1lb3V0YCBjcmVhdGVzIGEgc2NvcGUgdGhhdCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmIGFmdGVyXG4gKiBzb21lIGR1cmF0aW9uLlxuICpcbiAqIENhbmNlbGxhdGlvbiBvZiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlc3VsdHMgaW4gYWxsIG9wZXJhdGlvbnMgY3JlYXRlZCBkaXJlY3RseSBpbiB0aGF0IHNjb3BlIHRvIHRocm93IGFcbiAqIHtAbGluayBDYW5jZWxsZWRGYWlsdXJlfSAoZWl0aGVyIGRpcmVjdGx5LCBvciBhcyB0aGUgYGNhdXNlYCBvZiBhbiB7QGxpbmsgQWN0aXZpdHlGYWlsdXJlfSBvciBhXG4gKiB7QGxpbmsgQ2hpbGRXb3JrZmxvd0ZhaWx1cmV9KS4gRnVydGhlciBhdHRlbXB0IHRvIGNyZWF0ZSBuZXcgY2FuY2VsbGFibGUgc2NvcGVzIG9yIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgd2l0aGluIGFcbiAqIHNjb3BlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWQgd2lsbCBhbHNvIGltbWVkaWF0ZWx5IHRocm93IGEge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IGV4Y2VwdGlvbi4gSXQgaXMgaG93ZXZlclxuICogcG9zc2libGUgdG8gY3JlYXRlIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGF0IHRoYXQgcG9pbnQ7IHRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBleGVjdXRlIHJvbGxiYWNrIG9yIGNsZWFudXBcbiAqIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KC4uLik6IFByb21pc2U8dm9pZD4ge1xuICogICB0cnkge1xuICogICAgIC8vIFRoaXMgYWN0aXZpdHkgcnVucyBpbiB0aGUgcm9vdCBjYW5jZWxsYXRpb24gc2NvcGUuIFRoZXJlZm9yZSwgYSBjYW5jZWxhdGlvbiByZXF1ZXN0IG9uXG4gKiAgICAgLy8gdGhlIFdvcmtmbG93IGV4ZWN1dGlvbiAoZS5nLiB0aHJvdWdoIHRoZSBVSSBvciBDTEkpIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlcyB0byB0aGlzXG4gKiAgICAgLy8gYWN0aXZpdHkuIEFzc3VtaW5nIHRoYXQgdGhlIGFjdGl2aXR5IHByb3Blcmx5IGhhbmRsZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIHRoZW4gdGhlXG4gKiAgICAgLy8gY2FsbCBiZWxvdyB3aWxsIHRocm93IGFuIGBBY3Rpdml0eUZhaWx1cmVgIGV4Y2VwdGlvbiwgd2l0aCBgY2F1c2VgIHNldHMgdG8gYW5cbiAqICAgICAvLyBpbnN0YW5jZSBvZiBgQ2FuY2VsbGVkRmFpbHVyZWAuXG4gKiAgICAgYXdhaXQgc29tZUFjdGl2aXR5KCk7XG4gKiAgIH0gY2F0Y2ggKGUpIHtcbiAqICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZSkpIHtcbiAqICAgICAgIC8vIFJ1biBjbGVhbnVwIGFjdGl2aXR5IGluIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlXG4gKiAgICAgICBhd2FpdCBDYW5jZWxsYXRpb25TY29wZS5ub25DYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gKiAgICAgICAgIGF3YWl0IGNsZWFudXBBY3Rpdml0eSgpO1xuICogICAgICAgfVxuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICB0aHJvdyBlO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQSBjYW5jZWxsYWJsZSBzY29wZSBtYXkgYmUgcHJvZ3JhbWF0aWNhbGx5IGNhbmNlbGxlZCBieSBjYWxsaW5nIHtAbGluayBjYW5jZWx8YHNjb3BlLmNhbmNlbCgpYH1gLiBUaGlzIG1heSBiZSB1c2VkLFxuICogZm9yIGV4YW1wbGUsIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gQWN0aXZpdHkgb3IgQ2hpbGQgV29ya2Zsb3c6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICogY29uc3QgYWN0aXZpdHlQcm9taXNlID0gY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlLnJ1bigoKSA9PiBzb21lQWN0aXZpdHkoKSk7XG4gKiBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUuY2FuY2VsKCk7IC8vIENhbmNlbHMgdGhlIGFjdGl2aXR5XG4gKiBhd2FpdCBhY3Rpdml0eVByb21pc2U7IC8vIFRocm93cyBgQWN0aXZpdHlGYWlsdXJlYCB3aXRoIGBjYXVzZWAgc2V0IHRvIGBDYW5jZWxsZWRGYWlsdXJlYFxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIHNjb3BlIGNhbmNlbGxhdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHJlcXVlc3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCB0aGVuIHRoaXMgc2NvcGUgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIGNhbmNlbGxlZCwgZXZlbiBpZiBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGlzIHJlY2VpdmVkIChlaXRoZXJcbiAgICogZGlyZWN0bHkgYnkgY2FsbGluZyBgc2NvcGUuY2FuY2VsKClgIG9yIGluZGlyZWN0bHkgYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuIFRoaXMgZWZmZWN0aXZlbHlcbiAgICogc2hpZWxkcyB0aGUgc2NvcGUncyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBtYWRlIG9uIHRoZVxuICAgKiBub24tY2FuY2VsbGFibGUgc2NvcGUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgUHJvbWlzZSByZXR1cm5lZCBieSB0aGUgYHJ1bmAgZnVuY3Rpb24gb2Ygbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSBzdGlsbCB0aHJvdyBhIGBDYW5jZWxsZWRGYWlsdXJlYFxuICAgKiBpZiBzdWNoIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSB3aXRoaW4gdGhhdCBzY29wZSAoZS5nLiBieSBkaXJlY3RseSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgY2hpbGQgc2NvcGUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbGxhYmxlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLCBkZWZhdWx0cyB0byB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudH0oKVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlO1xuXG4gIC8qKlxuICAgKiBBIFByb21pc2UgdGhhdCB0aHJvd3Mgd2hlbiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlY2VpdmVzIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QsIGVpdGhlciBkaXJlY3RseVxuICAgKiAoaS5lLiBgc2NvcGUuY2FuY2VsKClgKSwgb3IgaW5kaXJlY3RseSAoYnkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIHBhcmVudCBzY29wZSkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBtYXkgcmVjZWl2ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMsIHJlc3VsdGluZyBpbiB0aGUgYGNhbmNlbFJlcXVlc3RlZGAgcHJvbWlzZSBmb3JcbiAgICogdGhhdCBzY29wZSB0byB0aHJvdywgdGhvdWdoIHRoZSBzY29wZSB3aWxsIG5vdCBlZmZlY3RpdmVseSBnZXQgY2FuY2VsbGVkIChpLmUuIGBjb25zaWRlcmVkQ2FuY2VsbGVkYCB3aWxsIHN0aWxsXG4gICAqIHJldHVybiBgZmFsc2VgLCBhbmQgY2FuY2VsbGF0aW9uIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gY2hpbGQgc2NvcGVzIGFuZCBjb250YWluZWQgb3BlcmF0aW9ucykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsUmVxdWVzdGVkOiBQcm9taXNlPG5ldmVyPjtcblxuICAjY2FuY2VsUmVxdWVzdGVkID0gZmFsc2U7XG5cbiAgLy8gVHlwZXNjcmlwdCBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gbXNPcHRpb25hbFRvTnVtYmVyKG9wdGlvbnM/LnRpbWVvdXQpO1xuICAgIHRoaXMuY2FuY2VsbGFibGUgPSBvcHRpb25zPy5jYW5jZWxsYWJsZSA/PyB0cnVlO1xuICAgIHRoaXMuY2FuY2VsUmVxdWVzdGVkID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUU0MgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhlIFByb21pc2UgZXhlY3V0b3IgcnVucyBzeW5jaHJvbm91c2x5XG4gICAgICB0aGlzLnJlamVjdCA9IChlcnIpID0+IHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkKTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICAgIGlmIChvcHRpb25zPy5wYXJlbnQgIT09IE5PX1BBUkVOVCkge1xuICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zPy5wYXJlbnQgfHwgQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxsYWJsZSB8fFxuICAgICAgICAodGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZCAmJlxuICAgICAgICAgICFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCA9IHRoaXMucGFyZW50LiNjYW5jZWxSZXF1ZXN0ZWQ7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdChlcnIpO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCFnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2NvcGUgd2FzIGVmZmVjdGl2ZWx5IGNhbmNlbGxlZC4gQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25zaWRlcmVkQ2FuY2VsbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgJiYgdGhpcy5jYW5jZWxsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSB0aGUgc2NvcGUgYXMgY3VycmVudCBhbmQgcnVuICBgZm5gXG4gICAqXG4gICAqIEFueSB0aW1lcnMsIEFjdGl2aXRpZXMsIFRyaWdnZXJzIGFuZCBDYW5jZWxsYXRpb25TY29wZXMgY3JlYXRlZCBpbiB0aGUgYm9keSBvZiBgZm5gXG4gICAqIGF1dG9tYXRpY2FsbHkgbGluayB0aGVpciBjYW5jZWxsYXRpb24gdG8gdGhpcyBzY29wZS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCB0aGlzLnJ1bkluQ29udGV4dC5iaW5kKHRoaXMsIGZuKSBhcyAoKSA9PiBQcm9taXNlPFQ+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdGhhdCBydW5zIGEgZnVuY3Rpb24gaW4gQXN5bmNMb2NhbFN0b3JhZ2UgY29udGV4dC5cbiAgICpcbiAgICogQ291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gYXMgYW5vbnltb3VzIGZ1bmN0aW9uLCBtYWRlIGludG8gYSBtZXRob2QgZm9yIGltcHJvdmVkIHN0YWNrIHRyYWNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBydW5JbkNvbnRleHQ8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGltZXJTY29wZTogQ2FuY2VsbGF0aW9uU2NvcGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSgpO1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHRpbWVyU2NvcGVcbiAgICAgICAgICAucnVuKCgpID0+IHNsZWVwKHRoaXMudGltZW91dCBhcyBudW1iZXIpKVxuICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5jYW5jZWwoKSxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gc2NvcGUgd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBpZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGltZXJTY29wZSAmJlxuICAgICAgICAhdGltZXJTY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkICYmXG4gICAgICAgIGdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aW1lclNjb3BlLmNhbmNlbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIGNhbmNlbCB0aGUgc2NvcGUgYW5kIGxpbmtlZCBjaGlsZHJlblxuICAgKi9cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdDYW5jZWxsYXRpb24gc2NvcGUgY2FuY2VsbGVkJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHNjb3BlXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpOiBDYW5jZWxsYXRpb25TY29wZSB7XG4gICAgLy8gVXNpbmcgZ2xvYmFscyBkaXJlY3RseSBpbnN0ZWFkIG9mIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGF2b2lkIGNpcmN1bGFyIGltcG9ydFxuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCkgPz8gKGdsb2JhbFRoaXMgYXMgYW55KS5fX1RFTVBPUkFMX0FDVElWQVRPUl9fLnJvb3RTY29wZTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIGNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUgfSkucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyBub25DYW5jZWxsYWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiBmYWxzZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgd2l0aFRpbWVvdXQ8VD4odGltZW91dDogRHVyYXRpb24sIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IHRydWUsIHRpbWVvdXQgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPENhbmNlbGxhdGlvblNjb3BlPigpO1xuXG4vKipcbiAqIEF2b2lkIGV4cG9zaW5nIHRoZSBzdG9yYWdlIGRpcmVjdGx5IHNvIGl0IGRvZXNuJ3QgZ2V0IGZyb3plblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZVN0b3JhZ2UoKTogdm9pZCB7XG4gIHN0b3JhZ2UuZGlzYWJsZSgpO1xufVxuXG5leHBvcnQgY2xhc3MgUm9vdENhbmNlbGxhdGlvblNjb3BlIGV4dGVuZHMgQ2FuY2VsbGF0aW9uU2NvcGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IGNhbmNlbGxhYmxlOiB0cnVlLCBwYXJlbnQ6IE5PX1BBUkVOVCB9KTtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChuZXcgQ2FuY2VsbGVkRmFpbHVyZSgnV29ya2Zsb3cgY2FuY2VsbGVkJykpO1xuICB9XG59XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhpcyBtb2R1bGUgYW5kIHdvcmtmbG93LnRzICovXG5sZXQgc2xlZXAgPSAoXzogRHVyYXRpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBoYXMgbm90IGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNsZWVwSW1wbGVtZW50YXRpb24oZm46IHR5cGVvZiBzbGVlcCk6IHZvaWQge1xuICBzbGVlcCA9IGZuO1xufVxuIiwiaW1wb3J0IHsgQWN0aXZpdHlGYWlsdXJlLCBDYW5jZWxsZWRGYWlsdXJlLCBDaGlsZFdvcmtmbG93RmFpbHVyZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIHdvcmtmbG93IGVycm9yc1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1dvcmtmbG93RXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFRocm93biBpbiB3b3JrZmxvdyB3aGVuIGl0IHRyaWVzIHRvIGRvIHNvbWV0aGluZyB0aGF0IG5vbi1kZXRlcm1pbmlzdGljIHN1Y2ggYXMgY29uc3RydWN0IGEgV2Vha1JlZigpXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcicpXG5leHBvcnQgY2xhc3MgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciBleHRlbmRzIFdvcmtmbG93RXJyb3Ige31cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgYWN0cyBhcyBhIG1hcmtlciBmb3IgdGhpcyBzcGVjaWFsIHJlc3VsdCB0eXBlXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignTG9jYWxBY3Rpdml0eURvQmFja29mZicpXG5leHBvcnQgY2xhc3MgTG9jYWxBY3Rpdml0eURvQmFja29mZiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGJhY2tvZmY6IGNvcmVzZGsuYWN0aXZpdHlfcmVzdWx0LklEb0JhY2tvZmYpIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHByb3ZpZGVkIGBlcnJgIGlzIGNhdXNlZCBieSBjYW5jZWxsYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGVyciBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUgfHxcbiAgICAoKGVyciBpbnN0YW5jZW9mIEFjdGl2aXR5RmFpbHVyZSB8fCBlcnIgaW5zdGFuY2VvZiBDaGlsZFdvcmtmbG93RmFpbHVyZSkgJiYgZXJyLmNhdXNlIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHR5cGUgU2RrRmxhZyA9IHtcbiAgZ2V0IGlkKCk6IG51bWJlcjtcbiAgZ2V0IGRlZmF1bHQoKTogYm9vbGVhbjtcbiAgZ2V0IGFsdGVybmF0aXZlQ29uZGl0aW9ucygpOiBBbHRDb25kaXRpb25GbltdIHwgdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZmxhZ3NSZWdpc3RyeTogTWFwPG51bWJlciwgU2RrRmxhZz4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBTZGtGbGFncyA9IHtcbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBnYXRlcyBtdWx0aXBsZSBmaXhlcyByZWxhdGVkIHRvIGNhbmNlbGxhdGlvbiBzY29wZXMgYW5kIHRpbWVycyBpbnRyb2R1Y2VkIGluIDEuMTAuMi8xLjExLjA6XG4gICAqIC0gQ2FuY2VsbGF0aW9uIG9mIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG5vIGxvbmdlciBwcm9wYWdhdGVzIHRvIGNoaWxkcmVuIHNjb3Blc1xuICAgKiAgIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLXR5cGVzY3JpcHQvaXNzdWVzLzE0MjMpLlxuICAgKiAtIENhbmNlbGxhdGlvblNjb3BlLndpdGhUaW1lb3V0KGZuKSBub3cgY2FuY2VsIHRoZSB0aW1lciBpZiBgZm5gIGNvbXBsZXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuICAgKiAgIG9mIHRoZSB0aW1lb3V0LCBzaW1pbGFyIHRvIGhvdyBgY29uZGl0aW9uKGZuLCB0aW1lb3V0KWAgd29ya3MuXG4gICAqIC0gVGltZXJzIGNyZWF0ZWQgdXNpbmcgc2V0VGltZW91dCBjYW4gbm93IGJlIGludGVyY2VwdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wLiBIb3dldmVyLCBkdWUgdG8gYW4gU0RLIGJ1ZywgU0RLcyB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90XG4gICAqICAgICAgICBwcm9wZXJseSB3cml0aW5nIGJhY2sgdGhlIGZsYWdzIHRvIGhpc3RvcnksIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmVcbiAgICogICAgICAgIGNvbnNpZGVyIHRoYXQgYSBXRlQgZW1pdHRlZCBieSBXb3JrZXIgdjEuMTEuMCBvciB2MS4xMS4xIHRvIGltcGxpY2l0bHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBOb25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uOiBkZWZpbmVGbGFnKDEsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBQcmlvciB0byAxLjExLjAsIHdoZW4gcHJvY2Vzc2luZyBhIFdvcmtmbG93IGFjdGl2YXRpb24sIHRoZSBTREsgd291bGQgZXhlY3V0ZSBgbm90aWZ5SGFzUGF0Y2hgXG4gICAqIGFuZCBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgaW4gZGlzdGluY3QgcGhhc2VzLCBiZWZvcmUgb3RoZXIgdHlwZXMgb2Ygam9icy4gVGhlIHByaW1hcnkgcmVhc29uXG4gICAqIGJlaGluZCB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3YXMgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSBXb3JrZmxvdyBleGVjdXRpb24gbWlnaHRcbiAgICogY29tcGxldGUgYmVmb3JlIGFsbCBpbmNvbWluZyBzaWduYWxzIGhhdmUgYmVlbiBkaXNwYXRjaGVkIChhdCBsZWFzdCB0byB0aGUgcG9pbnQgdGhhdCB0aGVcbiAgICogX3N5bmNocm9ub3VzXyBwYXJ0IG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkKS5cbiAgICpcbiAgICogVGhpcyBmbGFnIHJlcGxhY2VzIHRoYXQgbXVsdGktcGhhc2UgYWxnb3JpdGhtIHdpdGggYSBzaW1wbGVyIG9uZSB3aGVyZSBqb2JzIGFyZSBzaW1wbHkgc29ydGVkIGFzXG4gICAqIGAoc2lnbmFscyBhbmQgdXBkYXRlcykgLT4gb3RoZXJzYCwgYnV0IHdpdGhvdXQgcHJvY2Vzc2luZyB0aGVtIGFzIGRpc3RpbmN0IGJhdGNoZXMgKGkuZS4gd2l0aG91dFxuICAgKiBsZWF2aW5nL3JlZW50ZXJpbmcgdGhlIFZNIGNvbnRleHQgYmV0d2VlbiBlYWNoIGdyb3VwLCB3aGljaCBhdXRvbWF0aWNhbGx5IHRyaWdnZXJzIHRoZSBleGVjdXRpb25cbiAgICogb2YgYWxsIG91dHN0YW5kaW5nIG1pY3JvdGFza3MpLiBUaGF0IHNpbmdsZS1waGFzZSBhcHByb2FjaCByZXNvbHZlcyBhIG51bWJlciBvZiBxdWlya3Mgb2YgdGhlXG4gICAqIGZvcm1lciBhbGdvcml0aG0sIGFuZCB5ZXQgc3RpbGwgc2F0aXNmaWVzIHRvIHRoZSBvcmlnaW5hbCByZXF1aXJlbWVudCBvZiBlbnN1cmluZyB0aGF0IGV2ZXJ5XG4gICAqIGBzaWduYWxXb3JrZmxvd2Agam9icyAtIGFuZCBub3cgYGRvVXBkYXRlYCBqb2JzIGFzIHdlbGwgLSBoYXZlIGJlZW4gZ2l2ZW4gYSBwcm9wZXIgY2hhbmNlIHRvXG4gICAqIGV4ZWN1dGUgYmVmb3JlIHRoZSBXb3JrZmxvdyBtYWluIGZ1bmN0aW9uIG1pZ2h0IGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMS4wLiBUaGlzIGNoYW5nZSBpcyBub3Qgcm9sbGJhY2stc2FmZS4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3NcbiAgICogICAgICAgIHYxLjExLjAgYW5kIHYxLjExLjEgd2VyZSBub3QgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmdcbiAgICogICAgICAgIGluIE5ERSBvbiByZXBsYXkuIFdlIHRoZXJlZm9yZSBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMVxuICAgKiAgICAgICAgdG8gaW1wbGljaXRlbHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBQcm9jZXNzV29ya2Zsb3dBY3RpdmF0aW9uSm9ic0FzU2luZ2xlQmF0Y2g6IGRlZmluZUZsYWcoMiwgdHJ1ZSwgW2J1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcygvMVxcLjExXFwuWzAxXS8pXSksXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBkZWZpbmVGbGFnKGlkOiBudW1iZXIsIGRlZjogYm9vbGVhbiwgYWx0ZXJuYXRpdmVDb25kaXRpb25zPzogQWx0Q29uZGl0aW9uRm5bXSk6IFNka0ZsYWcge1xuICBjb25zdCBmbGFnID0geyBpZCwgZGVmYXVsdDogZGVmLCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnMgfTtcbiAgZmxhZ3NSZWdpc3RyeS5zZXQoaWQsIGZsYWcpO1xuICByZXR1cm4gZmxhZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkRmxhZyhpZDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghZmxhZ3NSZWdpc3RyeS5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmtub3duIFNESyBmbGFnOiAke2lkfWApO1xufVxuXG4vKipcbiAqIEFuIFNESyBGbGFnIEFsdGVybmF0ZSBDb25kaXRpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBmbGFnXG4gKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXRlQ7IGUuZy4gYnkgbG9va2luZyBhdCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLXG4gKiB0aGF0IGVtaXR0ZWQgYSBXRlQuIFRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRvIHJldHJvYWN0aXZlbHkgdHVybiBvbiBzb21lIGZsYWdzIGZvciBXRlRcbiAqIGVtaXR0ZWQgYnkgcHJldmlvdXMgU0RLcyB0aGF0IGNvbnRhaW5lZCBhIGJ1Zy5cbiAqXG4gKiBOb3RlIHRoYXQgY29uZGl0aW9ucyBhcmUgb25seSBldmFsdWF0ZWQgd2hpbGUgcmVwbGF5aW5nLCBhbmQgb25seSBpZiB0aGUgY29ycmVzcG9uaW5nIGZsYWcgaXNcbiAqIG5vdCBhbHJlYWR5IHNldC4gQWxzbywgYWx0ZXJuYXRlIGNvbmRpdGlvbnMgd2lsbCBub3QgY2F1c2UgdGhlIGZsYWcgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZVxuICogXCJ1c2VkIGZsYWdzXCIgc2V0LCB3aGljaCBtZWFucyB0aGF0IGZ1cnRoZXIgV29ya2Zsb3cgVGFza3MgbWF5IG5vdCByZWZsZWN0IHRoaXMgZmxhZyBpZiB0aGVcbiAqIGNvbmRpdGlvbiBubyBsb25nZXIgaG9sZHMuIFRoaXMgaXMgc28gdG8gYXZvaWQgaW5jb3JyZWN0IGJlaGF2aW9ycyBpbiBjYXNlIHdoZXJlIGEgV29ya2Zsb3dcbiAqIEV4ZWN1dGlvbiBoYXMgZ29uZSB0aHJvdWdoIGEgbmV3ZXIgU0RLIHZlcnNpb24gdGhlbiBhZ2FpbiB0aHJvdWdoIGFuIG9sZGVyIG9uZS5cbiAqL1xudHlwZSBBbHRDb25kaXRpb25GbiA9IChjdHg6IHsgaW5mbzogV29ya2Zsb3dJbmZvIH0pID0+IGJvb2xlYW47XG5cbmZ1bmN0aW9uIGJ1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcyh2ZXJzaW9uOiBSZWdFeHApOiBBbHRDb25kaXRpb25GbiB7XG4gIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXkB0ZW1wb3JhbGlvL3dvcmtlckAoJHt2ZXJzaW9uLnNvdXJjZX0pWytdYCk7XG4gIHJldHVybiAoeyBpbmZvIH0pID0+IGluZm8uY3VycmVudEJ1aWxkSWQgIT0gbnVsbCAmJiByZWdleC50ZXN0KGluZm8uY3VycmVudEJ1aWxkSWQpO1xufVxuIiwiaW1wb3J0IHsgSWxsZWdhbFN0YXRlRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgdHlwZSBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUdldEFjdGl2YXRvclVudHlwZWQoKTogdW5rbm93biB7XG4gIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fVEVNUE9SQUxfQUNUSVZBVE9SX187XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3RpdmF0b3JVbnR5cGVkKGFjdGl2YXRvcjogdW5rbm93bik6IHZvaWQge1xuICAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fVEVNUE9SQUxfQUNUSVZBVE9SX18gPSBhY3RpdmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXliZUdldEFjdGl2YXRvcigpOiBBY3RpdmF0b3IgfCB1bmRlZmluZWQge1xuICByZXR1cm4gbWF5YmVHZXRBY3RpdmF0b3JVbnR5cGVkKCkgYXMgQWN0aXZhdG9yIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQobWVzc2FnZTogc3RyaW5nKTogQWN0aXZhdG9yIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgaWYgKGFjdGl2YXRvciA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBhY3RpdmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmF0b3IoKTogQWN0aXZhdG9yIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbWF5YmVHZXRBY3RpdmF0b3IoKTtcbiAgaWYgKGFjdGl2YXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyB1bmluaXRpYWxpemVkJyk7XG4gIH1cbiAgcmV0dXJuIGFjdGl2YXRvcjtcbn1cbiIsIi8qKlxuICogT3ZlcnJpZGVzIHNvbWUgZ2xvYmFsIG9iamVjdHMgdG8gbWFrZSB0aGVtIGRldGVybWluaXN0aWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBtc1RvVHMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3dvcmtmbG93JztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyBhbnk7XG5jb25zdCBPcmlnaW5hbERhdGUgPSBnbG9iYWxUaGlzLkRhdGU7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUdsb2JhbHMoKTogdm9pZCB7XG4gIC8vIE1vY2sgYW55IHdlYWsgcmVmZXJlbmNlIGJlY2F1c2UgR0MgaXMgbm9uLWRldGVybWluaXN0aWMgYW5kIHRoZSBlZmZlY3QgaXMgb2JzZXJ2YWJsZSBmcm9tIHRoZSBXb3JrZmxvdy5cbiAgLy8gV29ya2Zsb3cgZGV2ZWxvcGVyIHdpbGwgZ2V0IGEgbWVhbmluZ2Z1bCBleGNlcHRpb24gaWYgdGhleSB0cnkgdG8gdXNlIHRoZXNlLlxuICBnbG9iYWwuV2Vha1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcignV2Vha1JlZiBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYycpO1xuICB9O1xuICBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoXG4gICAgICAnRmluYWxpemF0aW9uUmVnaXN0cnkgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnXG4gICAgKTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IChPcmlnaW5hbERhdGUgYXMgYW55KSguLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmlnaW5hbERhdGUoZ2V0QWN0aXZhdG9yKCkubm93KTtcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEFjdGl2YXRvcigpLm5vdztcbiAgfTtcblxuICBnbG9iYWwuRGF0ZS5wYXJzZSA9IE9yaWdpbmFsRGF0ZS5wYXJzZS5iaW5kKE9yaWdpbmFsRGF0ZSk7XG4gIGdsb2JhbC5EYXRlLlVUQyA9IE9yaWdpbmFsRGF0ZS5VVEMuYmluZChPcmlnaW5hbERhdGUpO1xuXG4gIGdsb2JhbC5EYXRlLnByb3RvdHlwZSA9IE9yaWdpbmFsRGF0ZS5wcm90b3R5cGU7XG5cbiAgY29uc3QgdGltZW91dENhbmNlbGF0aW9uU2NvcGVzID0gbmV3IE1hcDxudW1iZXIsIENhbmNlbGxhdGlvblNjb3BlPigpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbXMgc2xlZXAgZHVyYXRpb24gLSAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gSWYgZ2l2ZW4gYSBuZWdhdGl2ZSBudW1iZXIsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gICAqL1xuICBnbG9iYWwuc2V0VGltZW91dCA9IGZ1bmN0aW9uIChjYjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIG1zOiBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogbnVtYmVyIHtcbiAgICBtcyA9IE1hdGgubWF4KDEsIG1zKTtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICBpZiAoYWN0aXZhdG9yLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpIHtcbiAgICAgIC8vIENhcHR1cmUgdGhlIHNlcXVlbmNlIG51bWJlciB0aGF0IHNsZWVwIHdpbGwgYWxsb2NhdGVcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcjtcbiAgICAgIGNvbnN0IHRpbWVyU2NvcGUgPSBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHNsZWVwUHJvbWlzZSA9IHRpbWVyU2NvcGUucnVuKCgpID0+IHNsZWVwKG1zKSk7XG4gICAgICBzbGVlcFByb21pc2UudGhlbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRDYW5jZWxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgICBjYiguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRDYW5jZWxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNsZWVwUHJvbWlzZSk7XG4gICAgICB0aW1lb3V0Q2FuY2VsYXRpb25TY29wZXMuc2V0KHNlcSwgdGltZXJTY29wZSk7XG4gICAgICByZXR1cm4gc2VxO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXIrKztcbiAgICAgIC8vIENyZWF0ZSBhIFByb21pc2UgZm9yIEFzeW5jTG9jYWxTdG9yYWdlIHRvIGJlIGFibGUgdG8gdHJhY2sgdGhpcyBjb21wbGV0aW9uIHVzaW5nIHByb21pc2UgaG9va3MuXG4gICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICBzdGFydFRpbWVyOiB7XG4gICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICBzdGFydFRvRmlyZVRpbWVvdXQ6IG1zVG9UcyhtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KS50aGVuKFxuICAgICAgICAoKSA9PiBjYiguLi5hcmdzKSxcbiAgICAgICAgKCkgPT4gdW5kZWZpbmVkIC8qIGlnbm9yZSBjYW5jZWxsYXRpb24gKi9cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2VxO1xuICAgIH1cbiAgfTtcblxuICBnbG9iYWwuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKGhhbmRsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gICAgY29uc3QgdGltZXJTY29wZSA9IHRpbWVvdXRDYW5jZWxhdGlvblNjb3Blcy5nZXQoaGFuZGxlKTtcbiAgICBpZiAodGltZXJTY29wZSkge1xuICAgICAgdGltZW91dENhbmNlbGF0aW9uU2NvcGVzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7IC8vIFNob3VsZG4ndCBpbmNyZWFzZSBzZXEgbnVtYmVyLCBidXQgdGhhdCdzIHRoZSBsZWdhY3kgYmVoYXZpb3JcbiAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5kZWxldGUoaGFuZGxlKTtcbiAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgc2VxOiBoYW5kbGUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gYWN0aXZhdG9yLnJhbmRvbSBpcyBtdXRhYmxlLCBkb24ndCBoYXJkY29kZSBpdHMgcmVmZXJlbmNlXG4gIE1hdGgucmFuZG9tID0gKCkgPT4gZ2V0QWN0aXZhdG9yKCkucmFuZG9tKCk7XG59XG4iLCIvKipcbiAqIFRoaXMgbGlicmFyeSBwcm92aWRlcyB0b29scyByZXF1aXJlZCBmb3IgYXV0aG9yaW5nIHdvcmtmbG93cy5cbiAqXG4gKiAjIyBVc2FnZVxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvaGVsbG8td29ybGQjd29ya2Zsb3dzIHwgdHV0b3JpYWx9IGZvciB3cml0aW5nIHlvdXIgZmlyc3Qgd29ya2Zsb3cuXG4gKlxuICogIyMjIFRpbWVyc1xuICpcbiAqIFRoZSByZWNvbW1lbmRlZCB3YXkgb2Ygc2NoZWR1bGluZyB0aW1lcnMgaXMgYnkgdXNpbmcgdGhlIHtAbGluayBzbGVlcH0gZnVuY3Rpb24uIFdlJ3ZlIHJlcGxhY2VkIGBzZXRUaW1lb3V0YCBhbmRcbiAqIGBjbGVhclRpbWVvdXRgIHdpdGggZGV0ZXJtaW5pc3RpYyB2ZXJzaW9ucyBzbyB0aGVzZSBhcmUgYWxzbyB1c2FibGUgYnV0IGhhdmUgYSBsaW1pdGF0aW9uIHRoYXQgdGhleSBkb24ndCBwbGF5IHdlbGxcbiAqIHdpdGgge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2NhbmNlbGxhdGlvbi1zY29wZXMgfCBjYW5jZWxsYXRpb24gc2NvcGVzfS5cbiAqXG4gKiA8IS0tU05JUFNUQVJUIHR5cGVzY3JpcHQtc2xlZXAtd29ya2Zsb3ctLT5cbiAqIDwhLS1TTklQRU5ELS0+XG4gKlxuICogIyMjIEFjdGl2aXRpZXNcbiAqXG4gKiBUbyBzY2hlZHVsZSBBY3Rpdml0aWVzLCB1c2Uge0BsaW5rIHByb3h5QWN0aXZpdGllc30gdG8gb2J0YWluIGFuIEFjdGl2aXR5IGZ1bmN0aW9uIGFuZCBjYWxsLlxuICpcbiAqIDwhLS1TTklQU1RBUlQgdHlwZXNjcmlwdC1zY2hlZHVsZS1hY3Rpdml0eS13b3JrZmxvdy0tPlxuICogPCEtLVNOSVBFTkQtLT5cbiAqXG4gKiAjIyMgVXBkYXRlcywgU2lnbmFscyBhbmQgUXVlcmllc1xuICpcbiAqIFVzZSB7QGxpbmsgc2V0SGFuZGxlcn0gdG8gc2V0IGhhbmRsZXJzIGZvciBVcGRhdGVzLCBTaWduYWxzLCBhbmQgUXVlcmllcy5cbiAqXG4gKiBVcGRhdGUgYW5kIFNpZ25hbCBoYW5kbGVycyBjYW4gYmUgZWl0aGVyIGFzeW5jIG9yIG5vbi1hc3luYyBmdW5jdGlvbnMuIFVwZGF0ZSBoYW5kbGVycyBtYXkgcmV0dXJuIGEgdmFsdWUsIGJ1dCBzaWduYWxcbiAqIGhhbmRsZXJzIG1heSBub3QgKHJldHVybiBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gKS4gWW91IG1heSB1c2UgQWN0aXZpdGllcywgVGltZXJzLCBjaGlsZCBXb3JrZmxvd3MsIGV0YyBpbiBVcGRhdGVcbiAqIGFuZCBTaWduYWwgaGFuZGxlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZSBkb25lIGNhdXRpb3VzbHk6IGZvciBleGFtcGxlLCBub3RlIHRoYXQgaWYgeW91IGF3YWl0IGFzeW5jIG9wZXJhdGlvbnMgc3VjaCBhc1xuICogdGhlc2UgaW4gYW4gVXBkYXRlIG9yIFNpZ25hbCBoYW5kbGVyLCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHdvcmtmbG93IGRvZXMgbm90IGNvbXBsZXRlIGZpcnN0LlxuICpcbiAqIFF1ZXJ5IGhhbmRsZXJzIG1heSAqKm5vdCoqIGJlIGFzeW5jIGZ1bmN0aW9ucywgYW5kIG1heSAqKm5vdCoqIG11dGF0ZSBhbnkgdmFyaWFibGVzIG9yIHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsXG4gKiBjaGlsZCBXb3JrZmxvd3MsIGV0Yy5cbiAqXG4gKiAjIyMjIEltcGxlbWVudGF0aW9uXG4gKlxuICogPCEtLVNOSVBTVEFSVCB0eXBlc2NyaXB0LXdvcmtmbG93LXVwZGF0ZS1zaWduYWwtcXVlcnktZXhhbXBsZS0tPlxuICogPCEtLVNOSVBFTkQtLT5cbiAqXG4gKiAjIyMgTW9yZVxuICpcbiAqIC0gW0RldGVybWluaXN0aWMgYnVpbHQtaW5zXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9kZXRlcm1pbmlzbSNzb3VyY2VzLW9mLW5vbi1kZXRlcm1pbmlzbSlcbiAqIC0gW0NhbmNlbGxhdGlvbiBhbmQgc2NvcGVzXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzKVxuICogICAtIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1cbiAqICAgLSB7QGxpbmsgVHJpZ2dlcn1cbiAqIC0gW1NpbmtzXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vYXBwbGljYXRpb24tZGV2ZWxvcG1lbnQvb2JzZXJ2YWJpbGl0eS8/bGFuZz10cyNsb2dnaW5nKVxuICogICAtIHtAbGluayBTaW5rc31cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuZXhwb3J0IHtcbiAgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICBBY3Rpdml0eUZhaWx1cmUsXG4gIEFjdGl2aXR5T3B0aW9ucyxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIFBheWxvYWRDb252ZXJ0ZXIsXG4gIFJldHJ5UG9saWN5LFxuICByb290Q2F1c2UsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9lcnJvcnMnO1xuZXhwb3J0IHtcbiAgQWN0aXZpdHlGdW5jdGlvbixcbiAgQWN0aXZpdHlJbnRlcmZhY2UsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgUGF5bG9hZCxcbiAgUXVlcnlEZWZpbml0aW9uLFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSxcbiAgU2lnbmFsRGVmaW5pdGlvbixcbiAgVW50eXBlZEFjdGl2aXRpZXMsXG4gIFdvcmtmbG93LFxuICBXb3JrZmxvd1F1ZXJ5VHlwZSxcbiAgV29ya2Zsb3dSZXN1bHRUeXBlLFxuICBXb3JrZmxvd1JldHVyblR5cGUsXG4gIFdvcmtmbG93U2lnbmFsVHlwZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvd29ya2Zsb3ctaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvd29ya2Zsb3ctb3B0aW9ucyc7XG5leHBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSwgQ2FuY2VsbGF0aW9uU2NvcGUsIENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucyB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmV4cG9ydCB7XG4gIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBDaGlsZFdvcmtmbG93T3B0aW9ucyxcbiAgQ29udGludWVBc05ldyxcbiAgQ29udGludWVBc05ld09wdGlvbnMsXG4gIEVuaGFuY2VkU3RhY2tUcmFjZSxcbiAgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbixcbiAgU3RhY2tUcmFjZUZpbGVTbGljZSxcbiAgUGFyZW50Q2xvc2VQb2xpY3ksXG4gIFBhcmVudFdvcmtmbG93SW5mbyxcbiAgU3RhY2tUcmFjZVNES0luZm8sXG4gIFN0YWNrVHJhY2UsXG4gIFVuc2FmZVdvcmtmbG93SW5mbyxcbiAgV29ya2Zsb3dJbmZvLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0IHsgcHJveHlTaW5rcywgU2luaywgU2lua0NhbGwsIFNpbmtGdW5jdGlvbiwgU2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmV4cG9ydCB7IGxvZyB9IGZyb20gJy4vbG9ncyc7XG5leHBvcnQgeyBUcmlnZ2VyIH0gZnJvbSAnLi90cmlnZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya2Zsb3cnO1xuZXhwb3J0IHsgQ2hpbGRXb3JrZmxvd0hhbmRsZSwgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSB9IGZyb20gJy4vd29ya2Zsb3ctaGFuZGxlJztcblxuLy8gQW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGlzIGRlcHJlY2F0ZWRcblxuZXhwb3J0IHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gIExvZ2dlclNpbmtzRGVwcmVjYXRlZCBhcyBMb2dnZXJTaW5rcyxcbn0gZnJvbSAnLi9sb2dzJztcbiIsIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBhbmQgZ2VuZXJpYyBoZWxwZXJzIGZvciBpbnRlcmNlcHRvcnMuXG4gKlxuICogVGhlIFdvcmtmbG93IHNwZWNpZmljIGludGVyY2VwdG9ycyBhcmUgZGVmaW5lZCBoZXJlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBY3Rpdml0eU9wdGlvbnMsIEhlYWRlcnMsIExvY2FsQWN0aXZpdHlPcHRpb25zLCBOZXh0LCBUaW1lc3RhbXAsIFdvcmtmbG93RXhlY3V0aW9uIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzLCBDb250aW51ZUFzTmV3T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCB7IE5leHQsIEhlYWRlcnMgfTtcblxuLyoqIElucHV0IGZvciBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmV4ZWN1dGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dFeGVjdXRlSW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVVcGRhdGUgYW5kXG4gKiBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLnZhbGlkYXRlVXBkYXRlICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgdXBkYXRlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVTaWduYWwgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsSW5wdXQge1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVF1ZXJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5SW5wdXQge1xuICByZWFkb25seSBxdWVyeUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1ZXJ5TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW1wbGVtZW50IGFueSBvZiB0aGVzZSBtZXRob2RzIHRvIGludGVyY2VwdCBXb3JrZmxvdyBpbmJvdW5kIGNhbGxzIGxpa2UgZXhlY3V0aW9uLCBhbmQgc2lnbmFsIGFuZCBxdWVyeSBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IGV4ZWN1dGUgbWV0aG9kIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgV29ya2Zsb3cgZXhlY3V0aW9uXG4gICAqL1xuICBleGVjdXRlPzogKGlucHV0OiBXb3JrZmxvd0V4ZWN1dGVJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnZXhlY3V0ZSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBVcGRhdGUgaGFuZGxlciBpcyBjYWxsZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIFVwZGF0ZVxuICAgKi9cbiAgaGFuZGxlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnaGFuZGxlVXBkYXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqIENhbGxlZCB3aGVuIHVwZGF0ZSB2YWxpZGF0b3IgY2FsbGVkICovXG4gIHZhbGlkYXRlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAndmFsaWRhdGVVcGRhdGUnPikgPT4gdm9pZDtcblxuICAvKiogQ2FsbGVkIHdoZW4gc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byBhIFdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuICBoYW5kbGVTaWduYWw/OiAoaW5wdXQ6IFNpZ25hbElucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdoYW5kbGVTaWduYWwnPikgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBXb3JrZmxvdyBpcyBxdWVyaWVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBxdWVyeVxuICAgKi9cbiAgaGFuZGxlUXVlcnk/OiAoaW5wdXQ6IFF1ZXJ5SW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2hhbmRsZVF1ZXJ5Jz4pID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2NoZWR1bGVBY3Rpdml0eSAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZpdHlUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgb3B0aW9uczogQWN0aXZpdHlPcHRpb25zO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUxvY2FsQWN0aXZpdHkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxBY3Rpdml0eUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZpdHlUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBvcmlnaW5hbFNjaGVkdWxlVGltZT86IFRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xufVxuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCB7XG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRUaW1lciAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lcklucHV0IHtcbiAgcmVhZG9ubHkgZHVyYXRpb25NczogbnVtYmVyO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTYW1lIGFzIENvbnRpbnVlQXNOZXdPcHRpb25zIGJ1dCB3b3JrZmxvd1R5cGUgbXVzdCBiZSBkZWZpbmVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnMgPSBDb250aW51ZUFzTmV3T3B0aW9ucyAmIFJlcXVpcmVkPFBpY2s8Q29udGludWVBc05ld09wdGlvbnMsICd3b3JrZmxvd1R5cGUnPj47XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuY29udGludWVBc05ldyAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3SW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnM7XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2lnbmFsV29ya2Zsb3cgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsV29ya2Zsb3dJbnB1dCB7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBzaWduYWxOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgdGFyZ2V0OlxuICAgIHwge1xuICAgICAgICByZWFkb25seSB0eXBlOiAnZXh0ZXJuYWwnO1xuICAgICAgICByZWFkb25seSB3b3JrZmxvd0V4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb247XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6ICdjaGlsZCc7XG4gICAgICAgIHJlYWRvbmx5IGNoaWxkV29ya2Zsb3dJZDogc3RyaW5nO1xuICAgICAgfTtcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5nZXRMb2dBdHRyaWJ1dGVzICovXG5leHBvcnQgdHlwZSBHZXRMb2dBdHRyaWJ1dGVzSW5wdXQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGNvZGUgY2FsbHMgdG8gdGhlIFRlbXBvcmFsIEFQSXMsIGxpa2Ugc2NoZWR1bGluZyBhbiBhY3Rpdml0eSBhbmQgc3RhcnRpbmcgYSB0aW1lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhbiBBY3Rpdml0eVxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uXG4gICAqL1xuICBzY2hlZHVsZUFjdGl2aXR5PzogKGlucHV0OiBBY3Rpdml0eUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdzY2hlZHVsZUFjdGl2aXR5Jz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNjaGVkdWxlcyBhIGxvY2FsIEFjdGl2aXR5XG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlTG9jYWxBY3Rpdml0eT86IChpbnB1dDogTG9jYWxBY3Rpdml0eUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdzY2hlZHVsZUxvY2FsQWN0aXZpdHknPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgdGltZXJcbiAgICovXG4gIHN0YXJ0VGltZXI/OiAoaW5wdXQ6IFRpbWVySW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ3N0YXJ0VGltZXInPikgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgY2FsbHMgY29udGludWVBc05ld1xuICAgKi9cbiAgY29udGludWVBc05ldz86IChpbnB1dDogQ29udGludWVBc05ld0lucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdjb250aW51ZUFzTmV3Jz4pID0+IFByb21pc2U8bmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzaWduYWxzIGEgY2hpbGQgb3IgZXh0ZXJuYWwgV29ya2Zsb3dcbiAgICovXG4gIHNpZ25hbFdvcmtmbG93PzogKGlucHV0OiBTaWduYWxXb3JrZmxvd0lucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdzaWduYWxXb3JrZmxvdyc+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSBjaGlsZCB3b3JrZmxvdyBleGVjdXRpb24sIHRoZSBpbnRlcmNlcHRvciBmdW5jdGlvbiByZXR1cm5zIDIgcHJvbWlzZXM6XG4gICAqXG4gICAqIC0gVGhlIGZpcnN0IHJlc29sdmVzIHdpdGggdGhlIGBydW5JZGAgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgaGFzIHN0YXJ0ZWQgb3IgcmVqZWN0cyBpZiBmYWlsZWQgdG8gc3RhcnQuXG4gICAqIC0gVGhlIHNlY29uZCByZXNvbHZlcyB3aXRoIHRoZSB3b3JrZmxvdyByZXN1bHQgd2hlbiB0aGUgY2hpbGQgd29ya2Zsb3cgY29tcGxldGVzIG9yIHJlamVjdHMgb24gZmFpbHVyZS5cbiAgICovXG4gIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbj86IChcbiAgICBpbnB1dDogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gICAgbmV4dDogTmV4dDx0aGlzLCAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJz5cbiAgKSA9PiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPjtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgYHdvcmtmbG93LmxvZ2AgbWV0aG9kcy5cbiAgICpcbiAgICogVGhlIGF0dHJpYnV0ZXMgcmV0dXJuZWQgaW4gdGhpcyBjYWxsIGFyZSBhdHRhY2hlZCB0byBldmVyeSBsb2cgbWVzc2FnZS5cbiAgICovXG4gIGdldExvZ0F0dHJpYnV0ZXM/OiAoaW5wdXQ6IEdldExvZ0F0dHJpYnV0ZXNJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnZ2V0TG9nQXR0cmlidXRlcyc+KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmNvbmNsdWRlQWN0aXZhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jbHVkZUFjdGl2YXRpb25JbnB1dCB7XG4gIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbn1cblxuLyoqIE91dHB1dCBmb3IgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5jb25jbHVkZUFjdGl2YXRpb24gKi9cbmV4cG9ydCB0eXBlIENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dCA9IENvbmNsdWRlQWN0aXZhdGlvbklucHV0O1xuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuYWN0aXZhdGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGVJbnB1dCB7XG4gIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uO1xuICBiYXRjaEluZGV4OiBudW1iZXI7XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5kaXNwb3NlICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VJbnB1dCB7fVxuXG4vKipcbiAqIEludGVyY2VwdG9yIGZvciB0aGUgaW50ZXJuYWxzIG9mIHRoZSBXb3JrZmxvdyBydW50aW1lLlxuICpcbiAqIFVzZSB0byBtYW5pcHVsYXRlIG9yIHRyYWNlIFdvcmtmbG93IGFjdGl2YXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgVGhpcyBBUEkgaXMgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcyBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIFdvcmtmbG93IHJ1bnRpbWUgcnVucyBhIFdvcmtmbG93QWN0aXZhdGlvbkpvYi5cbiAgICovXG4gIGFjdGl2YXRlPyhpbnB1dDogQWN0aXZhdGVJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnYWN0aXZhdGUnPik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBhbGwgYFdvcmtmbG93QWN0aXZhdGlvbkpvYmBzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGFuIGFjdGl2YXRpb24uXG4gICAqXG4gICAqIENhbiBtYW5pcHVsYXRlIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYnkgdGhlIFdvcmtmbG93XG4gICAqL1xuICBjb25jbHVkZUFjdGl2YXRpb24/KGlucHV0OiBDb25jbHVkZUFjdGl2YXRpb25JbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnY29uY2x1ZGVBY3RpdmF0aW9uJz4pOiBDb25jbHVkZUFjdGl2YXRpb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBiZWZvcmUgZGlzcG9zaW5nIHRoZSBXb3JrZmxvdyBpc29sYXRlIGNvbnRleHQuXG4gICAqXG4gICAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGFueSByZXNvdXJjZSBjbGVhbnVwLlxuICAgKi9cbiAgZGlzcG9zZT8oaW5wdXQ6IERpc3Bvc2VJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnZGlzcG9zZSc+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIG1hcHBpbmcgZnJvbSBpbnRlcmNlcHRvciB0eXBlIHRvIGFuIG9wdGlvbmFsIGxpc3Qgb2YgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICBpbmJvdW5kPzogV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvcltdO1xuICBvdXRib3VuZD86IFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIGludGVybmFscz86IFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3JbXTtcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB7QGxpbmsgV29ya2Zsb3dJbnRlcmNlcHRvcnN9IGFuZCB0YWtlcyBubyBhcmd1bWVudHMuXG4gKlxuICogV29ya2Zsb3cgaW50ZXJjZXB0b3IgbW9kdWxlcyBzaG91bGQgZXhwb3J0IGFuIGBpbnRlcmNlcHRvcnNgIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBleHBvcnQgZnVuY3Rpb24gaW50ZXJjZXB0b3JzKCk6IFdvcmtmbG93SW50ZXJjZXB0b3JzIHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBpbmJvdW5kOiBbXSwgICAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgICAgb3V0Ym91bmQ6IFtdLCAgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICAgIGludGVybmFsczogW10sIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgPSAoKSA9PiBXb3JrZmxvd0ludGVyY2VwdG9ycztcbiIsImltcG9ydCB0eXBlIHsgUmF3U291cmNlTWFwIH0gZnJvbSAnc291cmNlLW1hcCc7XG5pbXBvcnQge1xuICBSZXRyeVBvbGljeSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBDb21tb25Xb3JrZmxvd09wdGlvbnMsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVcGRhdGVEZWZpbml0aW9uLFxuICBRdWVyeURlZmluaXRpb24sXG4gIER1cmF0aW9uLFxuICBWZXJzaW9uaW5nSW50ZW50LFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJuYWwtd29ya2Zsb3cvZW51bXMtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogV29ya2Zsb3cgRXhlY3V0aW9uIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIElEIG9mIHRoZSBXb3JrZmxvdywgdGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBjbGllbnQgZHVyaW5nIFdvcmtmbG93IGNyZWF0aW9uLlxuICAgKiBBIHNpbmdsZSBXb3JrZmxvdyBtYXkgcnVuIG11bHRpcGxlIHRpbWVzIGUuZy4gd2hlbiBzY2hlZHVsZWQgd2l0aCBjcm9uLlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBhIHNpbmdsZSBXb3JrZmxvdyBydW5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdvcmtmbG93IGZ1bmN0aW9uJ3MgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSBzZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzO1xuXG4gIC8qKlxuICAgKiBOb24taW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBtZW1vPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFBhcmVudCBXb3JrZmxvdyBpbmZvIChwcmVzZW50IGlmIHRoaXMgaXMgYSBDaGlsZCBXb3JrZmxvdylcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudD86IFBhcmVudFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogUmVzdWx0IGZyb20gdGhlIHByZXZpb3VzIFJ1biAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ3JvbiBXb3JrZmxvdyBvciB3YXMgQ29udGludWVkIEFzIE5ldykuXG4gICAqXG4gICAqIEFuIGFycmF5IG9mIHZhbHVlcywgc2luY2Ugb3RoZXIgU0RLcyBtYXkgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyBmcm9tIGEgV29ya2Zsb3cuXG4gICAqL1xuICByZWFkb25seSBsYXN0UmVzdWx0PzogdW5rbm93bjtcblxuICAvKipcbiAgICogRmFpbHVyZSBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgd2hlbiB0aGlzIFJ1biBpcyBhIHJldHJ5LCBvciB0aGUgbGFzdCBSdW4gb2YgYSBDcm9uIFdvcmtmbG93IGZhaWxlZClcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RGYWlsdXJlPzogVGVtcG9yYWxGYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgV29ya2Zsb3cgaGlzdG9yeSB1cCB1bnRpbCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiBXb3JrZmxvdyBoaXN0b3J5IGluIGJ5dGVzIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgemVybyBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKlxuICAgKiBZb3UgbWF5IHNhZmVseSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hlbiB0byB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgV29ya2Zsb3dUYXNrU3RhcnRlZCBldmVudCByZWNvbW1lbmRpbmcgd2hldGhlciB0b1xuICAgKiB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgYGZhbHNlYCBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVBc05ld1N1Z2dlc3RlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSB0aGlzIFdvcmtmbG93IGlzIGV4ZWN1dGluZyBvblxuICAgKi9cbiAgcmVhZG9ubHkgdGFza1F1ZXVlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzcGFjZSB0aGlzIFdvcmtmbG93IGlzIGV4ZWN1dGluZyBpblxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1biBJZCBvZiB0aGUgZmlyc3QgUnVuIGluIHRoaXMgRXhlY3V0aW9uIENoYWluXG4gICAqL1xuICByZWFkb25seSBmaXJzdEV4ZWN1dGlvblJ1bklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IFJ1biBJZCBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVkRnJvbUV4ZWN1dGlvblJ1bklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoaXMgW1dvcmtmbG93IEV4ZWN1dGlvbiBDaGFpbl0oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtmbG93cyN3b3JrZmxvdy1leGVjdXRpb24tY2hhaW4pIHdhcyBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBzdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhlIGN1cnJlbnQgV29ya2Zsb3cgUnVuIHN0YXJ0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1blN0YXJ0VGltZTogRGF0ZTtcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIFNlcnZlci4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25UaW1lb3V0TXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiBleHBpcmVzXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25FeHBpcmF0aW9uVGltZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgUnVuIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgV29ya2Zsb3cgVGFzayBpbiBtaWxsaXNlY29uZHMuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd1Rhc2tUaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tUaW1lb3V0TXM6IG51bWJlcjtcblxuICAvKipcbiAgICogUmV0cnkgUG9saWN5IGZvciB0aGlzIEV4ZWN1dGlvbi4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLnJldHJ5fS5cbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5UG9saWN5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhdCAxIGFuZCBpbmNyZW1lbnRzIGZvciBldmVyeSByZXRyeSBpZiB0aGVyZSBpcyBhIGByZXRyeVBvbGljeWBcbiAgICovXG4gIHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JvbiBTY2hlZHVsZSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5jcm9uU2NoZWR1bGV9LlxuICAgKi9cbiAgcmVhZG9ubHkgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYmV0d2VlbiBDcm9uIFJ1bnNcbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZVRvU2NoZWR1bGVJbnRlcnZhbD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEJ1aWxkIElEIG9mIHRoZSB3b3JrZXIgd2hpY2ggZXhlY3V0ZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay4gTWF5IGJlIHVuZGVmaW5lZCBpZiB0aGVcbiAgICogdGFzayB3YXMgY29tcGxldGVkIGJ5IGEgd29ya2VyIHdpdGhvdXQgYSBCdWlsZCBJRC4gSWYgdGhpcyB3b3JrZXIgaXMgdGhlIG9uZSBleGVjdXRpbmcgdGhpc1xuICAgKiB0YXNrIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgaGFzIGEgQnVpbGQgSUQgc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZVxuICAgKiBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRCdWlsZElkPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHVuc2FmZTogVW5zYWZlV29ya2Zsb3dJbmZvO1xufVxuXG4vKipcbiAqIFVuc2FmZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24uXG4gKlxuICogTmV2ZXIgcmVseSBvbiB0aGlzIGluZm9ybWF0aW9uIGluIFdvcmtmbG93IGxvZ2ljIGFzIGl0IHdpbGwgY2F1c2Ugbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zYWZlV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIFRoZSBzYWZlIHZlcnNpb24gb2YgdGltZSBpcyBgbmV3IERhdGUoKWAgYW5kIGBEYXRlLm5vdygpYCwgd2hpY2ggYXJlIHNldCBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBhIFdvcmtmbG93XG4gICAqIFRhc2sgYW5kIHN0YXkgY29uc3RhbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgVGFzayBhbmQgZHVyaW5nIHJlcGxheS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGlzUmVwbGF5aW5nOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgd29ya2Zsb3cgdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUluZm8ge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFdvcmtmbG93SW5mbyB7XG4gIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90IGFuIGFjdHVhbCBlcnJvciwgdXNlZCBieSB0aGUgV29ya2Zsb3cgcnVudGltZSB0byBhYm9ydCBleGVjdXRpb24gd2hlbiB7QGxpbmsgY29udGludWVBc05ld30gaXMgY2FsbGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29udGludWVBc05ldycpXG5leHBvcnQgY2xhc3MgQ29udGludWVBc05ldyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSUNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbikge1xuICAgIHN1cGVyKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb250aW51aW5nIGEgV29ya2Zsb3cgYXMgbmV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld09wdGlvbnMge1xuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXb3JrZmxvdyB0eXBlIG5hbWUsIGUuZy4gdGhlIGZpbGVuYW1lIGluIHRoZSBOb2RlLmpzIFNESyBvciBjbGFzcyBuYW1lIGluIEphdmFcbiAgICovXG4gIHdvcmtmbG93VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gY29udGludWUgdGhlIFdvcmtmbG93IGluXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciB0aGUgZW50aXJlIFdvcmtmbG93IHJ1blxuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGEgc2luZ2xlIFdvcmtmbG93IHRhc2tcbiAgICogQGZvcm1hdCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogTm9uLXNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIHNlYXJjaEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVzO1xuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBXb3JrZmxvdyBzaG91bGRcbiAgICogQ29udGludWUtYXMtTmV3IG9udG8gYSB3b3JrZXIgd2l0aCBhIGNvbXBhdGlibGUgQnVpbGQgSWQgb3Igbm90LiBTZWUge0BsaW5rIFZlcnNpb25pbmdJbnRlbnR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCAnQ09NUEFUSUJMRSdcbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBhcmUgc2VudCB0byB0aGUgQ2hpbGRcbiAqIC0gd2hldGhlciBhbmQgd2hlbiBhIHtAbGluayBDYW5jZWxlZEZhaWx1cmV9IGlzIHRocm93biBmcm9tIHtAbGluayBleGVjdXRlQ2hpbGR9IG9yXG4gKiAgIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH1cbiAqXG4gKiBAZGVmYXVsdCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEfVxuICovXG5leHBvcnQgdHlwZSBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSA9XG4gICh0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZV07XG5leHBvcnQgY29uc3QgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEb24ndCBzZW5kIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgdG8gdGhlIENoaWxkLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBTZW5kIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgdG8gdGhlIENoaWxkLiBJbW1lZGlhdGVseSB0aHJvdyB0aGUgZXJyb3IuXG4gICAqL1xuICBUUllfQ0FOQ0VMOiAnVFJZX0NBTkNFTCcsXG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCB0byB0aGUgQ2hpbGQuIFRoZSBDaGlsZCBtYXkgcmVzcGVjdCBjYW5jZWxsYXRpb24sIGluIHdoaWNoIGNhc2UgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd25cbiAgICogd2hlbiBjYW5jZWxsYXRpb24gaGFzIGNvbXBsZXRlZCwgYW5kIHtAbGluayBpc0NhbmNlbGxhdGlvbn0oZXJyb3IpIHdpbGwgYmUgdHJ1ZS4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBDaGlsZCBtYXlcbiAgICogaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgaW4gd2hpY2ggY2FzZSBhbiBlcnJvciBtaWdodCBiZSB0aHJvd24gd2l0aCBhIGRpZmZlcmVudCBjYXVzZSwgb3IgdGhlIENoaWxkIG1heVxuICAgKiBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuXG4gIC8qKlxuICAgKiBTZW5kIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgdG8gdGhlIENoaWxkLiBUaHJvdyB0aGUgZXJyb3Igb25jZSB0aGUgU2VydmVyIHJlY2VpdmVzIHRoZSBDaGlsZCBjYW5jZWxsYXRpb24gcmVxdWVzdC5cbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRCcsXG59IGFzIGNvbnN0O1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICAnJ1xuPihcbiAge1xuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMCxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuVFJZX0NBTkNFTF06IDEsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDIsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRF06IDMsXG4gIH0gYXMgY29uc3QsXG4gICcnXG4pO1xuXG4vKipcbiAqIEhvdyBhIENoaWxkIFdvcmtmbG93IHJlYWN0cyB0byB0aGUgUGFyZW50IFdvcmtmbG93IHJlYWNoaW5nIGEgQ2xvc2VkIHN0YXRlLlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWEtcGFyZW50LWNsb3NlLXBvbGljeS8gfCBQYXJlbnQgQ2xvc2UgUG9saWN5fVxuICovXG5leHBvcnQgdHlwZSBQYXJlbnRDbG9zZVBvbGljeSA9ICh0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3kpW2tleW9mIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeV07XG5leHBvcnQgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFRFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqL1xuICBSRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcblxuICAvLy8gQW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGhhcyBiZWVuIGRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSWYgYSBgUGFyZW50Q2xvc2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIHNlcnZlciBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRWl0aGVyIGxlYXZlIHByb3BlcnR5IGB1bmRlZmluZWRgLCBvciBzZXQgYW4gZXhwbGljaXQgcG9saWN5IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIFRlcm1pbmF0ZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU6ICdURVJNSU5BVEUnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTn0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTjogJ0FCQU5ET04nLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBDYW5jZWxsZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG59IGFzIGNvbnN0O1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSwgZGVjb2RlUGFyZW50Q2xvc2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsXG4gICAgW1BhcmVudENsb3NlUG9saWN5LkFCQU5ET05dOiAyLFxuICAgIFtQYXJlbnRDbG9zZVBvbGljeS5SRVFVRVNUX0NBTkNFTF06IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdQQVJFTlRfQ0xPU0VfUE9MSUNZXydcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRXb3JrZmxvd09wdGlvbnMgZXh0ZW5kcyBDb21tb25Xb3JrZmxvd09wdGlvbnMge1xuICAvKipcbiAgICogV29ya2Zsb3cgaWQgdG8gdXNlIHdoZW4gc3RhcnRpbmcuIElmIG5vdCBzcGVjaWZpZWQgYSBVVUlEIGlzIGdlbmVyYXRlZC4gTm90ZSB0aGF0IGl0IGlzXG4gICAqIGRhbmdlcm91cyBhcyBpbiBjYXNlIG9mIGNsaWVudCBzaWRlIHJldHJpZXMgbm8gZGVkdXBsaWNhdGlvbiB3aWxsIGhhcHBlbiBiYXNlZCBvbiB0aGVcbiAgICogZ2VuZXJhdGVkIGlkLiBTbyBwcmVmZXIgYXNzaWduaW5nIGJ1c2luZXNzIG1lYW5pbmdmdWwgaWRzIGlmIHBvc3NpYmxlLlxuICAgKi9cbiAgd29ya2Zsb3dJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSB0byB1c2UgZm9yIFdvcmtmbG93IHRhc2tzLiBJdCBzaG91bGQgbWF0Y2ggYSB0YXNrIHF1ZXVlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGFcbiAgICogYFdvcmtlcmAgdGhhdCBob3N0cyB0aGUgV29ya2Zsb3cgY29kZS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYSBjaGlsZCBpcyBzY2hlZHVsZWQgb24gdGhlIHNhbWUgVGFzayBRdWV1ZSBhcyB0aGUgcGFyZW50LlxuICAgKi9cbiAgdGFza1F1ZXVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgYXJlIHNlbnQgdG8gdGhlIENoaWxkXG4gICAqIC0gd2hldGhlciBhbmQgd2hlbiBhbiBlcnJvciBpcyB0aHJvd24gZnJvbSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSBvclxuICAgKiAgIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH1cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRH1cbiAgICovXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyB0aGUgQ2hpbGQgcmVhY3RzIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3cgcmVhY2hpbmcgYSBDbG9zZWQgc3RhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5QQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURX1cbiAgICovXG4gIHBhcmVudENsb3NlUG9saWN5PzogUGFyZW50Q2xvc2VQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQ2hpbGQgV29ya2Zsb3cgc2hvdWxkIHJ1biBvblxuICAgKiBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2ZXJzaW9uaW5nSW50ZW50PzogVmVyc2lvbmluZ0ludGVudDtcbn1cblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRDaGlsZFdvcmtmbG93T3B0aW9ucyA9IFJlcXVpcmVkPFBpY2s8Q2hpbGRXb3JrZmxvd09wdGlvbnMsICd3b3JrZmxvd0lkJyB8ICdjYW5jZWxsYXRpb25UeXBlJz4+ICYge1xuICBhcmdzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyA9IENoaWxkV29ya2Zsb3dPcHRpb25zICYgUmVxdWlyZWRDaGlsZFdvcmtmbG93T3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlU0RLSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzbGljZSBvZiBhIGZpbGUgc3RhcnRpbmcgYXQgbGluZU9mZnNldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlU2xpY2Uge1xuICAvKipcbiAgICogT25seSB1c2VkIHBvc3NpYmxlIHRvIHRyaW0gdGhlIGZpbGUgd2l0aG91dCBicmVha2luZyBzeW50YXggaGlnaGxpZ2h0aW5nLlxuICAgKi9cbiAgbGluZV9vZmZzZXQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIHNsaWNlIG9mIGEgZmlsZSB3aXRoIGBcXG5gIChuZXdsaW5lKSBsaW5lIHRlcm1pbmF0b3IuXG4gICAqL1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gYSBmaWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZUZpbGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHNvdXJjZSBmaWxlIChhYnNvbHV0ZSBvciByZWxhdGl2ZSkuXG4gICAqIFdoZW4gdXNpbmcgYSByZWxhdGl2ZSBwYXRoLCBtYWtlIHN1cmUgYWxsIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgc2FtZSByb290LlxuICAgKi9cbiAgZmlsZV9wYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLCByZXF1aXJlZCBmb3IgZGlzcGxheWluZyB0aGUgY29kZSBsb2NhdGlvbi5cbiAgICovXG4gIGxpbmU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBwb3NzaWJsZSwgU0RLIHNob3VsZCBzZW5kIHRoaXMuXG4gICAqL1xuICBjb2x1bW4/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiBuYW1lIHRoaXMgbGluZSBiZWxvbmdzIHRvIChpZiBhcHBsaWNhYmxlKS5cbiAgICogVXNlZCBmb3IgZmFsbGluZyBiYWNrIHRvIHN0YWNrIHRyYWNlIHZpZXcuXG4gICAqL1xuICBmdW5jdGlvbl9uYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogRmxhZyB0byBtYXJrIHRoaXMgYXMgaW50ZXJuYWwgU0RLIGNvZGUgYW5kIGhpZGUgYnkgZGVmYXVsdCBpbiB0aGUgVUkuXG4gICAqL1xuICBpbnRlcm5hbF9jb2RlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2Uge1xuICBsb2NhdGlvbnM6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBVc2VkIGFzIHRoZSByZXN1bHQgZm9yIHRoZSBlbmhhbmNlZCBzdGFjayB0cmFjZSBxdWVyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VkU3RhY2tUcmFjZSB7XG4gIHNkazogU3RhY2tUcmFjZVNES0luZm87XG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGZpbGUgcGF0aCB0byBmaWxlIGNvbnRlbnRzLlxuICAgKiBTREsgbWF5IGNob29zZSB0byBzZW5kIG5vLCBzb21lIG9yIGFsbCBzb3VyY2VzLlxuICAgKiBTb3VyY2VzIG1pZ2h0IGJlIHRyaW1tZWQsIGFuZCBzb21lIHRpbWUgb25seSB0aGUgZmlsZShzKSBvZiB0aGUgdG9wIGVsZW1lbnQgb2YgdGhlIHRyYWNlIHdpbGwgYmUgc2VudC5cbiAgICovXG4gIHNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFN0YWNrVHJhY2VGaWxlU2xpY2VbXT47XG4gIHN0YWNrczogU3RhY2tUcmFjZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9ucyB7XG4gIGluZm86IFdvcmtmbG93SW5mbztcbiAgcmFuZG9tbmVzc1NlZWQ6IG51bWJlcltdO1xuICBub3c6IG51bWJlcjtcbiAgc2hvd1N0YWNrVHJhY2VTb3VyY2VzOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIGV4dGVuZHMgV29ya2Zsb3dDcmVhdGVPcHRpb25zIHtcbiAgc291cmNlTWFwOiBSYXdTb3VyY2VNYXA7XG4gIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcbiAgZ2V0VGltZU9mRGF5KCk6IGJpZ2ludDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgdGhlIGFyZ3VtZW50cyBmb3IgYSBnaXZlbiBVcGRhdGVEZWZpbml0aW9uLCBTaWduYWxEZWZpbml0aW9uIG9yIFF1ZXJ5RGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgSGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+ID0gVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgPyAoLi4uYXJnczogQSkgPT4gUiB8IFByb21pc2U8Uj5cbiAgOiBUIGV4dGVuZHMgU2lnbmFsRGVmaW5pdGlvbjxpbmZlciBBPlxuICAgID8gKC4uLmFyZ3M6IEEpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+XG4gICAgOiBUIGV4dGVuZHMgUXVlcnlEZWZpbml0aW9uPGluZmVyIFIsIGluZmVyIEE+XG4gICAgICA/ICguLi5hcmdzOiBBKSA9PiBSXG4gICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgc2lnbmFsIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRTaWduYWxIYW5kbGVyID0gKHNpZ25hbE5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBBIHZhbGlkYXRpb24gZnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgdGhlIGFyZ3VtZW50cyBmb3IgYSBnaXZlbiBVcGRhdGVEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBVcGRhdGVWYWxpZGF0b3I8QXJncyBleHRlbmRzIGFueVtdPiA9ICguLi5hcmdzOiBBcmdzKSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBxdWVyeSBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBRdWVyeUhhbmRsZXJPcHRpb25zID0geyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaWduYWwgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgU2lnbmFsSGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyB1bmZpbmlzaGVkUG9saWN5PzogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgfTtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBhbmQgZGVzY3JpcHRpb24gb2YgYW4gdXBkYXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSB7XG4gIHZhbGlkYXRvcj86IFVwZGF0ZVZhbGlkYXRvcjxBcmdzPjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW107XG4gIHVzZWRJbnRlcm5hbEZsYWdzOiBudW1iZXJbXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUmF3U291cmNlTWFwIH0gZnJvbSAnc291cmNlLW1hcCc7XG5pbXBvcnQge1xuICBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgRmFpbHVyZUNvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgYXJyYXlGcm9tUGF5bG9hZHMsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBlbnN1cmVUZW1wb3JhbEZhaWx1cmUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBJbGxlZ2FsU3RhdGVFcnJvcixcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBXb3JrZmxvdyxcbiAgV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yLFxuICBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGUsXG4gIFByb3RvRmFpbHVyZSxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBXb3JrZmxvd1VwZGF0ZVR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSxcbiAgbWFwRnJvbVBheWxvYWRzLFxuICBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxuICBmcm9tUGF5bG9hZHNBdEluZGV4LFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgdHlwZSB7IGNvcmVzZGssIHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgYWxlYSwgUk5HIH0gZnJvbSAnLi9hbGVhJztcbmltcG9ydCB7IFJvb3RDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciwgTG9jYWxBY3Rpdml0eURvQmFja29mZiwgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBRdWVyeUlucHV0LCBTaWduYWxJbnB1dCwgVXBkYXRlSW5wdXQsIFdvcmtmbG93RXhlY3V0ZUlucHV0LCBXb3JrZmxvd0ludGVyY2VwdG9ycyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7XG4gIENvbnRpbnVlQXNOZXcsXG4gIERlZmF1bHRTaWduYWxIYW5kbGVyLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZUZpbGVTbGljZSxcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBTdGFja1RyYWNlRmlsZUxvY2F0aW9uLFxuICBXb3JrZmxvd0luZm8sXG4gIFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsLFxuICBBY3RpdmF0aW9uQ29tcGxldGlvbixcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHR5cGUgU2lua0NhbGwgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCBwa2cgZnJvbSAnLi9wa2cnO1xuaW1wb3J0IHsgU2RrRmxhZywgYXNzZXJ0VmFsaWRGbGFnIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcsIGxvZyB9IGZyb20gJy4vbG9ncyc7XG5cbmNvbnN0IFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlID0ge1xuICBXT1JLRkxPV19BTFJFQURZX0VYSVNUUzogJ1dPUktGTE9XX0FMUkVBRFlfRVhJU1RTJyxcbn0gYXMgY29uc3Q7XG50eXBlIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlID1cbiAgKHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSlba2V5b2YgdHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlXTtcblxuY29uc3QgW19lbmNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSwgZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdID1cbiAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gICAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICA+KFxuICAgIHtcbiAgICAgIFtTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZS5XT1JLRkxPV19BTFJFQURZX0VYSVNUU106IDEsXG4gICAgICBVTlNQRUNJRklFRDogMCxcbiAgICB9IGFzIGNvbnN0LFxuICAgICdTVEFSVF9DSElMRF9XT1JLRkxPV19FWEVDVVRJT05fRkFJTEVEX0NBVVNFXydcbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFjayB7XG4gIGZvcm1hdHRlZDogc3RyaW5nO1xuICBzdHJ1Y3R1cmVkOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogR2xvYmFsIHN0b3JlIHRvIHRyYWNrIHByb21pc2Ugc3RhY2tzIGZvciBzdGFjayB0cmFjZSBxdWVyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb21pc2VTdGFja1N0b3JlIHtcbiAgY2hpbGRUb1BhcmVudDogTWFwPFByb21pc2U8dW5rbm93bj4sIFNldDxQcm9taXNlPHVua25vd24+Pj47XG4gIHByb21pc2VUb1N0YWNrOiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU3RhY2s+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb24ge1xuICByZXNvbHZlKHZhbDogdW5rbm93bik6IHVua25vd247XG5cbiAgcmVqZWN0KHJlYXNvbjogdW5rbm93bik6IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uIHtcbiAgZm4oKTogYm9vbGVhbjtcblxuICByZXNvbHZlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIEFjdGl2YXRpb25IYW5kbGVyRnVuY3Rpb248SyBleHRlbmRzIGtleW9mIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iPiA9IChcbiAgYWN0aXZhdGlvbjogTm9uTnVsbGFibGU8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2JbS10+XG4pID0+IHZvaWQ7XG5cbi8qKlxuICogVmVyaWZpZXMgYWxsIGFjdGl2YXRpb24gam9iIGhhbmRsaW5nIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2YXRpb25IYW5kbGVyID0ge1xuICBbUCBpbiBrZXlvZiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYl06IEFjdGl2YXRpb25IYW5kbGVyRnVuY3Rpb248UD47XG59O1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGFuIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb24uXG4gKi9cbmludGVyZmFjZSBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG4gIGlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEtlZXBzIGFsbCBvZiB0aGUgV29ya2Zsb3cgcnVudGltZSBzdGF0ZSBsaWtlIHBlbmRpbmcgY29tcGxldGlvbnMgZm9yIGFjdGl2aXRpZXMgYW5kIHRpbWVycy5cbiAqXG4gKiBJbXBsZW1lbnRzIGhhbmRsZXJzIGZvciBhbGwgd29ya2Zsb3cgYWN0aXZhdGlvbiBqb2JzLlxuICpcbiAqIE5vdGUgdGhhdCBtb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gdGhlIFZNLlxuICpcbiAqIEhvd2V2ZXIsIGEgZmV3IG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgdGhlIFZNIChlc3NlbnRpYWxseSBmcm9tIGB2bS1zaGFyZWQudHNgKS5cbiAqIFRoZXNlIG1ldGhvZHMgYXJlIHNwZWNpZmljYWxseSBtYXJrZWQgd2l0aCBhIGNvbW1lbnQgYW5kIHJlcXVpcmUgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLCBhcyB0aGVcbiAqIGV4ZWN1dGlvbiBjb250ZXh0IG1heSBub3QgcHJvcGVybHkgcmVmbGVjdCB0aGF0IG9mIHRoZSB0YXJnZXQgd29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuOiB3aXRoIFJldXNhYmxlXG4gKiBWTXMsIHRoZSBgZ2xvYmFsYCBtYXkgbm90IGhhdmUgYmVlbiBzd2FwcGVkIHRvIHRob3NlIG9mIHRoYXQgd29ya2Zsb3cgZXhlY3V0aW9uOyB0aGUgYWN0aXZlIG1pY3JvdGFza1xuICogcXVldWUgbWF5IGJlIHRoYXQgb2YgdGhlIHRocmVhZC9wcm9jZXNzLCByYXRoZXIgdGhhbiB0aGUgcXVldWUgb2YgdGhhdCBWTSBjb250ZXh0OyBldGMpLiBDb25zZXF1ZW50bHksXG4gKiBtZXRob2RzIHRoYXQgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFZNIG11c3Qgbm90IGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqIC0gQWNjZXNzIGFueSBnbG9iYWwgdmFyaWFibGU7XG4gKiAtIENyZWF0ZSBQcm9taXNlIG9iamVjdHMsIHVzZSBhc3luYy9hd2FpdCwgb3Igb3RoZXJ3aXNlIHNjaGVkdWxlIG1pY3JvdGFza3M7XG4gKiAtIENhbGwgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucywgaW5jbHVkaW5nIGFueSBmb3JtIG9mIGludGVyY2VwdG9yLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQWN0aXZhdGlvbkhhbmRsZXIge1xuICAvKipcbiAgICogQ2FjaGUgZm9yIG1vZHVsZXMgLSByZWZlcmVuY2VkIGluIHJldXNhYmxlLXZtLnRzXG4gICAqL1xuICByZWFkb25seSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAvKipcbiAgICogTWFwIG9mIHRhc2sgc2VxdWVuY2UgdG8gYSBDb21wbGV0aW9uXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IHtcbiAgICB0aW1lcjogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb24+KCksXG4gICAgYWN0aXZpdHk6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPigpLFxuICAgIGNoaWxkV29ya2Zsb3dTdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb24+KCksXG4gICAgY2hpbGRXb3JrZmxvd0NvbXBsZXRlOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbj4oKSxcbiAgICBzaWduYWxXb3JrZmxvdzogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb24+KCksXG4gICAgY2FuY2VsV29ya2Zsb3c6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPigpLFxuICB9O1xuXG4gIC8qKlxuICAgKiBIb2xkcyBidWZmZXJlZCBVcGRhdGUgY2FsbHMgdW50aWwgYSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJ1ZmZlcmVkVXBkYXRlcyA9IEFycmF5PGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JRG9VcGRhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEhvbGRzIGJ1ZmZlcmVkIHNpZ25hbCBjYWxscyB1bnRpbCBhIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyZWRTaWduYWxzID0gQXJyYXk8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklTaWduYWxXb3JrZmxvdz4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiB1cGRhdGUgbmFtZSB0byBoYW5kbGVyIGFuZCB2YWxpZGF0b3JcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZT4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBzaWduYWwgbmFtZSB0byBoYW5kbGVyXG4gICAqL1xuICByZWFkb25seSBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGU+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgaW4tcHJvZ3Jlc3MgdXBkYXRlcyB0byBoYW5kbGVyIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluUHJvZ3Jlc3NVcGRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIGluLXByb2dyZXNzIHNpZ25hbHMgdG8gaGFuZGxlciBleGVjdXRpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICByZWFkb25seSBpblByb2dyZXNzU2lnbmFscyA9IG5ldyBNYXA8bnVtYmVyLCBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbj4oKTtcblxuICAvKipcbiAgICogQSBzZXF1ZW5jZSBudW1iZXIgcHJvdmlkaW5nIHVuaXF1ZSBpZGVudGlmaWVycyBmb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBzaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxID0gMDtcblxuICAvKipcbiAgICogQSBzaWduYWwgaGFuZGxlciB0aGF0IGNhdGNoZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAgICovXG4gIGRlZmF1bHRTaWduYWxIYW5kbGVyPzogRGVmYXVsdFNpZ25hbEhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFNvdXJjZSBtYXAgZmlsZSBmb3IgbG9va2luZyB1cCB0aGUgc291cmNlIGZpbGVzIGluIHJlc3BvbnNlIHRvIF9fZW5oYW5jZWRfc3RhY2tfdHJhY2VcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3VyY2VNYXA6IFJhd1NvdXJjZU1hcDtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2VuZCB0aGUgc291cmNlcyBpbiBlbmhhbmNlZCBzdGFjayB0cmFjZSBxdWVyeSByZXNwb25zZXNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG5cbiAgcmVhZG9ubHkgcHJvbWlzZVN0YWNrU3RvcmU6IFByb21pc2VTdGFja1N0b3JlID0ge1xuICAgIHByb21pc2VUb1N0YWNrOiBuZXcgTWFwKCksXG4gICAgY2hpbGRUb1BhcmVudDogbmV3IE1hcCgpLFxuICB9O1xuXG4gIHB1YmxpYyByZWFkb25seSByb290U2NvcGUgPSBuZXcgUm9vdENhbmNlbGxhdGlvblNjb3BlKCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgcXVlcnkgbmFtZSB0byBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVlcnlIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZT4oW1xuICAgIFtcbiAgICAgICdfX3N0YWNrX3RyYWNlJyxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0YWNrVHJhY2VzKClcbiAgICAgICAgICAgIC5tYXAoKHMpID0+IHMuZm9ybWF0dGVkKVxuICAgICAgICAgICAgLmpvaW4oJ1xcblxcbicpO1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgYSBzZW5zaWJsZSBzdGFjayB0cmFjZS4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgICdfX2VuaGFuY2VkX3N0YWNrX3RyYWNlJyxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IEVuaGFuY2VkU3RhY2tUcmFjZSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzb3VyY2VNYXAgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgc2RrOiBTdGFja1RyYWNlU0RLSW5mbyA9IHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2ZXJzaW9uOiBwa2cudmVyc2lvbiB9O1xuICAgICAgICAgIGNvbnN0IHN0YWNrcyA9IHRoaXMuZ2V0U3RhY2tUcmFjZXMoKS5tYXAoKHsgc3RydWN0dXJlZDogbG9jYXRpb25zIH0pID0+ICh7IGxvY2F0aW9ucyB9KSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgU3RhY2tUcmFjZUZpbGVTbGljZVtdPiA9IHt9O1xuICAgICAgICAgIGlmICh0aGlzLnNob3dTdGFja1RyYWNlU291cmNlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IGxvY2F0aW9ucyB9IG9mIHN0YWNrcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZV9wYXRoIH0gb2YgbG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlX3BhdGgpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzb3VyY2VNYXA/LnNvdXJjZXNDb250ZW50Py5bc291cmNlTWFwPy5zb3VyY2VzLmluZGV4T2YoZmlsZV9wYXRoKV07XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2VzW2ZpbGVfcGF0aF0gPSBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IHNkaywgc3RhY2tzLCBzb3VyY2VzIH07XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHN0YWNrIHRyYWNlIGFubm90YXRlZCB3aXRoIHNvdXJjZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgICdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGEgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtmbG93VHlwZSA9IHRoaXMuaW5mby53b3JrZmxvd1R5cGU7XG4gICAgICAgICAgY29uc3QgcXVlcnlEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy5xdWVyeUhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgY29uc3Qgc2lnbmFsRGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMuc2lnbmFsSGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy51cGRhdGVIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgICAgICAgIHR5cGU6IHdvcmtmbG93VHlwZSxcbiAgICAgICAgICAgICAgcXVlcnlEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgc2lnbmFsRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICAgIHVwZGF0ZURlZmluaXRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1JldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd29ya2Zsb3cuJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIExvYWRlZCBpbiB7QGxpbmsgaW5pdFJ1bnRpbWV9XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJjZXB0b3JzOiBSZXF1aXJlZDxXb3JrZmxvd0ludGVyY2VwdG9ycz4gPSB7XG4gICAgaW5ib3VuZDogW10sXG4gICAgb3V0Ym91bmQ6IFtdLFxuICAgIGludGVybmFsczogW10sXG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciB0aGF0IHN0b3JlcyBhbGwgZ2VuZXJhdGVkIGNvbW1hbmRzLCByZXNldCBhZnRlciBlYWNoIGFjdGl2YXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW10gPSBbXTtcblxuICAvKipcbiAgICogU3RvcmVzIGFsbCB7QGxpbmsgY29uZGl0aW9ufXMgdGhhdCBoYXZlbid0IGJlZW4gdW5ibG9ja2VkIHlldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrZWRDb25kaXRpb25zID0gbmV3IE1hcDxudW1iZXIsIENvbmRpdGlvbj4oKTtcblxuICAvKipcbiAgICogSXMgdGhpcyBXb3JrZmxvdyBjb21wbGV0ZWQ/XG4gICAqXG4gICAqIEEgV29ya2Zsb3cgd2lsbCBiZSBjb25zaWRlcmVkIGNvbXBsZXRlZCBpZiBpdCBnZW5lcmF0ZXMgYSBjb21tYW5kIHRoYXQgdGhlXG4gICAqIHN5c3RlbSBjb25zaWRlcnMgYXMgYSBmaW5hbCBXb3JrZmxvdyBjb21tYW5kIChlLmcuXG4gICAqIGNvbXBsZXRlV29ya2Zsb3dFeGVjdXRpb24gb3IgZmFpbFdvcmtmbG93RXhlY3V0aW9uKS5cbiAgICovXG4gIHB1YmxpYyBjb21wbGV0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2FzIHRoaXMgV29ya2Zsb3cgY2FuY2VsbGVkP1xuICAgKi9cbiAgcHJvdGVjdGVkIGNhbmNlbGxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV4dCAoaW5jcmVtZW50YWwpIHNlcXVlbmNlIHRvIGFzc2lnbiB3aGVuIGdlbmVyYXRpbmcgY29tcGxldGFibGUgY29tbWFuZHNcbiAgICovXG4gIHB1YmxpYyBuZXh0U2VxcyA9IHtcbiAgICB0aW1lcjogMSxcbiAgICBhY3Rpdml0eTogMSxcbiAgICBjaGlsZFdvcmtmbG93OiAxLFxuICAgIHNpZ25hbFdvcmtmbG93OiAxLFxuICAgIGNhbmNlbFdvcmtmbG93OiAxLFxuICAgIGNvbmRpdGlvbjogMSxcbiAgICAvLyBVc2VkIGludGVybmFsbHkgdG8ga2VlcCB0cmFjayBvZiBhY3RpdmUgc3RhY2sgdHJhY2VzXG4gICAgc3RhY2s6IDEsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2V0IGV2ZXJ5IHRpbWUgdGhlIHdvcmtmbG93IGV4ZWN1dGVzIGFuIGFjdGl2YXRpb25cbiAgICogTWF5IGJlIGFjY2Vzc2VkIGFuZCBtb2RpZmllZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgbm93OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBXb3JrZmxvdywgaW5pdGlhbGl6ZWQgd2hlbiBhIFdvcmtmbG93IGlzIHN0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyB3b3JrZmxvdz86IFdvcmtmbG93O1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvd1xuICAgKiBNYXkgYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBpbmZvOiBXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIEEgZGV0ZXJtaW5pc3RpYyBSTkcsIHVzZWQgYnkgdGhlIGlzb2xhdGUncyBvdmVycmlkZGVuIE1hdGgucmFuZG9tXG4gICAqL1xuICBwdWJsaWMgcmFuZG9tOiBSTkc7XG5cbiAgcHVibGljIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIgPSBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcjtcbiAgcHVibGljIGZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcjtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBrbm93IHRoZSBzdGF0dXMgb2YgZm9yIHRoaXMgd29ya2Zsb3csIGFzIGluIHtAbGluayBwYXRjaGVkfVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93blByZXNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgd2Ugc2VudCB0byBjb3JlIHtAbGluayBwYXRjaGVkfVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZW50UGF0Y2hlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkga25vd25GbGFncyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBCdWZmZXJlZCBzaW5rIGNhbGxzIHBlciBhY3RpdmF0aW9uXG4gICAqL1xuICBzaW5rQ2FsbHMgPSBBcnJheTxTaW5rQ2FsbD4oKTtcblxuICAvKipcbiAgICogQSBuYW5vc2Vjb25kIHJlc29sdXRpb24gdGltZSBmdW5jdGlvbiwgZXh0ZXJuYWxseSBpbmplY3RlZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdldFRpbWVPZkRheTogKCkgPT4gYmlnaW50O1xuXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZm8sXG4gICAgbm93LFxuICAgIHNob3dTdGFja1RyYWNlU291cmNlcyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZ2V0VGltZU9mRGF5LFxuICAgIHJhbmRvbW5lc3NTZWVkLFxuICAgIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLFxuICB9OiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCkge1xuICAgIHRoaXMuZ2V0VGltZU9mRGF5ID0gZ2V0VGltZU9mRGF5O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gICAgdGhpcy5zaG93U3RhY2tUcmFjZVNvdXJjZXMgPSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG4gICAgdGhpcy5zb3VyY2VNYXAgPSBzb3VyY2VNYXA7XG4gICAgdGhpcy5yYW5kb20gPSBhbGVhKHJhbmRvbW5lc3NTZWVkKTtcbiAgICB0aGlzLnJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzID0gcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIG11dGF0ZVdvcmtmbG93SW5mbyhmbjogKGluZm86IFdvcmtmbG93SW5mbykgPT4gV29ya2Zsb3dJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5pbmZvID0gZm4odGhpcy5pbmZvKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTdGFja1RyYWNlcygpOiBTdGFja1tdIHtcbiAgICBjb25zdCB7IGNoaWxkVG9QYXJlbnQsIHByb21pc2VUb1N0YWNrIH0gPSB0aGlzLnByb21pc2VTdGFja1N0b3JlO1xuICAgIGNvbnN0IGludGVybmFsTm9kZXMgPSBbLi4uY2hpbGRUb1BhcmVudC52YWx1ZXMoKV0ucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBjdXJyKSB7XG4gICAgICAgIGFjYy5hZGQocCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIG5ldyBTZXQoKSk7XG4gICAgY29uc3Qgc3RhY2tzID0gbmV3IE1hcDxzdHJpbmcsIFN0YWNrPigpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRUb1BhcmVudC5rZXlzKCkpIHtcbiAgICAgIGlmICghaW50ZXJuYWxOb2Rlcy5oYXMoY2hpbGQpKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gcHJvbWlzZVRvU3RhY2suZ2V0KGNoaWxkKTtcbiAgICAgICAgaWYgKCFzdGFjayB8fCAhc3RhY2suZm9ybWF0dGVkKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2tzLnNldChzdGFjay5mb3JtYXR0ZWQsIHN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gTm90IDEwMCUgc3VyZSB3aGVyZSB0aGlzIGNvbWVzIGZyb20sIGp1c3QgZmlsdGVyIGl0IG91dFxuICAgIHN0YWNrcy5kZWxldGUoJyAgICBhdCBQcm9taXNlLnRoZW4gKDxhbm9ueW1vdXM+KScpO1xuICAgIHN0YWNrcy5kZWxldGUoJyAgICBhdCBQcm9taXNlLnRoZW4gKDxhbm9ueW1vdXM+KVxcbicpO1xuICAgIHJldHVybiBbLi4uc3RhY2tzXS5tYXAoKFtfLCBzdGFja10pID0+IHN0YWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgZ2V0QW5kUmVzZXRTaW5rQ2FsbHMoKTogU2lua0NhbGxbXSB7XG4gICAgY29uc3QgeyBzaW5rQ2FsbHMgfSA9IHRoaXM7XG4gICAgdGhpcy5zaW5rQ2FsbHMgPSBbXTtcbiAgICByZXR1cm4gc2lua0NhbGxzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciBhIFdvcmtmbG93IGNvbW1hbmQgdG8gYmUgY29sbGVjdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYWN0aXZhdGlvbi5cbiAgICpcbiAgICogUHJldmVudHMgY29tbWFuZHMgZnJvbSBiZWluZyBhZGRlZCBhZnRlciBXb3JrZmxvdyBjb21wbGV0aW9uLlxuICAgKi9cbiAgcHVzaENvbW1hbmQoY21kOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmQsIGNvbXBsZXRlID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRzLnB1c2goY21kKTtcbiAgICBpZiAoY29tcGxldGUpIHtcbiAgICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBjb25jbHVkZUFjdGl2YXRpb24oKTogQWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBjb21tYW5kczogdGhpcy5jb21tYW5kcy5zcGxpY2UoMCksXG4gICAgICB1c2VkSW50ZXJuYWxGbGFnczogWy4uLnRoaXMua25vd25GbGFnc10sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFdvcmtmbG93TmV4dEhhbmRsZXIoeyBhcmdzIH06IFdvcmtmbG93RXhlY3V0ZUlucHV0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHdvcmtmbG93IH0gPSB0aGlzO1xuICAgIGlmICh3b3JrZmxvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93KC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyh0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLCAnZXhlY3V0ZScsIHRoaXMuc3RhcnRXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuXG4gICAgdW50cmFja1Byb21pc2UoXG4gICAgICBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoKCkgPT5cbiAgICAgICAgZXhlY3V0ZSh7XG4gICAgICAgICAgaGVhZGVyczogYWN0aXZhdGlvbi5oZWFkZXJzID8/IHt9LFxuICAgICAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMpLFxuICAgICAgICB9KVxuICAgICAgKS50aGVuKHRoaXMuY29tcGxldGVXb3JrZmxvdy5iaW5kKHRoaXMpLCB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZS5iaW5kKHRoaXMpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JSW5pdGlhbGl6ZVdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250aW51ZWRGYWlsdXJlLCBsYXN0Q29tcGxldGlvblJlc3VsdCwgbWVtbywgc2VhcmNoQXR0cmlidXRlcyB9ID0gYWN0aXZhdGlvbjtcblxuICAgIC8vIE1vc3QgdGhpbmdzIHJlbGF0ZWQgdG8gaW5pdGlhbGl6YXRpb24gaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICB0aGlzLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbykgPT4gKHtcbiAgICAgIC4uLmluZm8sXG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAobWFwRnJvbVBheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXM/LmluZGV4ZWRGaWVsZHMpIGFzIFNlYXJjaEF0dHJpYnV0ZXMpID8/IHt9LFxuICAgICAgbWVtbzogbWFwRnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgbWVtbz8uZmllbGRzKSxcbiAgICAgIGxhc3RSZXN1bHQ6IGZyb21QYXlsb2Fkc0F0SW5kZXgodGhpcy5wYXlsb2FkQ29udmVydGVyLCAwLCBsYXN0Q29tcGxldGlvblJlc3VsdD8ucGF5bG9hZHMpLFxuICAgICAgbGFzdEZhaWx1cmU6XG4gICAgICAgIGNvbnRpbnVlZEZhaWx1cmUgIT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGNvbnRpbnVlZEZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlcilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsV29ya2Zsb3coX2FjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JQ2FuY2VsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgdGhpcy5yb290U2NvcGUuY2FuY2VsKCk7XG4gIH1cblxuICBwdWJsaWMgZmlyZVRpbWVyKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JRmlyZVRpbWVyKTogdm9pZCB7XG4gICAgLy8gVGltZXJzIGFyZSBhIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGVpciBjb21wbGV0aW9uIG1pZ2h0IG5vdCBiZSBpbiBXb3JrZmxvdyBzdGF0ZSxcbiAgICAvLyB0aGlzIGlzIGR1ZSB0byBpbW1lZGlhdGUgdGltZXIgY2FuY2VsbGF0aW9uIHRoYXQgZG9lc24ndCBnbyB3YWl0IGZvciBDb3JlLlxuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ3RpbWVyJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBjb21wbGV0aW9uPy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZUFjdGl2aXR5KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUFjdGl2aXR5KTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVBY3Rpdml0eSBhY3RpdmF0aW9uIHdpdGggbm8gcmVzdWx0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdhY3Rpdml0eScsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVkID0gYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxldGVkLnJlc3VsdCA/IHRoaXMucGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZChjb21wbGV0ZWQucmVzdWx0KSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQ7XG4gICAgICBjb25zdCBlcnIgPSBmYWlsdXJlID8gdGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGNvbnN0IGVyciA9IGZhaWx1cmUgPyB0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUpIDogdW5kZWZpbmVkO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSB7XG4gICAgICByZWplY3QobmV3IExvY2FsQWN0aXZpdHlEb0JhY2tvZmYoYWN0aXZhdGlvbi5yZXN1bHQuYmFja29mZikpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd1N0YXJ0JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5zdWNjZWVkZWQpIHtcbiAgICAgIHJlc29sdmUoYWN0aXZhdGlvbi5zdWNjZWVkZWQucnVuSWQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5mYWlsZWQpIHtcbiAgICAgIGlmIChkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZShhY3RpdmF0aW9uLmZhaWxlZC5jYXVzZSkgIT09ICdXT1JLRkxPV19BTFJFQURZX0VYSVNUUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdHb3QgdW5rbm93biBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZScpO1xuICAgICAgfVxuICAgICAgaWYgKCEoYWN0aXZhdGlvbi5zZXEgJiYgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dJZCAmJiBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd1R5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYXR0cmlidXRlcyBpbiBhY3RpdmF0aW9uIGpvYicpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KFxuICAgICAgICBuZXcgV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yKFxuICAgICAgICAgICdXb3JrZmxvdyBleGVjdXRpb24gYWxyZWFkeSBzdGFydGVkJyxcbiAgICAgICAgICBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd0lkLFxuICAgICAgICAgIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93VHlwZVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5jYW5jZWxsZWQpIHtcbiAgICAgIGlmICghYWN0aXZhdGlvbi5jYW5jZWxsZWQuZmFpbHVyZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3Qgbm8gZmFpbHVyZSBpbiBjYW5jZWxsZWQgdmFyaWFudCcpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5jYW5jZWxsZWQuZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydCB3aXRoIG5vIHN0YXR1cycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvbihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uIGFjdGl2YXRpb24gd2l0aCBubyByZXN1bHQnKTtcbiAgICB9XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ2NoaWxkV29ya2Zsb3dDb21wbGV0ZScsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgY29tcGxldGVkID0gYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGxldGVkLnJlc3VsdCA/IHRoaXMucGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZChjb21wbGV0ZWQucmVzdWx0KSA6IHVuZGVmaW5lZDtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZCkge1xuICAgICAgY29uc3QgeyBmYWlsdXJlIH0gPSBhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQ7XG4gICAgICBpZiAoZmFpbHVyZSA9PT0gdW5kZWZpbmVkIHx8IGZhaWx1cmUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGZhaWxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09PSB1bmRlZmluZWQgfHwgZmFpbHVyZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgY2FuY2VsbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSW50ZW50aW9uYWxseSBub24tYXN5bmMgZnVuY3Rpb24gc28gdGhpcyBoYW5kbGVyIGRvZXNuJ3Qgc2hvdyB1cCBpbiB0aGUgc3RhY2sgdHJhY2VcbiAgcHJvdGVjdGVkIHF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlcih7IHF1ZXJ5TmFtZSwgYXJncyB9OiBRdWVyeUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnF1ZXJ5SGFuZGxlcnMuZ2V0KHF1ZXJ5TmFtZSk/LmhhbmRsZXI7XG4gICAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGtub3duUXVlcnlUeXBlcyA9IFsuLi50aGlzLnF1ZXJ5SGFuZGxlcnMua2V5cygpXS5qb2luKCcgJyk7XG4gICAgICAvLyBGYWlsIHRoZSBxdWVyeVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgYFdvcmtmbG93IGRpZCBub3QgcmVnaXN0ZXIgYSBoYW5kbGVyIGZvciAke3F1ZXJ5TmFtZX0uIFJlZ2lzdGVyZWQgcXVlcmllczogWyR7a25vd25RdWVyeVR5cGVzfV1gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBmbiguLi5hcmdzKTtcbiAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcignUXVlcnkgaGFuZGxlcnMgc2hvdWxkIG5vdCByZXR1cm4gYSBQcm9taXNlJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHF1ZXJ5V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklRdWVyeVdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBxdWVyeVR5cGUsIHF1ZXJ5SWQsIGhlYWRlcnMgfSA9IGFjdGl2YXRpb247XG4gICAgaWYgKCEocXVlcnlUeXBlICYmIHF1ZXJ5SWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIHF1ZXJ5IGFjdGl2YXRpb24gYXR0cmlidXRlcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZCxcbiAgICAgICdoYW5kbGVRdWVyeScsXG4gICAgICB0aGlzLnF1ZXJ5V29ya2Zsb3dOZXh0SGFuZGxlci5iaW5kKHRoaXMpXG4gICAgKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIHF1ZXJ5TmFtZTogcXVlcnlUeXBlLFxuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmFyZ3VtZW50cyksXG4gICAgICBxdWVyeUlkLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVF1ZXJ5KHF1ZXJ5SWQsIHJlc3VsdCksXG4gICAgICAocmVhc29uKSA9PiB0aGlzLmZhaWxRdWVyeShxdWVyeUlkLCByZWFzb24pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkb1VwZGF0ZShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSURvVXBkYXRlKTogdm9pZCB7XG4gICAgY29uc3QgeyBpZDogdXBkYXRlSWQsIHByb3RvY29sSW5zdGFuY2VJZCwgbmFtZSwgaGVhZGVycywgcnVuVmFsaWRhdG9yIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghdXBkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgaWQnKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKCFwcm90b2NvbEluc3RhbmNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgcHJvdG9jb2xJbnN0YW5jZUlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy51cGRhdGVIYW5kbGVycy5nZXQobmFtZSk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgdGhpcy5idWZmZXJlZFVwZGF0ZXMucHVzaChhY3RpdmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYWtlSW5wdXQgPSAoKTogVXBkYXRlSW5wdXQgPT4gKHtcbiAgICAgIHVwZGF0ZUlkLFxuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmlucHV0KSxcbiAgICAgIG5hbWUsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGJlbG93IGlzIHJlc3BvbnNpYmxlIGZvciB1cGhvbGRpbmcsIGFuZCBjb25zdHJhaW5lZFxuICAgIC8vIGJ5LCB0aGUgZm9sbG93aW5nIGNvbnRyYWN0OlxuICAgIC8vXG4gICAgLy8gMS4gSWYgbm8gdmFsaWRhdG9yIGlzIHByZXNlbnQgdGhlbiB2YWxpZGF0aW9uIGludGVyY2VwdG9ycyB3aWxsIG5vdCBiZSBydW4uXG4gICAgLy9cbiAgICAvLyAyLiBEdXJpbmcgdmFsaWRhdGlvbiwgYW55IGVycm9yIG11c3QgZmFpbCB0aGUgVXBkYXRlOyBkdXJpbmcgdGhlIFVwZGF0ZVxuICAgIC8vICAgIGl0c2VsZiwgVGVtcG9yYWwgZXJyb3JzIGZhaWwgdGhlIFVwZGF0ZSB3aGVyZWFzIG90aGVyIGVycm9ycyBmYWlsIHRoZVxuICAgIC8vICAgIGFjdGl2YXRpb24uXG4gICAgLy9cbiAgICAvLyAzLiBUaGUgaGFuZGxlciBtdXN0IG5vdCBzZWUgYW55IG11dGF0aW9ucyBvZiB0aGUgYXJndW1lbnRzIG1hZGUgYnkgdGhlXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNC4gQW55IGVycm9yIHdoZW4gZGVjb2RpbmcvZGVzZXJpYWxpemluZyBpbnB1dCBtdXN0IGJlIGNhdWdodCBhbmQgcmVzdWx0XG4gICAgLy8gICAgaW4gcmVqZWN0aW9uIG9mIHRoZSBVcGRhdGUgYmVmb3JlIGl0IGlzIGFjY2VwdGVkLCBldmVuIGlmIHRoZXJlIGlzIG5vXG4gICAgLy8gICAgdmFsaWRhdG9yLlxuICAgIC8vXG4gICAgLy8gNS4gVGhlIGluaXRpYWwgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgKGFzeW5jKSBVcGRhdGUgaGFuZGxlciBzaG91bGRcbiAgICAvLyAgICBiZSBleGVjdXRlZCBhZnRlciB0aGUgKHN5bmMpIHZhbGlkYXRvciBjb21wbGV0ZXMgc3VjaCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gICAgbWluaW1hbCBvcHBvcnR1bml0eSBmb3IgYSBkaWZmZXJlbnQgY29uY3VycmVudCB0YXNrIHRvIGJlIHNjaGVkdWxlZFxuICAgIC8vICAgIGJldHdlZW4gdGhlbS5cbiAgICAvL1xuICAgIC8vIDYuIFRoZSBzdGFjayB0cmFjZSB2aWV3IHByb3ZpZGVkIGluIHRoZSBUZW1wb3JhbCBVSSBtdXN0IG5vdCBiZSBwb2xsdXRlZFxuICAgIC8vICAgIGJ5IHByb21pc2VzIHRoYXQgZG8gbm90IGRlcml2ZSBmcm9tIHVzZXIgY29kZS4gVGhpcyBpbXBsaWVzIHRoYXRcbiAgICAvLyAgICBhc3luYy9hd2FpdCBzeW50YXggbWF5IG5vdCBiZSB1c2VkLlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGVsaWJlcmF0ZWx5IHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBiZWxvdy5cbiAgICAvLyBUaGVzZSBhcmUgY2F1Z2h0IGVsc2V3aGVyZSBhbmQgZmFpbCB0aGUgY29ycmVzcG9uZGluZyBhY3RpdmF0aW9uLlxuICAgIGNvbnN0IGRvVXBkYXRlSW1wbCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpbnB1dDogVXBkYXRlSW5wdXQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocnVuVmFsaWRhdG9yICYmIGVudHJ5LnZhbGlkYXRvcikge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQsXG4gICAgICAgICAgICAndmFsaWRhdGVVcGRhdGUnLFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkudmFsaWRhdG9yKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdmFsaWRhdGUobWFrZUlucHV0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gbWFrZUlucHV0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2NlcHRVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkKTtcbiAgICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLFxuICAgICAgICAnaGFuZGxlVXBkYXRlJyxcbiAgICAgICAgdGhpcy51cGRhdGVOZXh0SGFuZGxlci5iaW5kKHRoaXMsIGVudHJ5LmhhbmRsZXIpXG4gICAgICApO1xuICAgICAgY29uc3QgeyB1bmZpbmlzaGVkUG9saWN5IH0gPSBlbnRyeTtcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuc2V0KHVwZGF0ZUlkLCB7IG5hbWUsIHVuZmluaXNoZWRQb2xpY3ksIGlkOiB1cGRhdGVJZCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGV4ZWN1dGUoaW5wdXQpXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkLCByZXN1bHQpKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLmRlbGV0ZSh1cGRhdGVJZCkpO1xuICAgICAgdW50cmFja1Byb21pc2UocmVzKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICB1bnRyYWNrUHJvbWlzZShVcGRhdGVTY29wZS51cGRhdGVXaXRoSW5mbyh1cGRhdGVJZCwgbmFtZSwgZG9VcGRhdGVJbXBsKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlTmV4dEhhbmRsZXIoaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlciguLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyKHZhbGlkYXRvcjogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3IoLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkVXBkYXRlcyA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzO1xuICAgIHdoaWxlIChidWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmb3VuZEluZGV4ID0gYnVmZmVyZWRVcGRhdGVzLmZpbmRJbmRleCgodXBkYXRlKSA9PiB0aGlzLnVwZGF0ZUhhbmRsZXJzLmhhcyh1cGRhdGUubmFtZSBhcyBzdHJpbmcpKTtcbiAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAvLyBObyBidWZmZXJlZCBVcGRhdGVzIGhhdmUgYSBoYW5kbGVyIHlldC5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBbdXBkYXRlXSA9IGJ1ZmZlcmVkVXBkYXRlcy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICB0aGlzLmRvVXBkYXRlKHVwZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlamVjdEJ1ZmZlcmVkVXBkYXRlcygpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5idWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1cGRhdGUgPSB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uICovXG4gICAgICAgICAgdXBkYXRlLnByb3RvY29sSW5zdGFuY2VJZCEsXG4gICAgICAgICAgQXBwbGljYXRpb25GYWlsdXJlLm5vblJldHJ5YWJsZShgTm8gcmVnaXN0ZXJlZCBoYW5kbGVyIGZvciB1cGRhdGU6ICR7dXBkYXRlLm5hbWV9YClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlcih7IHNpZ25hbE5hbWUsIGFyZ3MgfTogU2lnbmFsSW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuc2lnbmFsSGFuZGxlcnMuZ2V0KHNpZ25hbE5hbWUpPy5oYW5kbGVyO1xuICAgIGlmIChmbikge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKC4uLmFyZ3MpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIoc2lnbmFsTmFtZSwgLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcihgTm8gcmVnaXN0ZXJlZCBzaWduYWwgaGFuZGxlciBmb3Igc2lnbmFsOiAke3NpZ25hbE5hbWV9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNpZ25hbFdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JU2lnbmFsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNpZ25hbE5hbWUsIGhlYWRlcnMgfSA9IGFjdGl2YXRpb247XG4gICAgaWYgKCFzaWduYWxOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gc2lnbmFsTmFtZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsTmFtZSkgJiYgIXRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYnVmZmVyZWRTaWduYWxzLnB1c2goYWN0aXZhdGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHNpZ25hbCBoYW5kbGVyIHRoZW4gdGhlIHVuZmluaXNoZWRcbiAgICAvLyBwb2xpY3kgaXMgV0FSTl9BTkRfQUJBTkRPTjsgdXNlcnMgY3VycmVudGx5IGhhdmUgbm8gd2F5IHRvIHNpbGVuY2UgYW55XG4gICAgLy8gZW5zdWluZyB3YXJuaW5ncy5cbiAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID1cbiAgICAgIHRoaXMuc2lnbmFsSGFuZGxlcnMuZ2V0KHNpZ25hbE5hbWUpPy51bmZpbmlzaGVkUG9saWN5ID8/IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET047XG5cbiAgICBjb25zdCBzaWduYWxFeGVjdXRpb25OdW0gPSB0aGlzLnNpZ25hbEhhbmRsZXJFeGVjdXRpb25TZXErKztcbiAgICB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLnNldChzaWduYWxFeGVjdXRpb25OdW0sIHsgbmFtZTogc2lnbmFsTmFtZSwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQsXG4gICAgICAnaGFuZGxlU2lnbmFsJyxcbiAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlci5iaW5kKHRoaXMpXG4gICAgKTtcbiAgICBleGVjdXRlKHtcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5pbnB1dCksXG4gICAgICBzaWduYWxOYW1lLFxuICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICB9KVxuICAgICAgLmNhdGNoKHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlLmJpbmQodGhpcykpXG4gICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLmRlbGV0ZShzaWduYWxFeGVjdXRpb25OdW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaEJ1ZmZlcmVkU2lnbmFscygpOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXJlZFNpZ25hbHMgPSB0aGlzLmJ1ZmZlcmVkU2lnbmFscztcbiAgICB3aGlsZSAoYnVmZmVyZWRTaWduYWxzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIsIHNvIGFsbCBzaWduYWxzIGFyZSBkaXNwYXRjaGFibGVcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgdGhpcy5zaWduYWxXb3JrZmxvdyhidWZmZXJlZFNpZ25hbHMuc2hpZnQoKSEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGJ1ZmZlcmVkU2lnbmFscy5maW5kSW5kZXgoKHNpZ25hbCkgPT4gdGhpcy5zaWduYWxIYW5kbGVycy5oYXMoc2lnbmFsLnNpZ25hbE5hbWUgYXMgc3RyaW5nKSk7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IFtzaWduYWxdID0gYnVmZmVyZWRTaWduYWxzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5zaWduYWxXb3JrZmxvdyhzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlU2lnbmFsRXh0ZXJuYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ3NpZ25hbFdvcmtmbG93JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5mYWlsdXJlKSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWx1cmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlUmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3coXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlUmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3dcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ2NhbmNlbFdvcmtmbG93JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5mYWlsdXJlKSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWx1cmUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3YXJuSWZVbmZpbmlzaGVkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgZ2V0V2FybmFibGUgPSAoaGFuZGxlckV4ZWN1dGlvbnM6IEl0ZXJhYmxlPE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPik6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10gPT4ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oaGFuZGxlckV4ZWN1dGlvbnMpLmZpbHRlcihcbiAgICAgICAgKGV4KSA9PiBleC51bmZpbmlzaGVkUG9saWN5ID09PSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCB3YXJuYWJsZVVwZGF0ZXMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2Uod2FybmFibGVVcGRhdGVzKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmFibGVTaWduYWxzID0gZ2V0V2FybmFibGUodGhpcy5pblByb2dyZXNzU2lnbmFscy52YWx1ZXMoKSk7XG4gICAgaWYgKHdhcm5hYmxlU2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKHdhcm5hYmxlU2lnbmFscykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSYW5kb21TZWVkKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JVXBkYXRlUmFuZG9tU2VlZCk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWN0aXZhdGlvbiB3aXRoIHJhbmRvbW5lc3NTZWVkIGF0dHJpYnV0ZScpO1xuICAgIH1cbiAgICB0aGlzLnJhbmRvbSA9IGFsZWEoYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZC50b0J5dGVzKCkpO1xuICB9XG5cbiAgcHVibGljIG5vdGlmeUhhc1BhdGNoKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JTm90aWZ5SGFzUGF0Y2gpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcpXG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1VuZXhwZWN0ZWQgbm90aWZ5SGFzUGF0Y2ggam9iIG9uIG5vbi1yZXBsYXkgYWN0aXZhdGlvbicpO1xuICAgIGlmICghYWN0aXZhdGlvbi5wYXRjaElkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3RpZnlIYXNQYXRjaCBtaXNzaW5nIHBhdGNoIGlkJyk7XG4gICAgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmFkZChhY3RpdmF0aW9uLnBhdGNoSWQpO1xuICB9XG5cbiAgcHVibGljIHBhdGNoSW50ZXJuYWwocGF0Y2hJZDogc3RyaW5nLCBkZXByZWNhdGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud29ya2Zsb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdQYXRjaGVzIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBXb3JrZmxvdyBzdGFydHMnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlUGF0Y2ggPSAhdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyB8fCB0aGlzLmtub3duUHJlc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpO1xuICAgIC8vIEF2b2lkIHNlbmRpbmcgY29tbWFuZHMgZm9yIHBhdGNoZXMgY29yZSBhbHJlYWR5IGtub3dzIGFib3V0LlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGVuYWJsZXMgZGV2ZWxvcG1lbnQgb2YgYXV0b21hdGljIHBhdGNoaW5nIHRvb2xzLlxuICAgIGlmICh1c2VQYXRjaCAmJiAhdGhpcy5zZW50UGF0Y2hlcy5oYXMocGF0Y2hJZCkpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgICBzZXRQYXRjaE1hcmtlcjogeyBwYXRjaElkLCBkZXByZWNhdGVkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VudFBhdGNoZXMuYWRkKHBhdGNoSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlUGF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGVhcmx5IHdoaWxlIGhhbmRsaW5nIGFuIGFjdGl2YXRpb24gdG8gcmVnaXN0ZXIga25vd24gZmxhZ3MuXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgYWRkS25vd25GbGFncyhmbGFnczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgZmxhZ3MpIHtcbiAgICAgIGFzc2VydFZhbGlkRmxhZyhmbGFnKTtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIFNESyBGbGFnIG1heSBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFNESyBmbGFncyBwbGF5IGEgcm9sZSBzaW1pbGFyIHRvIHRoZSBgcGF0Y2hlZCgpYCBBUEksIGJ1dCBhcmUgbWVhbnQgZm9yIGludGVybmFsIHVzYWdlIGJ5IHRoZVxuICAgKiBTREsgaXRzZWxmLiBUaGV5IG1ha2UgaXQgcG9zc2libGUgZm9yIHRoZSBTREsgdG8gZXZvbHZlIGl0cyBiZWhhdmlvcnMgb3ZlciB0aW1lLCB3aGlsZSBzdGlsbFxuICAgKiBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggV29ya2Zsb3cgaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IG9sZGVyIFNES3MsIHdpdGhvdXQgY2F1c2luZ1xuICAgKiBkZXRlcm1pbmlzbSB2aW9sYXRpb25zLlxuICAgKlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGhhc0ZsYWcoZmxhZzogU2RrRmxhZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmtub3duRmxhZ3MuaGFzKGZsYWcuaWQpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCByZXBsYXlpbmcsIGVuYWJsZSB0aGUgZmxhZyBpZiBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gU2V0dGluZyBhXG4gICAgLy8gZmxhZydzIGRlZmF1bHQgdG8gZmFsc2UgYWxsb3dzIHByb2dyZXNzaXZlIHJvbGxvdXQgb2YgbmV3IGZlYXR1cmUgZmxhZ3MsIHdpdGggdGhlIHBvc3NpYmlsaXR5XG4gICAgLy8gb2YgcmV2ZXJ0aW5nIGJhY2sgdG8gYSB2ZXJzaW9uIG9mIHRoZSBTREsgd2hlcmUgdGhlIGZsYWcgaXMgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgIC8vIEl0IGlzIGFsc28gdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2UuXG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuZGVmYXVsdCkge1xuICAgICAgdGhpcy5rbm93bkZsYWdzLmFkZChmbGFnLmlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdoZW4gcmVwbGF5aW5nLCBhIGZsYWcgaXMgY29uc2lkZXJlZCBlbmFibGVkIGlmIGl0IHdhcyBlbmFibGVkIGR1cmluZyB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIG9mXG4gICAgLy8gdGhhdCBXb3JrZmxvdyBUYXNrOyB0aGlzIGlzIG5vcm1hbGx5IGRldGVybWluZWQgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBmbGFnIElEIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gV0ZUIENvbXBsZXRlZCdzIGBzZGtNZXRhZGF0YS5sYW5nVXNlZEZsYWdzYC5cbiAgICAvL1xuICAgIC8vIFNESyBGbGFnIEFsdGVybmF0ZSBDb25kaXRpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBmbGFnIHNob3VsZFxuICAgIC8vIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNESyB0aGF0XG4gICAgLy8gZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVCBlbWl0dGVkXG4gICAgLy8gYnkgcHJldmlvdXMgU0RLcyB0aGF0IGNvbnRhaW5lZCBhIGJ1Zy4gQWx0IENvbmRpdGlvbnMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZy4gQWxzbywgYWx0ZXJuYXRlIGNvbmRpdGlvbnMgd2lsbCBub3RcbiAgICAvLyBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzXG4gICAgLy8gbWF5IG5vdCByZWZsZWN0IHRoaXMgZmxhZyBpZiB0aGUgY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3RcbiAgICAvLyBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93IEV4ZWN1dGlvbiBoYXMgZ29uZSB0aHJvdWdoIGEgbmV3ZXIgU0RLIHZlcnNpb24gdGhlbiBhZ2FpblxuICAgIC8vIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICAgIGlmICh0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmQgb2YgZmxhZy5hbHRlcm5hdGl2ZUNvbmRpdGlvbnMpIHtcbiAgICAgICAgaWYgKGNvbmQoeyBpbmZvOiB0aGlzLmluZm8gfSkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGcm9tQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdyZW1vdmVGcm9tQ2FjaGUgYWN0aXZhdGlvbiBqb2Igc2hvdWxkIG5vdCByZWFjaCB3b3JrZmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgZmFpbHVyZXMgaW50byBhIGNvbW1hbmQgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLlxuICAgKiBVc2VkIHRvIGhhbmRsZSBhbnkgZmFpbHVyZSBlbWl0dGVkIGJ5IHRoZSBXb3JrZmxvdy5cbiAgICovXG4gIGFzeW5jIGhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcjogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbmNlbGxlZCAmJiBpc0NhbmNlbGxhdGlvbihlcnJvcikpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjYW5jZWxXb3JrZmxvd0V4ZWN1dGlvbjoge30gfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIENvbnRpbnVlQXNOZXcpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoeyBjb250aW51ZUFzTmV3V29ya2Zsb3dFeGVjdXRpb246IGVycm9yLmNvbW1hbmQgfSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSkge1xuICAgICAgICAvLyBUaGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIHJlamVjdGlvbiB3aGljaCB3aWxsIGZhaWwgdGhlIGFjdGl2YXRpb25cbiAgICAgICAgLy8gcHJldmVudGluZyBpdCBmcm9tIGNvbXBsZXRpbmcuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgLy8gRmFpbCB0aGUgd29ya2Zsb3cuIFdlIGRvIG5vdCB3YW50IHRvIGlzc3VlIHVuZmluaXNoZWRIYW5kbGVycyB3YXJuaW5ncy4gVG8gYWNoaWV2ZSB0aGF0LCB3ZVxuICAgICAgLy8gbWFyayBhbGwgaGFuZGxlcnMgYXMgY29tcGxldGVkIG5vdy5cbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1NpZ25hbHMuY2xlYXIoKTtcbiAgICAgIHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuY2xlYXIoKTtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBmYWlsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgIGZhaWx1cmU6IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZXJyb3IpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICByZXNwb25kVG9RdWVyeTogeyBxdWVyeUlkLCBzdWNjZWVkZWQ6IHsgcmVzcG9uc2U6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0KSB9IH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZhaWxRdWVyeShxdWVyeUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICByZXNwb25kVG9RdWVyeToge1xuICAgICAgICBxdWVyeUlkLFxuICAgICAgICBmYWlsZWQ6IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZW5zdXJlVGVtcG9yYWxGYWlsdXJlKGVycm9yKSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhY2NlcHRVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHsgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBhY2NlcHRlZDoge30gfSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHsgcHJvdG9jb2xJbnN0YW5jZUlkLCBjb21wbGV0ZWQ6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0KSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWplY3RVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkOiBzdHJpbmcsIGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZToge1xuICAgICAgICBwcm90b2NvbEluc3RhbmNlSWQsXG4gICAgICAgIHJlamVjdGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUgKi9cbiAgcHJpdmF0ZSBtYXliZUNvbnN1bWVDb21wbGV0aW9uKHR5cGU6IGtleW9mIEFjdGl2YXRvclsnY29tcGxldGlvbnMnXSwgdGFza1NlcTogbnVtYmVyKTogQ29tcGxldGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZ2V0KHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29tcGxldGlvbnNbdHlwZV0uZGVsZXRlKHRhc2tTZXEpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGxldGlvbjtcbiAgfVxuXG4gIC8qKiBDb25zdW1lIGEgY29tcGxldGlvbiBpZiBpdCBleGlzdHMgaW4gV29ya2Zsb3cgc3RhdGUsIHRocm93cyBpZiBpdCBkb2Vzbid0ICovXG4gIHByaXZhdGUgY29uc3VtZUNvbXBsZXRpb24odHlwZToga2V5b2YgQWN0aXZhdG9yWydjb21wbGV0aW9ucyddLCB0YXNrU2VxOiBudW1iZXIpOiBDb21wbGV0aW9uIHtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKHR5cGUsIHRhc2tTZXEpO1xuICAgIGlmIChjb21wbGV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcihgTm8gY29tcGxldGlvbiBmb3IgdGFza1NlcSAke3Rhc2tTZXF9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wbGV0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVdvcmtmbG93KHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGNvbXBsZXRlV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICByZXN1bHQ6IHRoaXMucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQocmVzdWx0KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlKGVycjogdW5rbm93bik6IFByb3RvRmFpbHVyZSB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNvbnZlcnRlci5lcnJvclRvRmFpbHVyZShlcnIsIHRoaXMucGF5bG9hZENvbnZlcnRlcik7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUpOiBFcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZUNvbnZlcnRlci5mYWlsdXJlVG9FcnJvcihmYWlsdXJlLCB0aGlzLnBheWxvYWRDb252ZXJ0ZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNlcTxUIGV4dGVuZHMgeyBzZXE/OiBudW1iZXIgfCBudWxsIH0+KGFjdGl2YXRpb246IFQpOiBudW1iZXIge1xuICBjb25zdCBzZXEgPSBhY3RpdmF0aW9uLnNlcTtcbiAgaWYgKHNlcSA9PT0gdW5kZWZpbmVkIHx8IHNlcSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEdvdCBhY3RpdmF0aW9uIHdpdGggbm8gc2VxIGF0dHJpYnV0ZWApO1xuICB9XG4gIHJldHVybiBzZXE7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYW4gdXBkYXRlIGhhbmRsZXIgd2FzIHN0aWxsIHJ1bm5pbmcuIFRoaXMgbWF5IGhhdmUgaW50ZXJydXB0ZWQgd29yayB0aGF0IHRoZVxudXBkYXRlIGhhbmRsZXIgd2FzIGRvaW5nLCBhbmQgdGhlIGNsaWVudCB0aGF0IHNlbnQgdGhlIHVwZGF0ZSB3aWxsIHJlY2VpdmUgYSAnd29ya2Zsb3cgZXhlY3V0aW9uXG5hbHJlYWR5IGNvbXBsZXRlZCcgUlBDRXJyb3IgaW5zdGVhZCBvZiB0aGUgdXBkYXRlIHJlc3VsdC4gWW91IGNhbiB3YWl0IGZvciBhbGwgdXBkYXRlIGFuZCBzaWduYWxcbmhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nIFxcYGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxcYC5cbkFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGUgY2xpZW50cyBzZW5kaW5nIHRoZSB1cGRhdGUgYXJlIG9rYXkgd2l0aCBpbnRlcnJ1cHRpbmcgcnVubmluZyBoYW5kbGVyc1xud2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsIGFuZCBjYXVzaW5nIGNsaWVudHMgdG8gcmVjZWl2ZSBlcnJvcnMsIHRoZW4geW91IGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBieVxucGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVVwZGF0ZSwgbXlVcGRhdGVIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnICcpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyB1cGRhdGVzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBoYW5kbGVyRXhlY3V0aW9ucy5tYXAoKGV4KSA9PiAoeyBuYW1lOiBleC5uYW1lLCBpZDogZXguaWQgfSkpXG4gICl9YDtcbn1cblxuZnVuY3Rpb24gbWFrZVVuZmluaXNoZWRTaWduYWxIYW5kbGVyTWVzc2FnZShoYW5kbGVyRXhlY3V0aW9uczogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgXG5bVE1QUkwxMTAyXSBXb3JrZmxvdyBmaW5pc2hlZCB3aGlsZSBhIHNpZ25hbCBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnNpZ25hbCBoYW5kbGVyIHdhcyBkb2luZy4gWW91IGNhbiB3YWl0IGZvciBhbGwgdXBkYXRlIGFuZCBzaWduYWwgaGFuZGxlcnMgdG8gY29tcGxldGUgYnkgdXNpbmdcblxcYGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxcYC4gQWx0ZXJuYXRpdmVseSwgaWYgYm90aCB5b3UgYW5kIHRoZVxuY2xpZW50cyBzZW5kaW5nIHRoZSB1cGRhdGUgYXJlIG9rYXkgd2l0aCBpbnRlcnJ1cHRpbmcgcnVubmluZyBoYW5kbGVycyB3aGVuIHRoZSB3b3JrZmxvdyBmaW5pc2hlcyxcbnRoZW4geW91IGNhbiBkaXNhYmxlIHRoaXMgd2FybmluZyBieSBwYXNzaW5nIGFuIG9wdGlvbiB3aGVuIHNldHRpbmcgdGhlIGhhbmRsZXI6XG5cXGB3b3JrZmxvdy5zZXRIYW5kbGVyKG15U2lnbmFsLCBteVNpZ25hbEhhbmRsZXIsIHt1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5BQkFORE9OfSk7XFxgLmBcblxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgY29uc3QgbmFtZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IGV4IG9mIGhhbmRsZXJFeGVjdXRpb25zKSB7XG4gICAgY29uc3QgY291bnQgPSBuYW1lcy5nZXQoZXgubmFtZSkgfHwgMDtcbiAgICBuYW1lcy5zZXQoZXgubmFtZSwgY291bnQgKyAxKTtcbiAgfVxuXG4gIHJldHVybiBgJHttZXNzYWdlfSBUaGUgZm9sbG93aW5nIHNpZ25hbHMgd2VyZSB1bmZpbmlzaGVkIChhbmQgd2FybmluZ3Mgd2VyZSBub3QgZGlzYWJsZWQgZm9yIHRoZWlyIGhhbmRsZXIpOiAke0pTT04uc3RyaW5naWZ5KFxuICAgIEFycmF5LmZyb20obmFtZXMuZW50cmllcygpKS5tYXAoKFtuYW1lLCBjb3VudF0pID0+ICh7IG5hbWUsIGNvdW50IH0pKVxuICApfWA7XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgU2RrQ29tcG9uZW50IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IHR5cGUgU2luaywgdHlwZSBTaW5rcywgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgaXNDYW5jZWxsYXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBXb3JrZmxvd0luZm8sIENvbnRpbnVlQXNOZXcgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0xvZ2dlciBleHRlbmRzIFNpbmsge1xuICB0cmFjZShtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICpcbiAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGV4dGVuZHMgU2lua3Mge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAgICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICAgKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gICAqL1xuICBkZWZhdWx0V29ya2VyTG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBsb2dzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNpbmtzSW50ZXJuYWwgZXh0ZW5kcyBTaW5rcyB7XG4gIF9fdGVtcG9yYWxfbG9nZ2VyOiBXb3JrZmxvd0xvZ2dlcjtcbn1cblxuY29uc3QgbG9nZ2VyU2luayA9IHByb3h5U2lua3M8TG9nZ2VyU2lua3NJbnRlcm5hbD4oKS5fX3RlbXBvcmFsX2xvZ2dlcjtcblxuLyoqXG4gKiBTeW1ib2wgdXNlZCBieSB0aGUgU0RLIGxvZ2dlciB0byBleHRyYWN0IGEgdGltZXN0YW1wIGZyb20gbG9nIGF0dHJpYnV0ZXMuXG4gKiBBbHNvIGRlZmluZWQgaW4gYHdvcmtlci9sb2dnZXIudHNgIC0gaW50ZW50aW9uYWxseSBub3Qgc2hhcmVkLlxuICovXG5jb25zdCBMb2dUaW1lc3RhbXAgPSBTeW1ib2wuZm9yKCdsb2dfdGltZXN0YW1wJyk7XG5cbi8qKlxuICogRGVmYXVsdCB3b3JrZmxvdyBsb2dnZXIuXG4gKlxuICogVGhpcyBsb2dnZXIgaXMgcmVwbGF5LWF3YXJlIGFuZCB3aWxsIG9taXQgbG9nIG1lc3NhZ2VzIG9uIHdvcmtmbG93IHJlcGxheS4gTWVzc2FnZXMgZW1pdHRlZCBieSB0aGlzIGxvZ2dlciBhcmVcbiAqIGZ1bm5lbGxlZCB0aHJvdWdoIGEgc2luayB0aGF0IGZvcndhcmRzIHRoZW0gdG8gdGhlIGxvZ2dlciByZWdpc3RlcmVkIG9uIHtAbGluayBSdW50aW1lLmxvZ2dlcn0uXG4gKlxuICogQXR0cmlidXRlcyBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbiBjb250ZXh0IGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGFzIG1ldGFkYXRhIG9uIGV2ZXJ5IGxvZ1xuICogZW50cmllcy4gQW4gZXh0cmEgYHNka0NvbXBvbmVudGAgbWV0YWRhdGEgYXR0cmlidXRlIGlzIGFsc28gYWRkZWQsIHdpdGggdmFsdWUgYHdvcmtmbG93YDsgdGhpcyBjYW4gYmUgdXNlZCBmb3JcbiAqIGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIGVudHJpZXMgZnVydGhlciBkb3duc3RyZWFtLlxuICpcbiAqIFRvIGN1c3RvbWl6ZSBsb2cgYXR0cmlidXRlcywgcmVnaXN0ZXIgYSB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3J9IHRoYXQgaW50ZXJjZXB0cyB0aGVcbiAqIGBnZXRMb2dBdHRyaWJ1dGVzKClgIG1ldGhvZC5cbiAqXG4gKiBOb3RpY2UgdGhhdCBzaW5jZSBzaW5rcyBhcmUgdXNlZCB0byBwb3dlciB0aGlzIGxvZ2dlciwgYW55IGxvZyBhdHRyaWJ1dGVzIG11c3QgYmUgdHJhbnNmZXJhYmxlIHZpYSB0aGVcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX1cbiAqIEFQSS5cbiAqXG4gKiBOT1RFOiBTcGVjaWZ5aW5nIGEgY3VzdG9tIGxvZ2dlciB0aHJvdWdoIHtAbGluayBkZWZhdWx0U2lua30gb3IgYnkgbWFudWFsbHkgcmVnaXN0ZXJpbmcgYSBzaW5rIG5hbWVkXG4gKiBgZGVmYXVsdFdvcmtlckxvZ2dlcmAgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2c6IFdvcmtmbG93TG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAoWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSBhcyBBcnJheTxrZXlvZiBXb3JrZmxvd0xvZ2dlcj4pLm1hcCgobGV2ZWwpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgbGV2ZWwsXG4gICAgICAobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5sb2coLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29udGV4dC4nKTtcbiAgICAgICAgY29uc3QgZ2V0TG9nQXR0cmlidXRlcyA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2dldExvZ0F0dHJpYnV0ZXMnLCAoYSkgPT4gYSk7XG4gICAgICAgIHJldHVybiBsb2dnZXJTaW5rW2xldmVsXShtZXNzYWdlLCB7XG4gICAgICAgICAgLy8gSW5qZWN0IHRoZSBjYWxsIHRpbWUgaW4gbmFub3NlY29uZCByZXNvbHV0aW9uIGFzIGV4cGVjdGVkIGJ5IHRoZSB3b3JrZXIgbG9nZ2VyLlxuICAgICAgICAgIFtMb2dUaW1lc3RhbXBdOiBhY3RpdmF0b3IuZ2V0VGltZU9mRGF5KCksXG4gICAgICAgICAgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2Zsb3csXG4gICAgICAgICAgLi4uZ2V0TG9nQXR0cmlidXRlcyh3b3JrZmxvd0xvZ0F0dHJpYnV0ZXMoYWN0aXZhdG9yLmluZm8pKSxcbiAgICAgICAgICAuLi5hdHRycyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIF07XG4gIH0pXG4pIGFzIGFueTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZyhmbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICBsb2cuZGVidWcoJ1dvcmtmbG93IHN0YXJ0ZWQnLCB7IHNka0NvbXBvbmVudDogU2RrQ29tcG9uZW50LndvcmtlciB9KTtcbiAgY29uc3QgcCA9IGZuKCkudGhlbihcbiAgICAocmVzKSA9PiB7XG4gICAgICBsb2cuZGVidWcoJ1dvcmtmbG93IGNvbXBsZXRlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgLy8gQXZvaWQgdXNpbmcgaW5zdGFuY2VvZiBjaGVja3MgaW4gY2FzZSB0aGUgbW9kdWxlcyB0aGV5J3JlIGRlZmluZWQgaW4gbG9hZGVkIG1vcmUgdGhhbiBvbmNlLFxuICAgICAgLy8gZS5nLiBieSBqZXN0IG9yIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgYXJlIGluc3RhbGxlZC5cbiAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29tcGxldGVkIGFzIGNhbmNlbGxlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29udGludWVkIGFzIG5ldycsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2cud2FybignV29ya2Zsb3cgZmFpbGVkJywgeyBlcnJvciwgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICApO1xuICAvLyBBdm9pZCBzaG93aW5nIHRoaXMgaW50ZXJjZXB0b3IgaW4gc3RhY2sgdHJhY2UgcXVlcnlcbiAgdW50cmFja1Byb21pc2UocCk7XG4gIHJldHVybiBwO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgYXR0cmlidXRlcyB0byBiZSBzZXQgX2J5IGRlZmF1bHRfIG9uIGxvZyBtZXNzYWdlcyBmb3IgYSBnaXZlbiBXb3JrZmxvdy5cbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBXb3JrZmxvdyBjb250ZXh0IChlZy4gYnkgdGhlIHdvcmtlciBpdHNlbGYpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dMb2dBdHRyaWJ1dGVzKGluZm86IFdvcmtmbG93SW5mbyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lc3BhY2U6IGluZm8ubmFtZXNwYWNlLFxuICAgIHRhc2tRdWV1ZTogaW5mby50YXNrUXVldWUsXG4gICAgd29ya2Zsb3dJZDogaW5mby53b3JrZmxvd0lkLFxuICAgIHJ1bklkOiBpbmZvLnJ1bklkLFxuICAgIHdvcmtmbG93VHlwZTogaW5mby53b3JrZmxvd1R5cGUsXG4gIH07XG59XG4iLCIvLyAuLi9wYWNrYWdlLmpzb24gaXMgb3V0c2lkZSBvZiB0aGUgVFMgcHJvamVjdCByb290RGlyIHdoaWNoIGNhdXNlcyBUUyB0byBjb21wbGFpbiBhYm91dCB0aGlzIGltcG9ydC5cbi8vIFdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgcm9vdERpciBiZWNhdXNlIGl0IG1lc3NlcyB1cCB0aGUgb3V0cHV0IHN0cnVjdHVyZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgcGtnIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiIsIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFdvcmtmbG93IGVuZCBvZiB0aGUgc2lua3MgbWVjaGFuaXNtLlxuICpcbiAqIFNpbmtzIGFyZSBhIG1lY2hhbmlzbSBmb3IgZXhwb3J0aW5nIGRhdGEgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGVcbiAqIE5vZGUuanMgZW52aXJvbm1lbnQsIHRoZXkgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBXb3JrZmxvdyBoYXMgbm8gd2F5IHRvXG4gKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBvdXRzaWRlIFdvcmxkLlxuICpcbiAqIFNpbmtzIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgZXhwb3J0aW5nIGxvZ3MsIG1ldHJpY3MgYW5kIHRyYWNlcyBvdXQgZnJvbSB0aGVcbiAqIFdvcmtmbG93LlxuICpcbiAqIFNpbmsgZnVuY3Rpb25zIG1heSBub3QgcmV0dXJuIHZhbHVlcyB0byB0aGUgV29ya2Zsb3cgaW4gb3JkZXIgdG8gcHJldmVudFxuICogYnJlYWtpbmcgZGV0ZXJtaW5pc20uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFdvcmtmbG93SW5mbyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vKipcbiAqIEFueSBmdW5jdGlvbiBzaWduYXR1cmUgY2FuIGJlIHVzZWQgZm9yIFNpbmsgZnVuY3Rpb25zIGFzIGxvbmcgYXMgdGhlIHJldHVybiB0eXBlIGlzIGB2b2lkYC5cbiAqXG4gKiBXaGVuIGNhbGxpbmcgYSBTaW5rIGZ1bmN0aW9uLCBhcmd1bWVudHMgYXJlIGNvcGllZCBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZSBOb2RlLmpzIGVudmlyb25tZW50IHVzaW5nXG4gKiB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS93b3JrZXJfdGhyZWFkcy5odG1sI3dvcmtlcl90aHJlYWRzX3BvcnRfcG9zdG1lc3NhZ2VfdmFsdWVfdHJhbnNmZXJsaXN0IHwgcG9zdE1lc3NhZ2V9LlxuXG4gKiBUaGlzIGNvbnN0cmFpbnMgdGhlIGFyZ3VtZW50IHR5cGVzIHRvIHByaW1pdGl2ZXMgKGV4Y2x1ZGluZyBTeW1ib2xzKS5cbiAqL1xuZXhwb3J0IHR5cGUgU2lua0Z1bmN0aW9uID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuXG4vKiogQSBtYXBwaW5nIG9mIG5hbWUgdG8gZnVuY3Rpb24sIGRlZmluZXMgYSBzaW5nbGUgc2luayAoZS5nLiBsb2dnZXIpICovXG5leHBvcnQgdHlwZSBTaW5rID0gUmVjb3JkPHN0cmluZywgU2lua0Z1bmN0aW9uPjtcbi8qKlxuICogV29ya2Zsb3cgU2luayBhcmUgYSBtYXBwaW5nIG9mIG5hbWUgdG8ge0BsaW5rIFNpbmt9XG4gKi9cbmV4cG9ydCB0eXBlIFNpbmtzID0gUmVjb3JkPHN0cmluZywgU2luaz47XG5cbi8qKlxuICogQ2FsbCBpbmZvcm1hdGlvbiBmb3IgYSBTaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lua0NhbGwge1xuICBpZmFjZU5hbWU6IHN0cmluZztcbiAgZm5OYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IGFueVtdO1xuICB3b3JrZmxvd0luZm86IFdvcmtmbG93SW5mbztcbn1cblxuLyoqXG4gKiBHZXQgYSByZWZlcmVuY2UgdG8gU2lua3MgZm9yIGV4cG9ydGluZyBkYXRhIG91dCBvZiB0aGUgV29ya2Zsb3cuXG4gKlxuICogVGhlc2UgU2lua3MgKiptdXN0KiogYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBXb3JrZXIgaW4gb3JkZXIgZm9yIHRoaXNcbiAqIG1lY2hhbmlzbSB0byB3b3JrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgcHJveHlTaW5rcywgU2lua3MgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKlxuICogaW50ZXJmYWNlIE15U2lua3MgZXh0ZW5kcyBTaW5rcyB7XG4gKiAgIGxvZ2dlcjoge1xuICogICAgIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAqICAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICogICB9O1xuICogfVxuICpcbiAqIGNvbnN0IHsgbG9nZ2VyIH0gPSBwcm94eVNpbmtzPE15RGVwZW5kZW5jaWVzPigpO1xuICogbG9nZ2VyLmluZm8oJ3NldHRpbmcgdXAnKTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBhc3luYyBleGVjdXRlKCkge1xuICogICAgICAgbG9nZ2VyLmluZm8oXCJoZXkgaG9cIik7XG4gKiAgICAgICBsb2dnZXIuZXJyb3IoXCJsZXRzIGdvXCIpO1xuICogICAgIH1cbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJveHlTaW5rczxUIGV4dGVuZHMgU2lua3M+KCk6IFQge1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIHt9LFxuICAgIHtcbiAgICAgIGdldChfLCBpZmFjZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShcbiAgICAgICAgICB7fSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQoXywgZm5OYW1lKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAgICAgICAgICAgICAgICdQcm94aWVkIHNpbmtzIGZ1bmN0aW9ucyBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYWN0aXZhdG9yLnNpbmtDYWxscy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGlmYWNlTmFtZTogaWZhY2VOYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGZuTmFtZTogZm5OYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIC8vIFNpbmsgZnVuY3Rpb24gZG9lc24ndCBnZXQgY2FsbGVkIGltbWVkaWF0ZWx5LiBNYWtlIGEgY2xvbmUgb2YgdGhlIHNpbmsncyBhcmdzLCBzbyB0aGF0IGZ1cnRoZXIgbXV0YXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB0byB0aGVzZSBvYmplY3RzIGRvbid0IGNvcnJ1cHQgdGhlIGFyZ3MgdGhhdCB0aGUgc2luayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUuIE9ubHkgYXZhaWxhYmxlIGZyb20gbm9kZSAxNy5cbiAgICAgICAgICAgICAgICAgIGFyZ3M6IChnbG9iYWxUaGlzIGFzIGFueSkuc3RydWN0dXJlZENsb25lID8gKGdsb2JhbFRoaXMgYXMgYW55KS5zdHJ1Y3R1cmVkQ2xvbmUoYXJncykgOiBhcmdzLFxuICAgICAgICAgICAgICAgICAgLy8gYWN0aXZhdG9yLmluZm8gaXMgaW50ZXJuYWxseSBjb3B5LW9uLXdyaXRlLiBUaGlzIGVuc3VyZSB0aGF0IGFueSBmdXJ0aGVyIG11dGF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHdvcmtmbG93IHN0YXRlIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcmVzZW50IGFjdGl2YXRpb24gd2lsbCBub3QgY29ycnVwdCB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93SW5mbyBzdGF0ZSB0aGF0IGdldHMgcGFzc2VkIHdoZW4gdGhlIHNpbmsgZnVuY3Rpb24gYWN0dWFsbHkgZ2V0cyBjYWxsZWQuXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd0luZm86IGFjdGl2YXRvci5pbmZvLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH1cbiAgKSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgeyBtYXliZUdldEFjdGl2YXRvclVudHlwZWQgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzZVN0YWNrU3RvcmUgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHByb21pc2UgZnJvbSBiZWluZyB0cmFja2VkIGZvciBzdGFjayB0cmFjZSBxdWVyeSBwdXJwb3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW50cmFja1Byb21pc2UocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBzdG9yZSA9IChtYXliZUdldEFjdGl2YXRvclVudHlwZWQoKSBhcyBhbnkpPy5wcm9taXNlU3RhY2tTdG9yZSBhcyBQcm9taXNlU3RhY2tTdG9yZSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFzdG9yZSkgcmV0dXJuO1xuICBzdG9yZS5jaGlsZFRvUGFyZW50LmRlbGV0ZShwcm9taXNlKTtcbiAgc3RvcmUucHJvbWlzZVRvU3RhY2suZGVsZXRlKHByb21pc2UpO1xufVxuIiwiaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5cbi8qKlxuICogQSBgUHJvbWlzZUxpa2VgIGhlbHBlciB3aGljaCBleHBvc2VzIGl0cyBgcmVzb2x2ZWAgYW5kIGByZWplY3RgIG1ldGhvZHMuXG4gKlxuICogVHJpZ2dlciBpcyBDYW5jZWxsYXRpb25TY29wZS1hd2FyZTogaXQgaXMgbGlua2VkIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9uXG4gKiBjb25zdHJ1Y3Rpb24gYW5kIHRocm93cyB3aGVuIHRoYXQgc2NvcGUgaXMgY2FuY2VsbGVkLlxuICpcbiAqIFVzZWZ1bCBmb3IgZS5nLiB3YWl0aW5nIGZvciB1bmJsb2NraW5nIGEgV29ya2Zsb3cgZnJvbSBhIFNpZ25hbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLVNOSVBTVEFSVCB0eXBlc2NyaXB0LXRyaWdnZXItd29ya2Zsb3ctLT5cbiAqIDwhLS1TTklQRU5ELS0+XG4gKi9cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4ge1xuICAvLyBUeXBlc2NyaXB0IGRvZXMgbm90IHJlYWxpemUgdGhhdCB0aGUgcHJvbWlzZSBleGVjdXRvciBpcyBydW4gc3luY2hyb25vdXNseSBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyByZWFkb25seSByZXNvbHZlOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyByZWFkb25seSByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMucHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuXG4gIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGxcbiAgKTogUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8qKlxuICogT3B0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBVcGRhdGVTY29wZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHVwZGF0ZSB0eXBlIG5hbWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8vIEFzeW5jTG9jYWxTdG9yYWdlIGlzIGluamVjdGVkIHZpYSB2bSBtb2R1bGUgaW50byBnbG9iYWwgc2NvcGUuXG4vLyBJbiBjYXNlIFdvcmtmbG93IGNvZGUgaXMgaW1wb3J0ZWQgaW4gTm9kZS5qcyBjb250ZXh0LCByZXBsYWNlIHdpdGggYW4gZW1wdHkgY2xhc3MuXG5leHBvcnQgY29uc3QgQXN5bmNMb2NhbFN0b3JhZ2U6IG5ldyA8VD4oKSA9PiBBTFM8VD4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLkFzeW5jTG9jYWxTdG9yYWdlID8/IGNsYXNzIHt9O1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlU2NvcGUge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVXBkYXRlU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBzY29wZSBhcyBjdXJyZW50IGFuZCBydW4gdGhlIHVwZGF0ZSBoYW5kbGVyIGBmbmAuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBgZm5gXG4gICAqL1xuICBydW48VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gc3RvcmFnZS5ydW4odGhpcywgZm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHVwZGF0ZSBzY29wZS5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCk6IFVwZGF0ZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3RvcmFnZS5nZXRTdG9yZSgpO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgVXBkYXRlU2NvcGUoeyBpZCwgbmFtZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgdXBkYXRlV2l0aEluZm88VD4oaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGlkLCBuYW1lIH0pLnJ1bihmbik7XG4gIH1cbn1cblxuY29uc3Qgc3RvcmFnZSA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZTxVcGRhdGVTY29wZT4oKTtcblxuLyoqXG4gKiBEaXNhYmxlIHRoZSBhc3luYyBsb2NhbCBzdG9yYWdlIGZvciB1cGRhdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZVVwZGF0ZVN0b3JhZ2UoKTogdm9pZCB7XG4gIHN0b3JhZ2UuZGlzYWJsZSgpO1xufVxuIiwiLyoqXG4gKiBFeHBvcnRlZCBmdW5jdGlvbnMgZm9yIHRoZSBXb3JrZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgV29ya2Zsb3cgaXNvbGF0ZVxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgSWxsZWdhbFN0YXRlRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBkaXNhYmxlU3RvcmFnZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IGRpc2FibGVVcGRhdGVTdG9yYWdlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHsgV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWN0aXZhdG9yIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgc2V0QWN0aXZhdG9yVW50eXBlZCwgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8vIEV4cG9ydCB0aGUgdHlwZSBmb3IgdXNlIG9uIHRoZSBcIndvcmtlclwiIHNpZGVcbmV4cG9ydCB7IFByb21pc2VTdGFja1N0b3JlIH0gZnJvbSAnLi9pbnRlcm5hbHMnO1xuXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIGFueTtcbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBpc29sYXRlIHJ1bnRpbWUuXG4gKlxuICogU2V0cyByZXF1aXJlZCBpbnRlcm5hbCBzdGF0ZSBhbmQgaW5zdGFudGlhdGVzIHRoZSB3b3JrZmxvdyBhbmQgaW50ZXJjZXB0b3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFJ1bnRpbWUob3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gbmV3IEFjdGl2YXRvcih7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpbmZvOiBmaXhQcm90b3R5cGVzKHtcbiAgICAgIC4uLm9wdGlvbnMuaW5mbyxcbiAgICAgIHVuc2FmZTogeyAuLi5vcHRpb25zLmluZm8udW5zYWZlLCBub3c6IE9yaWdpbmFsRGF0ZS5ub3cgfSxcbiAgICB9KSxcbiAgfSk7XG4gIC8vIFRoZXJlJ3Mgb25lIGFjdGl2YXRvciBwZXIgd29ya2Zsb3cgaW5zdGFuY2UsIHNldCBpdCBnbG9iYWxseSBvbiB0aGUgY29udGV4dC5cbiAgLy8gV2UgZG8gdGhpcyBiZWZvcmUgaW1wb3J0aW5nIGFueSB1c2VyIGNvZGUgc28gdXNlciBjb2RlIGNhbiBzdGF0aWNhbGx5IHJlZmVyZW5jZSBAdGVtcG9yYWxpby93b3JrZmxvdyBmdW5jdGlvbnNcbiAgLy8gYXMgd2VsbCBhcyBEYXRlIGFuZCBNYXRoLnJhbmRvbS5cbiAgc2V0QWN0aXZhdG9yVW50eXBlZChhY3RpdmF0b3IpO1xuXG4gIC8vIHdlYnBhY2sgYWxpYXMgdG8gcGF5bG9hZENvbnZlcnRlclBhdGhcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgY3VzdG9tUGF5bG9hZENvbnZlcnRlciA9IHJlcXVpcmUoJ19fdGVtcG9yYWxfY3VzdG9tX3BheWxvYWRfY29udmVydGVyJykucGF5bG9hZENvbnZlcnRlcjtcbiAgLy8gVGhlIGBwYXlsb2FkQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgaWYgKGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgIGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyID0gY3VzdG9tUGF5bG9hZENvbnZlcnRlcjtcbiAgfVxuICAvLyB3ZWJwYWNrIGFsaWFzIHRvIGZhaWx1cmVDb252ZXJ0ZXJQYXRoXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzXG4gIGNvbnN0IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9mYWlsdXJlX2NvbnZlcnRlcicpLmZhaWx1cmVDb252ZXJ0ZXI7XG4gIC8vIFRoZSBgZmFpbHVyZUNvbnZlcnRlcmAgZXhwb3J0IGlzIHZhbGlkYXRlZCBpbiB0aGUgV29ya2VyXG4gIGlmIChjdXN0b21GYWlsdXJlQ29udmVydGVyICE9IG51bGwpIHtcbiAgICBhY3RpdmF0b3IuZmFpbHVyZUNvbnZlcnRlciA9IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXI7XG4gIH1cblxuICBjb25zdCB7IGltcG9ydFdvcmtmbG93cywgaW1wb3J0SW50ZXJjZXB0b3JzIH0gPSBnbG9iYWwuX19URU1QT1JBTF9fO1xuICBpZiAoaW1wb3J0V29ya2Zsb3dzID09PSB1bmRlZmluZWQgfHwgaW1wb3J0SW50ZXJjZXB0b3JzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGJ1bmRsZSBkaWQgbm90IHJlZ2lzdGVyIGltcG9ydCBob29rcycpO1xuICB9XG5cbiAgY29uc3QgaW50ZXJjZXB0b3JzID0gaW1wb3J0SW50ZXJjZXB0b3JzKCk7XG4gIGZvciAoY29uc3QgbW9kIG9mIGludGVyY2VwdG9ycykge1xuICAgIGNvbnN0IGZhY3Rvcnk6IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9IG1vZC5pbnRlcmNlcHRvcnM7XG4gICAgaWYgKGZhY3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtmbG93cyBpbnRlcmNlcHRvcnM6IGV4cGVjdGVkIGEgZnVuY3Rpb24sIGJ1dCBnb3Q6ICcke2ZhY3Rvcnl9J2ApO1xuICAgICAgfVxuICAgICAgY29uc3QgaW50ZXJjZXB0b3JzID0gZmFjdG9yeSgpO1xuICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbmJvdW5kLnB1c2goLi4uKGludGVyY2VwdG9ycy5pbmJvdW5kID8/IFtdKSk7XG4gICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLnB1c2goLi4uKGludGVyY2VwdG9ycy5vdXRib3VuZCA/PyBbXSkpO1xuICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMucHVzaCguLi4oaW50ZXJjZXB0b3JzLmludGVybmFscyA/PyBbXSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1vZCA9IGltcG9ydFdvcmtmbG93cygpO1xuICBjb25zdCB3b3JrZmxvd0ZuID0gbW9kW2FjdGl2YXRvci5pbmZvLndvcmtmbG93VHlwZV07XG4gIGNvbnN0IGRlZmF1bHRXb3JrZmxvd0ZuID0gbW9kWydkZWZhdWx0J107XG5cbiAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYWN0aXZhdG9yLndvcmtmbG93ID0gd29ya2Zsb3dGbjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmYXVsdFdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSBkZWZhdWx0V29ya2Zsb3dGbjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkZXRhaWxzID1cbiAgICAgIHdvcmtmbG93Rm4gPT09IHVuZGVmaW5lZFxuICAgICAgICA/ICdubyBzdWNoIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGJ5IHRoZSB3b3JrZmxvdyBidW5kbGUnXG4gICAgICAgIDogYGV4cGVjdGVkIGEgZnVuY3Rpb24sIGJ1dCBnb3Q6ICcke3R5cGVvZiB3b3JrZmxvd0ZufSdgO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHdvcmtmbG93IG9mIHR5cGUgJyR7YWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlfSc6ICR7ZGV0YWlsc31gKTtcbiAgfVxufVxuXG4vKipcbiAqIE9iamVjdHMgdHJhbnNmZXJlZCB0byB0aGUgVk0gZnJvbSBvdXRzaWRlIGhhdmUgcHJvdG90eXBlcyBiZWxvbmdpbmcgdG8gdGhlXG4gKiBvdXRlciBjb250ZXh0LCB3aGljaCBtZWFucyB0aGF0IGluc3RhbmNlb2Ygd29uJ3Qgd29yayBpbnNpZGUgdGhlIFZNLiBUaGlzXG4gKiBmdW5jdGlvbiByZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdCwgYW5kIHJlY3JlYXRlIHNvbWVcbiAqIG9mIHRoZXNlIG9iamVjdHMgKG5vdGFibHkgQXJyYXksIERhdGUgYW5kIE9iamVjdHMpLlxuICovXG5mdW5jdGlvbiBmaXhQcm90b3R5cGVzPFg+KG9iajogWCk6IFgge1xuICBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopPy5jb25zdHJ1Y3Rvcj8ubmFtZSkge1xuICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSgob2JqIGFzIEFycmF5PHVua25vd24+KS5tYXAoZml4UHJvdG90eXBlcykpIGFzIFg7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iaiBhcyB1bmtub3duIGFzIERhdGUpIGFzIFg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pOiBbc3RyaW5nLCBhbnldID0+IFtrLCBmaXhQcm90b3R5cGVzKHYpXSkpIGFzIFg7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSB3b3JrZmxvdy4gT3IgdG8gYmUgZXhhY3QsIF9jb21wbGV0ZV8gaW5pdGlhbGl6YXRpb24sIGFzIG1vc3QgcGFydCBoYXMgYmVlbiBkb25lIGluIGNvbnN0cnVjdG9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoaW5pdGlhbGl6ZVdvcmtmbG93Sm9iOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICBnZXRBY3RpdmF0b3IoKS5pbml0aWFsaXplV29ya2Zsb3coaW5pdGlhbGl6ZVdvcmtmbG93Sm9iKTtcbn1cblxuLyoqXG4gKiBSdW4gYSBjaHVuayBvZiBhY3RpdmF0aW9uIGpvYnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjdGl2YXRlKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uLCBiYXRjaEluZGV4ID0gMCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2FjdGl2YXRlJywgKHsgYWN0aXZhdGlvbiB9KSA9PiB7XG4gICAgLy8gQ2FzdCBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIHdoaWNoIGhhcyB0aGUgYHZhcmlhbnRgIGF0dHJpYnV0ZS5cbiAgICAvLyBUaGlzIGlzIHNhZmUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgYWN0aXZhdGlvbiBpcyBhIHByb3RvIGNsYXNzLlxuICAgIGNvbnN0IGpvYnMgPSBhY3RpdmF0aW9uLmpvYnMgYXMgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLldvcmtmbG93QWN0aXZhdGlvbkpvYltdO1xuXG4gICAgLy8gSW5pdGlhbGl6YXRpb24gd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LCBidXQgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBzdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICBjb25zdCBzdGFydFdvcmtmbG93Sm9iID0gam9ic1swXS52YXJpYW50ID09PSAnaW5pdGlhbGl6ZVdvcmtmbG93JyA/IGpvYnMuc2hpZnQoKT8uaW5pdGlhbGl6ZVdvcmtmbG93IDogdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgaWYgKGpvYi52YXJpYW50ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGpvYi52YXJpYW50IHRvIGJlIGRlZmluZWQnKTtcblxuICAgICAgY29uc3QgdmFyaWFudCA9IGpvYltqb2IudmFyaWFudF07XG4gICAgICBpZiAoIXZhcmlhbnQpIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGpvYi4ke2pvYi52YXJpYW50fSB0byBiZSBzZXRgKTtcblxuICAgICAgYWN0aXZhdG9yW2pvYi52YXJpYW50XSh2YXJpYW50IGFzIGFueSAvKiBUUyBjYW4ndCBpbmZlciB0aGlzIHR5cGUgKi8pO1xuXG4gICAgICBpZiAoam9iLnZhcmlhbnQgIT09ICdxdWVyeVdvcmtmbG93JykgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRXb3JrZmxvd0pvYikge1xuICAgICAgY29uc3Qgc2FmZUpvYlR5cGVzOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iWyd2YXJpYW50J11bXSA9IFtcbiAgICAgICAgJ2luaXRpYWxpemVXb3JrZmxvdycsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgICdkb1VwZGF0ZScsXG4gICAgICAgICdjYW5jZWxXb3JrZmxvdycsXG4gICAgICAgICd1cGRhdGVSYW5kb21TZWVkJyxcbiAgICAgIF07XG4gICAgICBpZiAoam9icy5zb21lKChqb2IpID0+ICFzYWZlSm9iVHlwZXMuaW5jbHVkZXMoam9iLnZhcmlhbnQpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdSZWNlaXZlZCBib3RoIGluaXRpYWxpemVXb3JrZmxvdyBhbmQgbm9uLXNpZ25hbC9ub24tdXBkYXRlIGpvYnMgaW4gdGhlIHNhbWUgYWN0aXZhdGlvbjogJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShqb2JzLm1hcCgoam9iKSA9PiBqb2IudmFyaWFudCkpXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2YXRvci5zdGFydFdvcmtmbG93KHN0YXJ0V29ya2Zsb3dKb2IpO1xuICAgICAgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICB9XG4gIH0pO1xuICBpbnRlcmNlcHQoeyBhY3RpdmF0aW9uLCBiYXRjaEluZGV4IH0pO1xufVxuXG4vKipcbiAqIENvbmNsdWRlIGEgc2luZ2xlIGFjdGl2YXRpb24uXG4gKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGFjdGl2YXRpb24gam9icyBhbmQgcXVldWVkIG1pY3JvdGFza3MuXG4gKlxuICogQWN0aXZhdGlvbiBmYWlsdXJlcyBhcmUgaGFuZGxlZCBpbiB0aGUgbWFpbiBOb2RlLmpzIGlzb2xhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jbHVkZUFjdGl2YXRpb24oKTogY29yZXNkay53b3JrZmxvd19jb21wbGV0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Db21wbGV0aW9uIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZWplY3RCdWZmZXJlZFVwZGF0ZXMoKTtcbiAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2NvbmNsdWRlQWN0aXZhdGlvbicsIChpbnB1dCkgPT4gaW5wdXQpO1xuICBjb25zdCBhY3RpdmF0aW9uQ29tcGxldGlvbiA9IGFjdGl2YXRvci5jb25jbHVkZUFjdGl2YXRpb24oKTtcbiAgY29uc3QgeyBjb21tYW5kcyB9ID0gaW50ZXJjZXB0KHsgY29tbWFuZHM6IGFjdGl2YXRpb25Db21wbGV0aW9uLmNvbW1hbmRzIH0pO1xuICBpZiAoYWN0aXZhdG9yLmNvbXBsZXRlZCkge1xuICAgIGFjdGl2YXRvci53YXJuSWZVbmZpbmlzaGVkSGFuZGxlcnMoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcnVuSWQ6IGFjdGl2YXRvci5pbmZvLnJ1bklkLFxuICAgIHN1Y2Nlc3NmdWw6IHsgLi4uYWN0aXZhdGlvbkNvbXBsZXRpb24sIGNvbW1hbmRzIH0sXG4gIH07XG59XG5cbi8qKlxuICogTG9vcCB0aHJvdWdoIGFsbCBibG9ja2VkIGNvbmRpdGlvbnMsIGV2YWx1YXRlIGFuZCB1bmJsb2NrIGlmIHBvc3NpYmxlLlxuICpcbiAqIEByZXR1cm5zIG51bWJlciBvZiB1bmJsb2NrZWQgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyeVVuYmxvY2tDb25kaXRpb25zKCk6IG51bWJlciB7XG4gIGxldCBudW1VbmJsb2NrZWQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgcHJldlVuYmxvY2tlZCA9IG51bVVuYmxvY2tlZDtcbiAgICBmb3IgKGNvbnN0IFtzZXEsIGNvbmRdIG9mIGdldEFjdGl2YXRvcigpLmJsb2NrZWRDb25kaXRpb25zLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNvbmQuZm4oKSkge1xuICAgICAgICBjb25kLnJlc29sdmUoKTtcbiAgICAgICAgbnVtVW5ibG9ja2VkKys7XG4gICAgICAgIC8vIEl0IGlzIHNhZmUgdG8gZGVsZXRlIGVsZW1lbnRzIGR1cmluZyBtYXAgaXRlcmF0aW9uXG4gICAgICAgIGdldEFjdGl2YXRvcigpLmJsb2NrZWRDb25kaXRpb25zLmRlbGV0ZShzZXEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJldlVuYmxvY2tlZCA9PT0gbnVtVW5ibG9ja2VkKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bVVuYmxvY2tlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gIGNvbnN0IGRpc3Bvc2UgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGdldEFjdGl2YXRvcigpLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdkaXNwb3NlJywgYXN5bmMgKCkgPT4ge1xuICAgIGRpc2FibGVTdG9yYWdlKCk7XG4gICAgZGlzYWJsZVVwZGF0ZVN0b3JhZ2UoKTtcbiAgfSk7XG4gIGRpc3Bvc2Uoe30pO1xufVxuIiwiaW1wb3J0IHtcbiAgQWN0aXZpdHlGdW5jdGlvbixcbiAgQWN0aXZpdHlPcHRpb25zLFxuICBjb21waWxlUmV0cnlQb2xpY3ksXG4gIGVuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBleHRyYWN0V29ya2Zsb3dUeXBlLFxuICBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSxcbiAgTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gIG1hcFRvUGF5bG9hZHMsXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgU2VhcmNoQXR0cmlidXRlcyxcbiAgU2lnbmFsRGVmaW5pdGlvbixcbiAgdG9QYXlsb2FkcyxcbiAgVW50eXBlZEFjdGl2aXRpZXMsXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFdpdGhXb3JrZmxvd0FyZ3MsXG4gIFdvcmtmbG93LFxuICBXb3JrZmxvd1Jlc3VsdFR5cGUsXG4gIFdvcmtmbG93UmV0dXJuVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgdmVyc2lvbmluZ0ludGVudFRvUHJvdG8gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3ZlcnNpb25pbmctaW50ZW50LWVudW0nO1xuaW1wb3J0IHsgRHVyYXRpb24sIG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIHJlcXVpcmVkVHNUb01zIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IENhbmNlbGxhdGlvblNjb3BlLCByZWdpc3RlclNsZWVwSW1wbGVtZW50YXRpb24gfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBVcGRhdGVTY29wZSB9IGZyb20gJy4vdXBkYXRlLXNjb3BlJztcbmltcG9ydCB7XG4gIEFjdGl2aXR5SW5wdXQsXG4gIExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgU2lnbmFsV29ya2Zsb3dJbnB1dCxcbiAgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gIFRpbWVySW5wdXQsXG59IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7XG4gIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICBDaGlsZFdvcmtmbG93T3B0aW9ucyxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsXG4gIENvbnRpbnVlQXNOZXcsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBIYW5kbGVyLFxuICBRdWVyeUhhbmRsZXJPcHRpb25zLFxuICBTaWduYWxIYW5kbGVyT3B0aW9ucyxcbiAgVXBkYXRlSGFuZGxlck9wdGlvbnMsXG4gIFdvcmtmbG93SW5mbyxcbiAgVXBkYXRlSW5mbyxcbiAgZW5jb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVBhcmVudENsb3NlUG9saWN5LFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTG9jYWxBY3Rpdml0eURvQmFja29mZiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LCBnZXRBY3RpdmF0b3IsIG1heWJlR2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgeyBDaGlsZFdvcmtmbG93SGFuZGxlLCBFeHRlcm5hbFdvcmtmbG93SGFuZGxlIH0gZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuXG4vLyBBdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3lcbnJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbihzbGVlcCk7XG5cbi8qKlxuICogQWRkcyBkZWZhdWx0IHZhbHVlcyBvZiBgd29ya2Zsb3dJZGAgYW5kIGBjYW5jZWxsYXRpb25UeXBlYCB0byBnaXZlbiB3b3JrZmxvdyBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9uczxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICBvcHRzOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMge1xuICBjb25zdCB7IGFyZ3MsIHdvcmtmbG93SWQsIC4uLnJlc3QgfSA9IG9wdHM7XG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogd29ya2Zsb3dJZCA/PyB1dWlkNCgpLFxuICAgIGFyZ3M6IChhcmdzID8/IFtdKSBhcyB1bmtub3duW10sXG4gICAgY2FuY2VsbGF0aW9uVHlwZTogQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVELFxuICAgIC4uLnJlc3QsXG4gIH07XG59XG5cbi8qKlxuICogUHVzaCBhIHN0YXJ0VGltZXIgY29tbWFuZCBpbnRvIHN0YXRlIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHRpbWVyTmV4dEhhbmRsZXIoaW5wdXQ6IFRpbWVySW5wdXQpIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5kZWxldGUoaW5wdXQuc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IHJlc29sdmVkIG9yIG5ldmVyIHNjaGVkdWxlZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgY2FuY2VsVGltZXI6IHtcbiAgICAgICAgICAgICAgc2VxOiBpbnB1dC5zZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgc2VxOiBpbnB1dC5zZXEsXG4gICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKGlucHV0LmR1cmF0aW9uTXMpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuc2V0KGlucHV0LnNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzIHNsZWVwLlxuICpcbiAqIFNjaGVkdWxlcyBhIHRpbWVyIG9uIHRoZSBUZW1wb3JhbCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ30uXG4gKiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciBvciAwLCB2YWx1ZSB3aWxsIGJlIHNldCB0byAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IER1cmF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5zbGVlcCguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbicpO1xuICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMudGltZXIrKztcblxuICBjb25zdCBkdXJhdGlvbk1zID0gTWF0aC5tYXgoMSwgbXNUb051bWJlcihtcykpO1xuXG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdzdGFydFRpbWVyJywgdGltZXJOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGR1cmF0aW9uTXMsXG4gICAgc2VxLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVpcmVkIGVpdGhlciBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0IG9yIHN0YXJ0VG9DbG9zZVRpbWVvdXQnKTtcbiAgfVxufVxuXG4vLyBVc2Ugc2FtZSB2YWxpZGF0aW9uIHdlIHVzZSBmb3Igbm9ybWFsIGFjdGl2aXRpZXNcbmNvbnN0IHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMgPSB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucztcblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gYWN0aXZhdG9yIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcih7IG9wdGlvbnMsIGFyZ3MsIGhlYWRlcnMsIHNlcSwgYWN0aXZpdHlUeXBlIH06IEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhY3Rpdml0eUlkOiBvcHRpb25zLmFjdGl2aXR5SWQgPz8gYCR7c2VxfWAsXG4gICAgICAgIGFjdGl2aXR5VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICBoZWFydGJlYXRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgICAgZG9Ob3RFYWdlcmx5RXhlY3V0ZTogIShvcHRpb25zLmFsbG93RWFnZXJEaXNwYXRjaCA/PyB0cnVlKSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFB1c2ggYSBzY2hlZHVsZUFjdGl2aXR5IGNvbW1hbmQgaW50byBzdGF0ZSBhY2N1bXVsYXRvciBhbmQgcmVnaXN0ZXIgY29tcGxldGlvblxuICovXG5hc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHlOZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGFyZ3MsXG4gIGhlYWRlcnMsXG4gIHNlcSxcbiAgYWN0aXZpdHlUeXBlLFxuICBhdHRlbXB0LFxuICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbn06IExvY2FsQWN0aXZpdHlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgLy8gRWFnZXJseSBmYWlsIHRoZSBsb2NhbCBhY3Rpdml0eSAod2hpY2ggd2lsbCBpbiB0dXJuIGZhaWwgdGhlIHdvcmtmbG93IHRhc2suXG4gIC8vIERvIG5vdCBmYWlsIG9uIHJlcGxheSB3aGVyZSB0aGUgbG9jYWwgYWN0aXZpdGllcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgb24gdGhlIHJlcGxheSB3b3JrZXIuXG4gIGlmICghYWN0aXZhdG9yLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmICFhY3RpdmF0b3IucmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMuaGFzKGFjdGl2aXR5VHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoYExvY2FsIGFjdGl2aXR5IG9mIHR5cGUgJyR7YWN0aXZpdHlUeXBlfScgbm90IHJlZ2lzdGVyZWQgb24gd29ya2VyYCk7XG4gIH1cbiAgdmFsaWRhdGVMb2NhbEFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxMb2NhbEFjdGl2aXR5OiB7XG4gICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2NoZWR1bGVMb2NhbEFjdGl2aXR5OiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG4gICAgICAgIC8vIEludGVudGlvbmFsbHkgbm90IGV4cG9zaW5nIGFjdGl2aXR5SWQgYXMgYW4gb3B0aW9uXG4gICAgICAgIGFjdGl2aXR5SWQ6IGAke3NlcX1gLFxuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4uYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBsb2NhbFJldHJ5VGhyZXNob2xkOiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmxvY2FsUmV0cnlUaHJlc2hvbGQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZUFjdGl2aXR5PFI+KGFjdGl2aXR5VHlwZTogc3RyaW5nLCBhcmdzOiBhbnlbXSwgb3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogUHJvbWlzZTxSPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zY2hlZHVsZUFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ3NjaGVkdWxlQWN0aXZpdHknLCBzY2hlZHVsZUFjdGl2aXR5TmV4dEhhbmRsZXIpO1xuXG4gIHJldHVybiBleGVjdXRlKHtcbiAgICBhY3Rpdml0eVR5cGUsXG4gICAgaGVhZGVyczoge30sXG4gICAgb3B0aW9ucyxcbiAgICBhcmdzLFxuICAgIHNlcSxcbiAgfSkgYXMgUHJvbWlzZTxSPjtcbn1cblxuLyoqXG4gKiBTY2hlZHVsZSBhbiBhY3Rpdml0eSBhbmQgcnVuIG91dGJvdW5kIGludGVyY2VwdG9yc1xuICogQGhpZGRlblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5PFI+KFxuICBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgYXJnczogYW55W10sXG4gIG9wdGlvbnM6IExvY2FsQWN0aXZpdHlPcHRpb25zXG4pOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlTG9jYWxBY3Rpdml0eSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbidcbiAgKTtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBlbXB0eSBhY3Rpdml0eSBvcHRpb25zJyk7XG4gIH1cblxuICBsZXQgYXR0ZW1wdCA9IDE7XG4gIGxldCBvcmlnaW5hbFNjaGVkdWxlVGltZSA9IHVuZGVmaW5lZDtcblxuICBmb3IgKDs7KSB7XG4gICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmFjdGl2aXR5Kys7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLFxuICAgICAgJ3NjaGVkdWxlTG9jYWxBY3Rpdml0eScsXG4gICAgICBzY2hlZHVsZUxvY2FsQWN0aXZpdHlOZXh0SGFuZGxlclxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCBleGVjdXRlKHtcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgYXJncyxcbiAgICAgICAgc2VxLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbiAgICAgIH0pKSBhcyBQcm9taXNlPFI+O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIExvY2FsQWN0aXZpdHlEb0JhY2tvZmYpIHtcbiAgICAgICAgYXdhaXQgc2xlZXAocmVxdWlyZWRUc1RvTXMoZXJyLmJhY2tvZmYuYmFja29mZkR1cmF0aW9uLCAnYmFja29mZkR1cmF0aW9uJykpO1xuICAgICAgICBpZiAodHlwZW9mIGVyci5iYWNrb2ZmLmF0dGVtcHQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBiYWNrb2ZmIGF0dGVtcHQgdHlwZScpO1xuICAgICAgICB9XG4gICAgICAgIGF0dGVtcHQgPSBlcnIuYmFja29mZi5hdHRlbXB0O1xuICAgICAgICBvcmlnaW5hbFNjaGVkdWxlVGltZSA9IGVyci5iYWNrb2ZmLm9yaWdpbmFsU2NoZWR1bGVUaW1lID8/IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBoZWFkZXJzLFxuICB3b3JrZmxvd1R5cGUsXG4gIHNlcSxcbn06IFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0KTogUHJvbWlzZTxbUHJvbWlzZTxzdHJpbmc+LCBQcm9taXNlPHVua25vd24+XT4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgY29uc3Qgd29ya2Zsb3dJZCA9IG9wdGlvbnMud29ya2Zsb3dJZCA/PyB1dWlkNCgpO1xuICBjb25zdCBzdGFydFByb21pc2UgPSBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gIWFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93Q29tcGxldGUuaGFzKHNlcSk7XG5cbiAgICAgICAgICBpZiAoIWNvbXBsZXRlKSB7XG4gICAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgICBjYW5jZWxDaGlsZFdvcmtmbG93RXhlY3V0aW9uOiB7IGNoaWxkV29ya2Zsb3dTZXE6IHNlcSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE5vdGhpbmcgdG8gY2FuY2VsIG90aGVyd2lzZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIHdvcmtmbG93SWQsXG4gICAgICAgIHdvcmtmbG93VHlwZSxcbiAgICAgICAgaW5wdXQ6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLm9wdGlvbnMuYXJncyksXG4gICAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5ID8gY29tcGlsZVJldHJ5UG9saWN5KG9wdGlvbnMucmV0cnkpIDogdW5kZWZpbmVkLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlIHx8IGFjdGl2YXRvci5pbmZvLnRhc2tRdWV1ZSxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93RXhlY3V0aW9uVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93UnVuVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy53b3JrZmxvd1J1blRpbWVvdXQpLFxuICAgICAgICB3b3JrZmxvd1Rhc2tUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93VGFza1RpbWVvdXQpLFxuICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSwgLy8gTm90IGNvbmZpZ3VyYWJsZVxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6IGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeShvcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeSksXG4gICAgICAgIHBhcmVudENsb3NlUG9saWN5OiBlbmNvZGVQYXJlbnRDbG9zZVBvbGljeShvcHRpb25zLnBhcmVudENsb3NlUG9saWN5KSxcbiAgICAgICAgY3JvblNjaGVkdWxlOiBvcHRpb25zLmNyb25TY2hlZHVsZSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogb3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzXG4gICAgICAgICAgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcylcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbyksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93U3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gV2UgY29uc3RydWN0IGEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNoaWxkIFdvcmtmbG93IGJlZm9yZSB3ZSBrbm93XG4gIC8vIGlmIHRoZSBXb3JrZmxvdyBjb2RlIHdpbGwgYXdhaXQgaXQgdG8gY2FwdHVyZSB0aGUgcmVzdWx0IGluIGNhc2UgaXQgZG9lcy5cbiAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIENoYWluIHN0YXJ0IFByb21pc2UgcmVqZWN0aW9uIHRvIHRoZSBjb21wbGV0ZSBQcm9taXNlLlxuICAgIHVudHJhY2tQcm9taXNlKHN0YXJ0UHJvbWlzZS5jYXRjaChyZWplY3QpKTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7IGNhbmNlbFNpZ25hbFdvcmtmbG93OiB7IHNlcSB9IH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNpZ25hbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhcmdzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgc2lnbmFsTmFtZSxcbiAgICAgICAgLi4uKHRhcmdldC50eXBlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgLi4udGFyZ2V0LndvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaGlsZFdvcmtmbG93SWQ6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGluIHRoZSByZXR1cm4gdHlwZSBvZiBwcm94eSBtZXRob2RzIHRvIG1hcmsgdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNvdXJjZSB0eXBlIGlzIG5vdCBhIG1ldGhvZC5cbiAqXG4gKiBAc2VlIHtAbGluayBBY3Rpdml0eUludGVyZmFjZUZvcn1cbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc31cbiAqIEBzZWUge0BsaW5rIHByb3h5TG9jYWxBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgY29uc3QgTm90QW5BY3Rpdml0eU1ldGhvZCA9IFN5bWJvbC5mb3IoJ19fVEVNUE9SQUxfTk9UX0FOX0FDVElWSVRZX01FVEhPRCcpO1xuXG4vKipcbiAqIFR5cGUgaGVscGVyIHRoYXQgdGFrZXMgYSB0eXBlIGBUYCBhbmQgdHJhbnNmb3JtcyBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCB7QGxpbmsgQWN0aXZpdHlGdW5jdGlvbn0gdG9cbiAqIHtAbGluayBOb3RBbkFjdGl2aXR5TWV0aG9kfS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIFVzZWQgYnkge0BsaW5rIHByb3h5QWN0aXZpdGllc30gdG8gZ2V0IHRoaXMgY29tcGlsZS10aW1lIGVycm9yOlxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcmZhY2UgTXlBY3Rpdml0aWVzIHtcbiAqICAgdmFsaWQoaW5wdXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbiAqICAgaW52YWxpZChpbnB1dDogbnVtYmVyKTogbnVtYmVyO1xuICogfVxuICpcbiAqIGNvbnN0IGFjdCA9IHByb3h5QWN0aXZpdGllczxNeUFjdGl2aXRpZXM+KHsgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyB9KTtcbiAqXG4gKiBhd2FpdCBhY3QudmFsaWQodHJ1ZSk7XG4gKiBhd2FpdCBhY3QuaW52YWxpZCgpO1xuICogLy8gXiBUUyBjb21wbGFpbnMgd2l0aDpcbiAqIC8vIChwcm9wZXJ0eSkgaW52YWxpZERlZmluaXRpb246IHR5cGVvZiBOb3RBbkFjdGl2aXR5TWV0aG9kXG4gKiAvLyBUaGlzIGV4cHJlc3Npb24gaXMgbm90IGNhbGxhYmxlLlxuICogLy8gVHlwZSAnU3ltYm9sJyBoYXMgbm8gY2FsbCBzaWduYXR1cmVzLigyMzQ5KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5SW50ZXJmYWNlRm9yPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24gPyBUW0tdIDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSBBY3Rpdml0eSBmdW5jdGlvbnMgd2l0aCBnaXZlbiB7QGxpbmsgQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9IGZvclxuICogICAgICAgICB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eUFjdGl2aXRpZXMgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKiBpbXBvcnQgKiBhcyBhY3Rpdml0aWVzIGZyb20gJy4uL2FjdGl2aXRpZXMnO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBtb2R1bGUgZXhwb3J0c1xuICogY29uc3QgeyBodHRwR2V0LCBvdGhlckFjdGl2aXR5IH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzMwIG1pbnV0ZXMnLFxuICogfSk7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIGFuIGV4cGxpY2l0IGludGVyZmFjZSAoZS5nLiB3aGVuIGRlZmluZWQgYnkgYW5vdGhlciBTREspXG4gKiBpbnRlcmZhY2UgSmF2YUFjdGl2aXRpZXMge1xuICogICBodHRwR2V0RnJvbUphdmEodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz5cbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5KGFyZzE6IG51bWJlciwgYXJnMjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICogfVxuICpcbiAqIGNvbnN0IHtcbiAqICAgaHR0cEdldEZyb21KYXZhLFxuICogICBzb21lT3RoZXJKYXZhQWN0aXZpdHlcbiAqIH0gPSBwcm94eUFjdGl2aXRpZXM8SmF2YUFjdGl2aXRpZXM+KHtcbiAqICAgdGFza1F1ZXVlOiAnamF2YS13b3JrZXItdGFza1F1ZXVlJyxcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyxcbiAqIH0pO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICogICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh0dHBHZXQoXCJodHRwOi8vZXhhbXBsZS5jb21cIik7XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUFjdGl2aXRpZXM8QSA9IFVudHlwZWRBY3Rpdml0aWVzPihvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBQcm94eShcbiAgICB7fSxcbiAgICB7XG4gICAgICBnZXQoXywgYWN0aXZpdHlUeXBlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aXZpdHlUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBhY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgICAgcmV0dXJuIHNjaGVkdWxlQWN0aXZpdHkoYWN0aXZpdHlUeXBlLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfVxuICApIGFzIGFueTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmUgTG9jYWwgQWN0aXZpdHkgZnVuY3Rpb25zIHdpdGggZ2l2ZW4ge0BsaW5rIExvY2FsQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9XG4gKiAgICAgICAgIGZvciB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQHNlZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSBmb3IgZXhhbXBsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5TG9jYWxBY3Rpdml0aWVzPEEgPSBVbnR5cGVkQWN0aXZpdGllcz4ob3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIHt9LFxuICAgIHtcbiAgICAgIGdldChfLCBhY3Rpdml0eVR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIEFjdGl2aXR5IHR5cGVzLCBnb3Q6ICR7U3RyaW5nKGFjdGl2aXR5VHlwZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlLCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfVxuICApIGFzIGFueTtcbn1cblxuLy8gVE9ETzogZGVwcmVjYXRlIHRoaXMgcGF0Y2ggYWZ0ZXIgXCJlbm91Z2hcIiB0aW1lIGhhcyBwYXNzZWRcbmNvbnN0IEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCA9ICdfX3RlbXBvcmFsX2ludGVybmFsX2Nvbm5lY3RfZXh0ZXJuYWxfaGFuZGxlX2NhbmNlbF90b19zY29wZSc7XG4vLyBUaGUgbmFtZSBvZiB0aGlzIHBhdGNoIGNvbWVzIGZyb20gYW4gYXR0ZW1wdCB0byBidWlsZCBhIGdlbmVyaWMgaW50ZXJuYWwgcGF0Y2hpbmcgbWVjaGFuaXNtLlxuLy8gVGhhdCBlZmZvcnQgaGFzIGJlZW4gYWJhbmRvbmVkIGluIGZhdm9yIG9mIGEgbmV3ZXIgV29ya2Zsb3dUYXNrQ29tcGxldGVkTWV0YWRhdGEgYmFzZWQgbWVjaGFuaXNtLlxuY29uc3QgQ09ORElUSU9OXzBfUEFUQ0ggPSAnX19zZGtfaW50ZXJuYWxfcGF0Y2hfbnVtYmVyOjEnO1xuXG4vKipcbiAqIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBzaWduYWwgYW5kIGNhbmNlbCBhbiBleGlzdGluZyBXb3JrZmxvdyBleGVjdXRpb24uXG4gKiBJdCB0YWtlcyBhIFdvcmtmbG93IElEIGFuZCBvcHRpb25hbCBydW4gSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHRlcm5hbFdvcmtmbG93SGFuZGxlKHdvcmtmbG93SWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiBFeHRlcm5hbFdvcmtmbG93SGFuZGxlIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LmdldEV4dGVybmFsV29ya2Zsb3dIYW5kbGUoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5nZXRIYW5kbGUoLi4uKSBpbnN0ZWFkLiknXG4gICk7XG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZCxcbiAgICBydW5JZCxcbiAgICBjYW5jZWwoKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBDb25uZWN0IHRoaXMgY2FuY2VsIG9wZXJhdGlvbiB0byB0aGUgY3VycmVudCBjYW5jZWxsYXRpb24gc2NvcGUuXG4gICAgICAgIC8vIFRoaXMgaXMgYmVoYXZpb3Igd2FzIGludHJvZHVjZWQgYWZ0ZXIgdjAuMjIuMCBhbmQgaXMgaW5jb21wYXRpYmxlXG4gICAgICAgIC8vIHdpdGggaGlzdG9yaWVzIGdlbmVyYXRlZCB3aXRoIHByZXZpb3VzIFNESyB2ZXJzaW9ucyBhbmQgdGh1cyByZXF1aXJlc1xuICAgICAgICAvLyBwYXRjaGluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgdHJ5IHRvIGRlbGF5IHBhdGNoaW5nIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gYXZvaWQgcG9sbHV0aW5nXG4gICAgICAgIC8vIGhpc3RvcmllcyB1bmxlc3Mgc3RyaWN0bHkgcmVxdWlyZWQuXG4gICAgICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChwYXRjaGVkKEVYVEVSTkFMX1dGX0NBTkNFTF9QQVRDSCkpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgaWYgKHBhdGNoZWQoRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jYW5jZWxXb3JrZmxvdysrO1xuICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgIHJlcXVlc3RDYW5jZWxFeHRlcm5hbFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dJZCxcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2FuY2VsV29ya2Zsb3cuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnZXh0ZXJuYWwnLFxuICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7IHdvcmtmbG93SWQsIHJ1bklkIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIEJ5IGRlZmF1bHQsIGEgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzICgpID0+IFByb21pc2U8YW55Pj4od29ya2Zsb3dUeXBlOiBzdHJpbmcpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGVPckZ1bmM6IHN0cmluZyB8IFQsXG4gIG9wdGlvbnM/OiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zdGFydENoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuc3RhcnQoLi4uKSBpbnN0ZWFkLiknXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgW3N0YXJ0ZWQsIGNvbXBsZXRlZF0gPSBhd2FpdCBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICBjb25zdCBmaXJzdEV4ZWN1dGlvblJ1bklkID0gYXdhaXQgc3RhcnRlZDtcblxuICByZXR1cm4ge1xuICAgIHdvcmtmbG93SWQ6IG9wdGlvbnNXaXRoRGVmYXVsdHMud29ya2Zsb3dJZCxcbiAgICBmaXJzdEV4ZWN1dGlvblJ1bklkLFxuICAgIGFzeW5jIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICAgICAgcmV0dXJuIChhd2FpdCBjb21wbGV0ZWQpIGFzIGFueTtcbiAgICB9LFxuICAgIGFzeW5jIHNpZ25hbDxBcmdzIGV4dGVuZHMgYW55W10+KGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IHN0cmluZywgLi4uYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAgICdzaWduYWxXb3JrZmxvdycsXG4gICAgICAgIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXJcbiAgICAgICkoe1xuICAgICAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5zaWduYWxXb3JrZmxvdysrLFxuICAgICAgICBzaWduYWxOYW1lOiB0eXBlb2YgZGVmID09PSAnc3RyaW5nJyA/IGRlZiA6IGRlZi5uYW1lLFxuICAgICAgICBhcmdzLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICB0eXBlOiAnY2hpbGQnLFxuICAgICAgICAgIGNoaWxkV29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb24gYW5kIGF3YWl0IGl0cyBjb21wbGV0aW9uLlxuICpcbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93RnVuYzogVCxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPihcbiAgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogKipPdmVycmlkZSBmb3IgV29ya2Zsb3dzIHRoYXQgYWNjZXB0IG5vIGFyZ3VtZW50cyoqLlxuICpcbiAqIC0gVGhlIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzICgpID0+IFdvcmtmbG93UmV0dXJuVHlwZT4od29ya2Zsb3dGdW5jOiBUKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZXhlY3V0ZUNoaWxkKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLiBDb25zaWRlciB1c2luZyBDbGllbnQud29ya2Zsb3cuZXhlY3V0ZSguLi4pIGluc3RlYWQuJ1xuICApO1xuICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0gYWRkRGVmYXVsdFdvcmtmbG93T3B0aW9ucyhvcHRpb25zID8/ICh7fSBhcyBhbnkpKTtcbiAgY29uc3Qgd29ya2Zsb3dUeXBlID0gZXh0cmFjdFdvcmtmbG93VHlwZSh3b3JrZmxvd1R5cGVPckZ1bmMpO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLFxuICAgICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nLFxuICAgIHN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbk5leHRIYW5kbGVyXG4gICk7XG4gIGNvbnN0IGV4ZWNQcm9taXNlID0gZXhlY3V0ZSh7XG4gICAgc2VxOiBhY3RpdmF0b3IubmV4dFNlcXMuY2hpbGRXb3JrZmxvdysrLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgaGVhZGVyczoge30sXG4gICAgd29ya2Zsb3dUeXBlLFxuICB9KTtcbiAgdW50cmFja1Byb21pc2UoZXhlY1Byb21pc2UpO1xuICBjb25zdCBjb21wbGV0ZWRQcm9taXNlID0gZXhlY1Byb21pc2UudGhlbigoW19zdGFydGVkLCBjb21wbGV0ZWRdKSA9PiBjb21wbGV0ZWQpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZWRQcm9taXNlKTtcbiAgcmV0dXJuIGNvbXBsZXRlZFByb21pc2UgYXMgUHJvbWlzZTxhbnk+O1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdy5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmcm96ZW4gY29weSBvZiBXb3JrZmxvd0luZm8sIGF0IHRoZSBwb2ludCB3aGVyZSB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gKiBDaGFuZ2VzIGhhcHBlbmluZyBhdCBsYXRlciBwb2ludCBpbiB3b3JrZmxvdyBleGVjdXRpb24gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZSByZXR1cm5lZCBvYmplY3QuXG4gKlxuICogRm9yIHRoaXMgcmVhc29uLCB3ZSByZWNvbW1lbmQgY2FsbGluZyBgd29ya2Zsb3dJbmZvKClgIG9uIGV2ZXJ5IGFjY2VzcyB0byB7QGxpbmsgV29ya2Zsb3dJbmZvfSdzIGZpZWxkcyxcbiAqIHJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIGBXb3JrZmxvd0luZm9gIG9iamVjdCAob3IgcGFydCBvZiBpdCkgaW4gYSBsb2NhbCB2YXJpYWJsZS4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIC8vIEdPT0RcbiAqIGZ1bmN0aW9uIG15V29ya2Zsb3coKSB7XG4gKiAgIGRvU29tZXRoaW5nKHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXMpXG4gKiAgIC4uLlxuICogICBkb1NvbWV0aGluZ0Vsc2Uod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHZzXG4gKlxuICogYGBgdHNcbiAqIC8vIEJBRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgY29uc3QgYXR0cmlidXRlcyA9IHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXNcbiAqICAgZG9Tb21ldGhpbmcoYXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZShhdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0luZm8oKTogV29ya2Zsb3dJbmZvIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LndvcmtmbG93SW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5pbmZvO1xufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCB1cGRhdGUgaWYgYW55LlxuICpcbiAqIEByZXR1cm4gSW5mbyBmb3IgdGhlIGN1cnJlbnQgdXBkYXRlIGhhbmRsZXIgdGhlIGNvZGUgY2FsbGluZyB0aGlzIGlzIGV4ZWN1dGluZ1xuICogd2l0aGluIGlmIGFueS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRVcGRhdGVJbmZvKCk6IFVwZGF0ZUluZm8gfCB1bmRlZmluZWQge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY3VycmVudFVwZGF0ZUluZm8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBVcGRhdGVTY29wZS5jdXJyZW50KCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBjb2RlIGlzIGV4ZWN1dGluZyBpbiB3b3JrZmxvdyBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbldvcmtmbG93Q29udGV4dCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIG1heWJlR2V0QWN0aXZhdG9yKCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gYGZgIHRoYXQgd2lsbCBjYXVzZSB0aGUgY3VycmVudCBXb3JrZmxvdyB0byBDb250aW51ZUFzTmV3IHdoZW4gY2FsbGVkLlxuICpcbiAqIGBmYCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIFdvcmtmbG93IGZ1bmN0aW9uIHN1cHBsaWVkIHRvIHR5cGVwYXJhbSBgRmAuXG4gKlxuICogT25jZSBgZmAgaXMgY2FsbGVkLCBXb3JrZmxvdyBFeGVjdXRpb24gaW1tZWRpYXRlbHkgY29tcGxldGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEYgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdGlvbnM/OiBDb250aW51ZUFzTmV3T3B0aW9uc1xuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pID0+IFByb21pc2U8bmV2ZXI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LmNvbnRpbnVlQXNOZXcoLi4uKSBhbmQgV29ya2Zsb3cubWFrZUNvbnRpbnVlQXNOZXdGdW5jKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICBjb25zdCB7IHdvcmtmbG93VHlwZSwgdGFza1F1ZXVlLCAuLi5yZXN0IH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCByZXF1aXJlZE9wdGlvbnMgPSB7XG4gICAgd29ya2Zsb3dUeXBlOiB3b3JrZmxvd1R5cGUgPz8gaW5mby53b3JrZmxvd1R5cGUsXG4gICAgdGFza1F1ZXVlOiB0YXNrUXVldWUgPz8gaW5mby50YXNrUXVldWUsXG4gICAgLi4ucmVzdCxcbiAgfTtcblxuICByZXR1cm4gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pOiBQcm9taXNlPG5ldmVyPiA9PiB7XG4gICAgY29uc3QgZm4gPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdjb250aW51ZUFzTmV3JywgYXN5bmMgKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB7IGhlYWRlcnMsIGFyZ3MsIG9wdGlvbnMgfSA9IGlucHV0O1xuICAgICAgdGhyb3cgbmV3IENvbnRpbnVlQXNOZXcoe1xuICAgICAgICB3b3JrZmxvd1R5cGU6IG9wdGlvbnMud29ya2Zsb3dUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLmFyZ3MpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0YXNrUXVldWU6IG9wdGlvbnMudGFza1F1ZXVlLFxuICAgICAgICBtZW1vOiBvcHRpb25zLm1lbW8gJiYgbWFwVG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5tZW1vKSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogb3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzXG4gICAgICAgICAgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcylcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZm4oe1xuICAgICAgYXJncyxcbiAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgb3B0aW9uczogcmVxdWlyZWRPcHRpb25zLFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1jb250aW51ZS1hcy1uZXcvIHwgQ29udGludWVzLUFzLU5ld30gdGhlIGN1cnJlbnQgV29ya2Zsb3cgRXhlY3V0aW9uXG4gKiB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAqXG4gKiBTaG9ydGhhbmQgZm9yIGBtYWtlQ29udGludWVBc05ld0Z1bmM8Rj4oKSguLi5hcmdzKWAuIChTZWU6IHtAbGluayBtYWtlQ29udGludWVBc05ld0Z1bmN9LilcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqYGBgdHNcbiAqaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqXG4gKmV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogIC8vIC4uLiBXb3JrZmxvdyBsb2dpY1xuICogIGF3YWl0IGNvbnRpbnVlQXNOZXc8dHlwZW9mIG15V29ya2Zsb3c+KG4gKyAxKTtcbiAqfVxuICpgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRpbnVlQXNOZXc8RiBleHRlbmRzIFdvcmtmbG93PiguLi5hcmdzOiBQYXJhbWV0ZXJzPEY+KTogUHJvbWlzZTxuZXZlcj4ge1xuICByZXR1cm4gbWFrZUNvbnRpbnVlQXNOZXdGdW5jKCkoLi4uYXJncyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYW4gUkZDIGNvbXBsaWFudCBWNCB1dWlkLlxuICogVXNlcyB0aGUgd29ya2Zsb3cncyBkZXRlcm1pbmlzdGljIFBSTkcgbWFraW5nIGl0IHNhZmUgZm9yIHVzZSB3aXRoaW4gYSB3b3JrZmxvdy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY3J5cHRvZ3JhcGhpY2FsbHkgaW5zZWN1cmUuXG4gKiBTZWUgdGhlIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZCB8IHN0YWNrb3ZlcmZsb3cgZGlzY3Vzc2lvbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNCgpOiBzdHJpbmcge1xuICAvLyBSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgbnVtYmVyIGBuYCwgcGFkZGVkIHdpdGggemVyb2VzIHRvIGJlIG9mIGxlbmd0aCBgcGBcbiAgY29uc3QgaG8gPSAobjogbnVtYmVyLCBwOiBudW1iZXIpID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KHAsICcwJyk7XG4gIC8vIENyZWF0ZSBhIHZpZXcgYmFja2VkIGJ5IGEgMTYtYnl0ZSBidWZmZXJcbiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMTYpKTtcbiAgLy8gRmlsbCBidWZmZXIgd2l0aCByYW5kb20gdmFsdWVzXG4gIHZpZXcuc2V0VWludDMyKDAsIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoNCwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQzMig4LCAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDEyLCAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIC8vIFBhdGNoIHRoZSA2dGggYnl0ZSB0byByZWZsZWN0IGEgdmVyc2lvbiA0IFVVSURcbiAgdmlldy5zZXRVaW50OCg2LCAodmlldy5nZXRVaW50OCg2KSAmIDB4ZikgfCAweDQwKTtcbiAgLy8gUGF0Y2ggdGhlIDh0aCBieXRlIHRvIHJlZmxlY3QgYSB2YXJpYW50IDEgVVVJRCAodmVyc2lvbiA0IFVVSURzIGFyZSlcbiAgdmlldy5zZXRVaW50OCg4LCAodmlldy5nZXRVaW50OCg4KSAmIDB4M2YpIHwgMHg4MCk7XG4gIC8vIENvbXBpbGUgdGhlIGNhbm9uaWNhbCB0ZXh0dWFsIGZvcm0gZnJvbSB0aGUgYXJyYXkgZGF0YVxuICByZXR1cm4gYCR7aG8odmlldy5nZXRVaW50MzIoMCksIDgpfS0ke2hvKHZpZXcuZ2V0VWludDE2KDQpLCA0KX0tJHtobyh2aWV3LmdldFVpbnQxNig2KSwgNCl9LSR7aG8oXG4gICAgdmlldy5nZXRVaW50MTYoOCksXG4gICAgNFxuICApfS0ke2hvKHZpZXcuZ2V0VWludDMyKDEwKSwgOCl9JHtobyh2aWV3LmdldFVpbnQxNigxNCksIDQpfWA7XG59XG5cbi8qKlxuICogUGF0Y2ggb3IgdXBncmFkZSB3b3JrZmxvdyBjb2RlIGJ5IGNoZWNraW5nIG9yIHN0YXRpbmcgdGhhdCB0aGlzIHdvcmtmbG93IGhhcyBhIGNlcnRhaW4gcGF0Y2guXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBJZiB0aGUgd29ya2Zsb3cgaXMgcmVwbGF5aW5nIGFuIGV4aXN0aW5nIGhpc3RvcnksIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhhdFxuICogaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgd2hpY2ggYWxzbyBoYWQgYSBgcGF0Y2hlZGAgY2FsbCB3aXRoIHRoZSBzYW1lIGBwYXRjaElkYC5cbiAqIElmIHRoZSBoaXN0b3J5IHdhcyBwcm9kdWNlZCBieSBhIHdvcmtlciAqd2l0aG91dCogc3VjaCBhIGNhbGwsIHRoZW4gaXQgd2lsbCByZXR1cm4gZmFsc2UuXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIG5vdCBjdXJyZW50bHkgcmVwbGF5aW5nLCB0aGVuIHRoaXMgY2FsbCAqYWx3YXlzKiByZXR1cm5zIHRydWUuXG4gKlxuICogWW91ciB3b3JrZmxvdyBjb2RlIHNob3VsZCBydW4gdGhlIFwibmV3XCIgY29kZSBpZiB0aGlzIHJldHVybnMgdHJ1ZSwgaWYgaXQgcmV0dXJucyBmYWxzZSwgeW91XG4gKiBzaG91bGQgcnVuIHRoZSBcIm9sZFwiIGNvZGUuIEJ5IGRvaW5nIHRoaXMsIHlvdSBjYW4gbWFpbnRhaW4gZGV0ZXJtaW5pc20uXG4gKlxuICogQHBhcmFtIHBhdGNoSWQgQW4gaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZSB1bmlxdWUgdG8gdGhpcyBwYXRjaC4gSXQgaXMgT0sgdG8gdXNlIG11bHRpcGxlXG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIElELCB3aGljaCBtZWFucyBhbGwgc3VjaCBjYWxscyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaGVkKHBhdGNoSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cucGF0Y2goLi4uKSBhbmQgV29ya2Zsb3cuZGVwcmVjYXRlUGF0Y2ggbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5wYXRjaEludGVybmFsKHBhdGNoSWQsIGZhbHNlKTtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZSB0aGF0IGEgcGF0Y2ggaXMgYmVpbmcgcGhhc2VkIG91dC5cbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L3ZlcnNpb25pbmcgfCBkb2NzIHBhZ2V9IGZvciBpbmZvLlxuICpcbiAqIFdvcmtmbG93cyB3aXRoIHRoaXMgY2FsbCBtYXkgYmUgZGVwbG95ZWQgYWxvbmdzaWRlIHdvcmtmbG93cyB3aXRoIGEge0BsaW5rIHBhdGNoZWR9IGNhbGwsIGJ1dFxuICogdGhleSBtdXN0ICpub3QqIGJlIGRlcGxveWVkIHdoaWxlIGFueSB3b3JrZXJzIHN0aWxsIGV4aXN0IHJ1bm5pbmcgb2xkIGNvZGUgd2l0aG91dCBhXG4gKiB7QGxpbmsgcGF0Y2hlZH0gY2FsbCwgb3IgYW55IHJ1bnMgd2l0aCBoaXN0b3JpZXMgcHJvZHVjZWQgYnkgc3VjaCB3b3JrZXJzIGV4aXN0LiBJZiBlaXRoZXIga2luZFxuICogb2Ygd29ya2VyIGVuY291bnRlcnMgYSBoaXN0b3J5IHByb2R1Y2VkIGJ5IHRoZSBvdGhlciwgdGhlaXIgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLlxuICpcbiAqIE9uY2UgYWxsIGxpdmUgd29ya2Zsb3cgcnVucyBoYXZlIGJlZW4gcHJvZHVjZWQgYnkgd29ya2VycyB3aXRoIHRoaXMgY2FsbCwgeW91IGNhbiBkZXBsb3kgd29ya2Vyc1xuICogd2hpY2ggYXJlIGZyZWUgb2YgZWl0aGVyIGtpbmQgb2YgcGF0Y2ggY2FsbCBmb3IgdGhpcyBJRC4gV29ya2VycyB3aXRoIGFuZCB3aXRob3V0IHRoaXMgY2FsbFxuICogbWF5IGNvZXhpc3QsIGFzIGxvbmcgYXMgdGhleSBhcmUgYm90aCBydW5uaW5nIHRoZSBcIm5ld1wiIGNvZGUuXG4gKlxuICogQHBhcmFtIHBhdGNoSWQgQW4gaWRlbnRpZmllciB0aGF0IHNob3VsZCBiZSB1bmlxdWUgdG8gdGhpcyBwYXRjaC4gSXQgaXMgT0sgdG8gdXNlIG11bHRpcGxlXG4gKiBjYWxscyB3aXRoIHRoZSBzYW1lIElELCB3aGljaCBtZWFucyBhbGwgc3VjaCBjYWxscyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGVQYXRjaChwYXRjaElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGFjdGl2YXRvci5wYXRjaEludGVybmFsKHBhdGNoSWQsIHRydWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBgZm5gIGV2YWx1YXRlcyB0byBgdHJ1ZWAgb3IgYHRpbWVvdXRgIGV4cGlyZXMuXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICpcbiAqIEByZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbmRpdGlvbiB3YXMgdHJ1ZSBiZWZvcmUgdGhlIHRpbWVvdXQgZXhwaXJlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuLCB0aW1lb3V0OiBEdXJhdGlvbik6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ/OiBEdXJhdGlvbik6IFByb21pc2U8dm9pZCB8IGJvb2xlYW4+IHtcbiAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmNvbmRpdGlvbiguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgLy8gUHJpb3IgdG8gMS41LjAsIGBjb25kaXRpb24oZm4sIDApYCB3YXMgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvIGBjb25kaXRpb24oZm4sIHVuZGVmaW5lZClgXG4gIGlmICh0aW1lb3V0ID09PSAwICYmICFwYXRjaGVkKENPTkRJVElPTl8wX1BBVENIKSkge1xuICAgIHJldHVybiBjb25kaXRpb25Jbm5lcihmbik7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aW1lb3V0ID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdGltZW91dCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gQ2FuY2VsbGF0aW9uU2NvcGUuY2FuY2VsbGFibGUoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbc2xlZXAodGltZW91dCkudGhlbigoKSA9PiBmYWxzZSksIGNvbmRpdGlvbklubmVyKGZuKS50aGVuKCgpID0+IHRydWUpXSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCkuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbn1cblxuZnVuY3Rpb24gY29uZGl0aW9uSW5uZXIoZm46ICgpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuY29uZGl0aW9uKys7XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEVhZ2VyIGV2YWx1YXRpb25cbiAgICBpZiAoZm4oKSkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5zZXQoc2VxLCB7IGZuLCByZXNvbHZlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYW4gdXBkYXRlIG1ldGhvZCBmb3IgYSBXb3JrZmxvdy5cbiAqXG4gKiBBIGRlZmluaXRpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgaW4gdGhlIFdvcmtmbG93IHZpYSB7QGxpbmsgc2V0SGFuZGxlcn0gYW5kIHRvIHVwZGF0ZSBhIFdvcmtmbG93IHVzaW5nIGEge0BsaW5rIFdvcmtmbG93SGFuZGxlfSwge0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGV9IG9yIHtAbGluayBFeHRlcm5hbFdvcmtmbG93SGFuZGxlfS5cbiAqIEEgZGVmaW5pdGlvbiBjYW4gYmUgcmV1c2VkIGluIG11bHRpcGxlIFdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVwZGF0ZTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAndXBkYXRlJyxcbiAgICBuYW1lLFxuICB9IGFzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBzaWduYWwgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gc2lnbmFsIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lU2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogU2lnbmFsRGVmaW5pdGlvbjxBcmdzLCBOYW1lPiB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ3NpZ25hbCcsXG4gICAgbmFtZSxcbiAgfSBhcyBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHF1ZXJ5IG1ldGhvZCBmb3IgYSBXb3JrZmxvdy5cbiAqXG4gKiBBIGRlZmluaXRpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgaW4gdGhlIFdvcmtmbG93IHZpYSB7QGxpbmsgc2V0SGFuZGxlcn0gYW5kIHRvIHF1ZXJ5IGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUXVlcnk8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gIG5hbWU6IE5hbWVcbik6IFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAncXVlcnknLFxuICAgIG5hbWUsXG4gIH0gYXMgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT47XG59XG5cbi8qKlxuICogU2V0IGEgaGFuZGxlciBmdW5jdGlvbiBmb3IgYSBXb3JrZmxvdyB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gdXBkYXRlLCBzaWduYWwsIG9yIHF1ZXJ5IG5hbWUgdGhlIGxhc3QgaGFuZGxlciB3aWxsIG92ZXJ3cml0ZSBhbnkgcHJldmlvdXMgY2FsbHMuXG4gKlxuICogQHBhcmFtIGRlZiBhbiB7QGxpbmsgVXBkYXRlRGVmaW5pdGlvbn0sIHtAbGluayBTaWduYWxEZWZpbml0aW9ufSwgb3Ige0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gYXMgcmV0dXJuZWQgYnkge0BsaW5rIGRlZmluZVVwZGF0ZX0sIHtAbGluayBkZWZpbmVTaWduYWx9LCBvciB7QGxpbmsgZGVmaW5lUXVlcnl9IHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBoYW5kbGVyIGEgY29tcGF0aWJsZSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gZGVmaW5pdGlvbiBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqIEBwYXJhbSBvcHRpb25zIGFuIG9wdGlvbmFsIGBkZXNjcmlwdGlvbmAgb2YgdGhlIGhhbmRsZXIgYW5kIGFuIG9wdGlvbmFsIHVwZGF0ZSBgdmFsaWRhdG9yYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPj4oXG4gIGRlZjogVCxcbiAgaGFuZGxlcjogSGFuZGxlcjxSZXQsIEFyZ3MsIFQ+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogUXVlcnlIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgU2lnbmFsRGVmaW5pdGlvbjxBcmdzPj4oXG4gIGRlZjogVCxcbiAgaGFuZGxlcjogSGFuZGxlcjxSZXQsIEFyZ3MsIFQ+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogU2lnbmFsSGFuZGxlck9wdGlvbnNcbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPj4oXG4gIGRlZjogVCxcbiAgaGFuZGxlcjogSGFuZGxlcjxSZXQsIEFyZ3MsIFQ+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zPzogVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncz5cbik6IHZvaWQ7XG5cbi8vIEZvciBVcGRhdGVzIGFuZCBTaWduYWxzIHdlIHdhbnQgdG8gbWFrZSBhIHB1YmxpYyBndWFyYW50ZWUgc29tZXRoaW5nIGxpa2UgdGhlXG4vLyBmb2xsb3dpbmc6XG4vL1xuLy8gICBcIklmIGEgV0ZUIGNvbnRhaW5zIGEgU2lnbmFsL1VwZGF0ZSwgYW5kIGlmIGEgaGFuZGxlciBpcyBhdmFpbGFibGUgZm9yIHRoYXRcbi8vICAgU2lnbmFsL1VwZGF0ZSwgdGhlbiB0aGUgaGFuZGxlciB3aWxsIGJlIGV4ZWN1dGVkLlwiXCJcbi8vXG4vLyBIb3dldmVyLCB0aGF0IHN0YXRlbWVudCBpcyBub3Qgd2VsbC1kZWZpbmVkLCBsZWF2aW5nIHNldmVyYWwgcXVlc3Rpb25zIG9wZW46XG4vL1xuLy8gMS4gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIGEgaGFuZGxlciB0byBiZSBcImF2YWlsYWJsZVwiPyBXaGF0IGhhcHBlbnMgaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIG5vdCBwcmVzZW50IGluaXRpYWxseSBidXQgaXMgc2V0IGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZVxuLy8gICAgV29ya2Zsb3cgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGluIHRoYXQgV0ZUPyBXaGF0IGhhcHBlbnMgaWYgdGhlIGhhbmRsZXIgaXNcbi8vICAgIHNldCBhbmQgdGhlbiBkZWxldGVkLCBvciByZXBsYWNlZCB3aXRoIGEgZGlmZmVyZW50IGhhbmRsZXI/XG4vL1xuLy8gMi4gV2hlbiBpcyB0aGUgaGFuZGxlciBleGVjdXRlZD8gKFdoZW4gaXQgZmlyc3QgYmVjb21lcyBhdmFpbGFibGU/IEF0IHRoZSBlbmRcbi8vICAgIG9mIHRoZSBhY3RpdmF0aW9uPykgV2hhdCBhcmUgdGhlIGV4ZWN1dGlvbiBzZW1hbnRpY3Mgb2YgV29ya2Zsb3cgYW5kXG4vLyAgICBTaWduYWwvVXBkYXRlIGhhbmRsZXIgY29kZSBnaXZlbiB0aGF0IHRoZXkgYXJlIGNvbmN1cnJlbnQ/IENhbiB0aGUgdXNlclxuLy8gICAgcmVseSBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gdGhlIFdvcmtmbG93IHJldHVyblxuLy8gICAgdmFsdWUsIG9yIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3PyBJZiB0aGUgaGFuZGxlciBpcyBhblxuLy8gICAgYXN5bmMgZnVuY3Rpb24gLyBjb3JvdXRpbmUsIGhvdyBtdWNoIG9mIGl0IGlzIGV4ZWN1dGVkIGFuZCB3aGVuIGlzIHRoZVxuLy8gICAgcmVzdCBleGVjdXRlZD9cbi8vXG4vLyAzLiBXaGF0IGhhcHBlbnMgaWYgdGhlIGhhbmRsZXIgaXMgbm90IGV4ZWN1dGVkPyAoaS5lLiBiZWNhdXNlIGl0IHdhc24ndFxuLy8gICAgYXZhaWxhYmxlIGluIHRoZSBzZW5zZSBkZWZpbmVkIGJ5ICgxKSlcbi8vXG4vLyA0LiBJbiB0aGUgY2FzZSBvZiBVcGRhdGUsIHdoZW4gaXMgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gZXhlY3V0ZWQ/XG4vL1xuLy8gVGhlIGltcGxlbWVudGF0aW9uIGZvciBUeXBlc2NyaXB0IGlzIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gc2RrLWNvcmUgc29ydHMgU2lnbmFsIGFuZCBVcGRhdGUgam9icyAoYW5kIFBhdGNoZXMpIGFoZWFkIG9mIGFsbCBvdGhlclxuLy8gICAgam9icy4gVGh1cyBpZiB0aGUgaGFuZGxlciBpcyBhdmFpbGFibGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBBY3RpdmF0aW9uIHRoZW5cbi8vICAgIHRoZSBTaWduYWwvVXBkYXRlIHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIFdvcmtmbG93IGNvZGUgaXMgZXhlY3V0ZWQuIElmIGl0XG4vLyAgICBpcyBub3QsIHRoZW4gdGhlIFNpZ25hbC9VcGRhdGUgY2FsbHMgYXJlIHB1c2hlZCB0byBhIGJ1ZmZlci5cbi8vXG4vLyAyLiBPbiBlYWNoIGNhbGwgdG8gc2V0SGFuZGxlciBmb3IgYSBnaXZlbiBTaWduYWwvVXBkYXRlLCB3ZSBtYWtlIGEgcGFzc1xuLy8gICAgdGhyb3VnaCB0aGUgYnVmZmVyIGxpc3QuIElmIGEgYnVmZmVyZWQgam9iIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUganVzdC1zZXRcbi8vICAgIGhhbmRsZXIsIHRoZW4gdGhlIGpvYiBpcyByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlciBhbmQgdGhlIGluaXRpYWxcbi8vICAgIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgdGhlIGhhbmRsZXIgaXMgaW52b2tlZCBvbiB0aGF0IGlucHV0IChpLmUuXG4vLyAgICBwcmVlbXB0aW5nIHdvcmtmbG93IGNvZGUpLlxuLy9cbi8vIFRodXMgaW4gdGhlIGNhc2Ugb2YgVHlwZXNjcmlwdCB0aGUgcXVlc3Rpb25zIGFib3ZlIGFyZSBhbnN3ZXJlZCBhcyBmb2xsb3dzOlxuLy9cbi8vIDEuIEEgaGFuZGxlciBpcyBcImF2YWlsYWJsZVwiIGlmIGl0IGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gb3Jcbi8vICAgIGJlY29tZXMgc2V0IGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIEFjdGl2YXRpb24uIElmIHRoZSBoYW5kbGVyIGlzIG5vdCBzZXRcbi8vICAgIGluaXRpYWxseSB0aGVuIGl0IGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgaXMgc2V0LiBTdWJzZXF1ZW50IGRlbGV0aW9uIG9yXG4vLyAgICByZXBsYWNlbWVudCBieSBhIGRpZmZlcmVudCBoYW5kbGVyIGhhcyBubyBpbXBhY3QgYmVjYXVzZSB0aGUgam9icyBpdCB3YXNcbi8vICAgIGhhbmRsaW5nIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYW5kIGFyZSBubyBsb25nZXIgaW4gdGhlIGJ1ZmZlci5cbi8vXG4vLyAyLiBUaGUgaGFuZGxlciBpcyBleGVjdXRlZCBhcyBzb29uIGFzIGl0IGJlY29tZXMgYXZhaWxhYmxlLiBJLmUuIGlmIHRoZVxuLy8gICAgaGFuZGxlciBpcyBzZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBBY3RpdmF0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgd2hlblxuLy8gICAgZmlyc3QgYXR0ZW1wdGluZyB0byBwcm9jZXNzIHRoZSBTaWduYWwvVXBkYXRlIGpvYjsgYWx0ZXJuYXRpdmVseSwgaWYgaXQgaXNcbi8vICAgIHNldCBieSBhIHNldEhhbmRsZXIgY2FsbCBtYWRlIGJ5IFdvcmtmbG93IGNvZGUsIHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXNcbi8vICAgIHBhcnQgb2YgdGhhdCBjYWxsIChwcmVlbXB0aW5nIFdvcmtmbG93IGNvZGUpLiBUaGVyZWZvcmUsIGEgdXNlciBjYW4gcmVseVxuLy8gICAgb24gU2lnbmFsL1VwZGF0ZSBzaWRlIGVmZmVjdHMgYmVpbmcgcmVmbGVjdGVkIGluIGUuZy4gdGhlIFdvcmtmbG93IHJldHVyblxuLy8gICAgdmFsdWUsIGFuZCBpbiB0aGUgdmFsdWUgcGFzc2VkIHRvIENvbnRpbnVlLUFzLU5ldy4gQWN0aXZhdGlvbiBqb2JzIGFyZVxuLy8gICAgcHJvY2Vzc2VkIGluIHRoZSBvcmRlciBzdXBwbGllZCBieSBzZGstY29yZSwgaS5lLiBTaWduYWxzLCB0aGVuIFVwZGF0ZXMsXG4vLyAgICB0aGVuIG90aGVyIGpvYnMuIFdpdGhpbiBlYWNoIGdyb3VwLCB0aGUgb3JkZXIgc2VudCBieSB0aGUgc2VydmVyIGlzXG4vLyAgICBwcmVzZXJ2ZWQuIElmIHRoZSBoYW5kbGVyIGlzIGFzeW5jLCBpdCBpcyBleGVjdXRlZCB1cCB0byBpdHMgZmlyc3QgeWllbGRcbi8vICAgIHBvaW50LlxuLy9cbi8vIDMuIFNpZ25hbCBjYXNlOiBJZiBhIGhhbmRsZXIgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBmb3IgYSBTaWduYWwgam9iIHRoZW5cbi8vICAgIHRoZSBqb2IgcmVtYWlucyBpbiB0aGUgYnVmZmVyLiBJZiBhIGhhbmRsZXIgZm9yIHRoZSBTaWduYWwgYmVjb21lc1xuLy8gICAgYXZhaWxhYmxlIGluIGEgc3Vic2VxdWVudCBBY3RpdmF0aW9uIChvZiB0aGUgc2FtZSBvciBhIHN1YnNlcXVlbnQgV0ZUKVxuLy8gICAgdGhlbiB0aGUgaGFuZGxlciB3aWxsIGJlIGV4ZWN1dGVkLiBJZiBub3QsIHRoZW4gdGhlIFNpZ25hbCB3aWxsIG5ldmVyIGJlXG4vLyAgICByZXNwb25kZWQgdG8gYW5kIHRoaXMgY2F1c2VzIG5vIGVycm9yLlxuLy9cbi8vICAgIFVwZGF0ZSBjYXNlOiBJZiBhIGhhbmRsZXIgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBmb3IgYW4gVXBkYXRlIGpvYiB0aGVuXG4vLyAgICB0aGUgVXBkYXRlIGlzIHJlamVjdGVkIGF0IHRoZSBlbmQgb2YgdGhlIEFjdGl2YXRpb24uIFRodXMsIGlmIGEgdXNlciBkb2VzXG4vLyAgICBub3Qgd2FudCBhbiBVcGRhdGUgdG8gYmUgcmVqZWN0ZWQgZm9yIHRoaXMgcmVhc29uLCB0aGVuIGl0IGlzIHRoZWlyXG4vLyAgICByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGVpciBhcHBsaWNhdGlvbiBhbmQgd29ya2Zsb3cgY29kZSBpbnRlcmFjdFxuLy8gICAgc3VjaCB0aGF0IGEgaGFuZGxlciBpcyBhdmFpbGFibGUgZm9yIHRoZSBVcGRhdGUgZHVyaW5nIGFueSBBY3RpdmF0aW9uXG4vLyAgICB3aGljaCBtaWdodCBjb250YWluIHRoZWlyIFVwZGF0ZSBqb2IuIChOb3RlIHRoYXQgdGhlIHVzZXIgb2Z0ZW4gaGFzXG4vLyAgICB1bmNlcnRhaW50eSBhYm91dCB3aGljaCBXRlQgdGhlaXIgU2lnbmFsL1VwZGF0ZSB3aWxsIGFwcGVhciBpbi4gRm9yXG4vLyAgICBleGFtcGxlLCBpZiB0aGV5IGNhbGwgc3RhcnRXb3JrZmxvdygpIGZvbGxvd2VkIGJ5IHN0YXJ0VXBkYXRlKCksIHRoZW4gdGhleVxuLy8gICAgd2lsbCB0eXBpY2FsbHkgbm90IGtub3cgd2hldGhlciB0aGVzZSB3aWxsIGJlIGRlbGl2ZXJlZCBpbiBvbmUgb3IgdHdvXG4vLyAgICBXRlRzLiBPbiB0aGUgb3RoZXIgaGFuZCB0aGVyZSBhcmUgc2l0dWF0aW9ucyB3aGVyZSB0aGV5IHdvdWxkIGhhdmUgcmVhc29uXG4vLyAgICB0byBiZWxpZXZlIHRoZXkgYXJlIGluIHRoZSBzYW1lIFdGVCwgZm9yIGV4YW1wbGUgaWYgdGhleSBkbyBub3Qgc3RhcnRcbi8vICAgIFdvcmtlciBwb2xsaW5nIHVudGlsIGFmdGVyIHRoZXkgaGF2ZSB2ZXJpZmllZCB0aGF0IGJvdGggcmVxdWVzdHMgaGF2ZVxuLy8gICAgc3VjY2VlZGVkLilcbi8vXG4vLyA0LiBJZiBhbiBVcGRhdGUgaGFzIGEgdmFsaWRhdGlvbiBmdW5jdGlvbiB0aGVuIGl0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG4vLyAgICBwcmlvciB0byB0aGUgaGFuZGxlci4gKE5vdGUgdGhhdCB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBpcyByZXF1aXJlZCB0byBiZVxuLy8gICAgc3luY2hyb25vdXMpLlxuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8XG4gIFJldCxcbiAgQXJncyBleHRlbmRzIGFueVtdLFxuICBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+IHwgU2lnbmFsRGVmaW5pdGlvbjxBcmdzPiB8IFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+LFxuPihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zIHwgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5zZXRIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IG9wdGlvbnM/LmRlc2NyaXB0aW9uO1xuICBpZiAoZGVmLnR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB1cGRhdGVPcHRpb25zID0gb3B0aW9ucyBhcyBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPiB8IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgdmFsaWRhdG9yID0gdXBkYXRlT3B0aW9ucz8udmFsaWRhdG9yIGFzIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuZmluaXNoZWRQb2xpY3kgPSB1cGRhdGVPcHRpb25zPy51bmZpbmlzaGVkUG9saWN5ID8/IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET047XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXIsIHZhbGlkYXRvciwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFVwZGF0ZXMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnVwZGF0ZUhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3NpZ25hbCcpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHNpZ25hbE9wdGlvbnMgPSBvcHRpb25zIGFzIFNpZ25hbEhhbmRsZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHNpZ25hbE9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci5zaWduYWxIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlcjogaGFuZGxlciBhcyBhbnksIGRlc2NyaXB0aW9uLCB1bmZpbmlzaGVkUG9saWN5IH0pO1xuICAgICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID09IG51bGwpIHtcbiAgICAgIGFjdGl2YXRvci5zaWduYWxIYW5kbGVycy5kZWxldGUoZGVmLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGVmLnR5cGUgPT09ICdxdWVyeScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci5xdWVyeUhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24gfSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID09IG51bGwpIHtcbiAgICAgIGFjdGl2YXRvci5xdWVyeUhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGRlZmluaXRpb24gdHlwZTogJHsoZGVmIGFzIGFueSkudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldCBhIHNpZ25hbCBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLlxuICpcbiAqIFNpZ25hbHMgYXJlIGRpc3BhdGNoZWQgdG8gdGhlIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gc2lnbmFsIG9yIHF1ZXJ5IG5hbWUgdGhlIGxhc3QgaGFuZGxlciB3aWxsIG92ZXJ3cml0ZSBhbnkgcHJldmlvdXMgY2FsbHMuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHNpZ25hbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcywgb3IgYHVuZGVmaW5lZGAgdG8gdW5zZXQgdGhlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0U2lnbmFsSGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0U2lnbmFsSGFuZGxlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2V0RGVmYXVsdFNpZ25hbEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBhY3RpdmF0b3IuZGVmYXVsdFNpZ25hbEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkU2lnbmFscygpO1xuICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhpcyBXb3JrZmxvdyBjb2RlOlxuICpcbiAqIGBgYHRzXG4gKiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKHtcbiAqICAgQ3VzdG9tSW50RmllbGQ6IFsxXSxcbiAqICAgQ3VzdG9tQm9vbEZpZWxkOiBbdHJ1ZV1cbiAqIH0pO1xuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyh7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21LZXl3b3JkRmllbGQ6IFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J11cbiAqIH0pO1xuICogYGBgXG4gKlxuICogd291bGQgcmVzdWx0IGluIHRoZSBXb3JrZmxvdyBoYXZpbmcgdGhlc2UgU2VhcmNoIEF0dHJpYnV0ZXM6XG4gKlxuICogYGBgdHNcbiAqIHtcbiAqICAgQ3VzdG9tSW50RmllbGQ6IFs0Ml0sXG4gKiAgIEN1c3RvbUJvb2xGaWVsZDogW3RydWVdLFxuICogICBDdXN0b21LZXl3b3JkRmllbGQ6IFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J11cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzZWFyY2hBdHRyaWJ1dGVzIFRoZSBSZWNvcmQgdG8gbWVyZ2UuIFVzZSBhIHZhbHVlIG9mIGBbXWAgdG8gY2xlYXIgYSBTZWFyY2ggQXR0cmlidXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy51cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcblxuICBpZiAoc2VhcmNoQXR0cmlidXRlcyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZWFyY2hBdHRyaWJ1dGVzIG11c3QgYmUgYSBub24tbnVsbCBTZWFyY2hBdHRyaWJ1dGVzJyk7XG4gIH1cblxuICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgIHVwc2VydFdvcmtmbG93U2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgc2VhcmNoQXR0cmlidXRlczogbWFwVG9QYXlsb2FkcyhzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLCBzZWFyY2hBdHRyaWJ1dGVzKSxcbiAgICB9LFxuICB9KTtcblxuICBhY3RpdmF0b3IubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvOiBXb3JrZmxvd0luZm8pOiBXb3JrZmxvd0luZm8gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5pbmZvLFxuICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAuLi5pbmZvLnNlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICAgIC4uLnNlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIE1lbW9zIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBtZW1vYCB3aXRoIGV4aXN0aW5nXG4gKiBNZW1vcyAoYXMgcmV0dXJuZWQgYnkgYHdvcmtmbG93SW5mbygpLm1lbW9gKS5cbiAqXG4gKiBOZXcgbWVtbyBpcyBtZXJnZWQgYnkgcmVwbGFjaW5nIHByb3BlcnRpZXMgb2YgdGhlIHNhbWUgbmFtZSBfYXQgdGhlIGZpcnN0XG4gKiBsZXZlbCBvbmx5Xy4gU2V0dGluZyBhIHByb3BlcnR5IHRvIHZhbHVlIGB1bmRlZmluZWRgIG9yIGBudWxsYCBjbGVhcnMgdGhhdFxuICoga2V5IGZyb20gdGhlIE1lbW8uXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIHVwc2VydE1lbW8oe1xuICogICBrZXkxOiB2YWx1ZSxcbiAqICAga2V5MzogeyBzdWJrZXkxOiB2YWx1ZSB9XG4gKiAgIGtleTQ6IHZhbHVlLFxuICogfSk7XG4gKiB1cHNlcnRNZW1vKHtcbiAqICAga2V5MjogdmFsdWVcbiAqICAga2V5MzogeyBzdWJrZXkyOiB2YWx1ZSB9XG4gKiAgIGtleTQ6IHVuZGVmaW5lZCxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogd291bGQgcmVzdWx0IGluIHRoZSBXb3JrZmxvdyBoYXZpbmcgdGhlc2UgTWVtbzpcbiAqXG4gKiBgYGB0c1xuICoge1xuICogICBrZXkxOiB2YWx1ZSxcbiAqICAga2V5MjogdmFsdWUsXG4gKiAgIGtleTM6IHsgc3Via2V5MjogdmFsdWUgfSAgLy8gTm90ZSB0aGlzIG9iamVjdCB3YXMgY29tcGxldGVseSByZXBsYWNlZFxuICogICAvLyBOb3RlIHRoYXQga2V5NCB3YXMgY29tcGxldGVseSByZW1vdmVkXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbWVtbyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBzZXJ0TWVtbyhtZW1vOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cudXBzZXJ0TWVtbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcblxuICBpZiAobWVtbyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtZW1vIG11c3QgYmUgYSBub24tbnVsbCBSZWNvcmQnKTtcbiAgfVxuXG4gIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgbW9kaWZ5V29ya2Zsb3dQcm9wZXJ0aWVzOiB7XG4gICAgICB1cHNlcnRlZE1lbW86IHtcbiAgICAgICAgZmllbGRzOiBtYXBUb1BheWxvYWRzKFxuICAgICAgICAgIGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLFxuICAgICAgICAgIC8vIENvbnZlcnQgbnVsbCB0byB1bmRlZmluZWRcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobWVtbykubWFwKChbaywgdl0pID0+IFtrLCB2ID8/IHVuZGVmaW5lZF0pKVxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBhY3RpdmF0b3IubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvOiBXb3JrZmxvd0luZm8pOiBXb3JrZmxvd0luZm8gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5pbmZvLFxuICAgICAgbWVtbzogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICAgICAgLi4uaW5mby5tZW1vLFxuICAgICAgICAgIC4uLm1lbW8sXG4gICAgICAgIH0pLmZpbHRlcigoW18sIHZdKSA9PiB2ICE9IG51bGwpXG4gICAgICApLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdXBkYXRlIGFuZCBzaWduYWwgaGFuZGxlcnMgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcuXG4gKlxuICogQ29uc2lkZXIgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbiBiZWZvcmUgd29ya2Zsb3cgcmV0dXJuIG9yIGNvbnRpbnVlLWFzLW5ldywgdG8gcHJldmVudFxuICogaW50ZXJydXB0aW9uIG9mIGluLXByb2dyZXNzIGhhbmRsZXJzIGJ5IHdvcmtmbG93IGV4aXQ6XG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHdvcmtmbG93LmNvbmRpdGlvbih3b3JrZmxvdy5hbGxIYW5kbGVyc0ZpbmlzaGVkKVxuICogYGBgXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaW4tcHJvZ3Jlc3MgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxIYW5kbGVyc0ZpbmlzaGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnYWxsSGFuZGxlcnNGaW5pc2hlZCgpIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIGFjdGl2YXRvci5pblByb2dyZXNzU2lnbmFscy5zaXplID09PSAwICYmIGFjdGl2YXRvci5pblByb2dyZXNzVXBkYXRlcy5zaXplID09PSAwO1xufVxuXG5leHBvcnQgY29uc3Qgc3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8c3RyaW5nPignX19zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IGVuaGFuY2VkU3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8RW5oYW5jZWRTdGFja1RyYWNlPignX19lbmhhbmNlZF9zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93TWV0YWRhdGFRdWVyeSA9IGRlZmluZVF1ZXJ5PHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KCdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGRvIG5vdCBlZGl0IC5qcyBmaWxlcyBkaXJlY3RseSAtIGVkaXQgc3JjL2luZGV4LmpzdFxuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlcXVhbChhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAoYSAmJiBiICYmIHR5cGVvZiBhID09ICdvYmplY3QnICYmIHR5cGVvZiBiID09ICdvYmplY3QnKSB7XG4gICAgaWYgKGEuY29uc3RydWN0b3IgIT09IGIuY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcblxuICAgIHZhciBsZW5ndGgsIGksIGtleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoIWVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmICghZXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB0cnVlIGlmIGJvdGggTmFOLCBmYWxzZSBvdGhlcndpc2VcbiAgcmV0dXJuIGEhPT1hICYmIGIhPT1iO1xufTtcbiIsIi8vIEdFTkVSQVRFRCBGSUxFLiBETyBOT1QgRURJVC5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIGZ1bmN0aW9uIHVud3JhcERlZmF1bHQoZXhwb3J0cykge1xuICAgIHJldHVybiBcImRlZmF1bHRcIiBpbiBleHBvcnRzID8gZXhwb3J0cy5kZWZhdWx0IDogZXhwb3J0cztcbiAgfVxuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBvcnRzID0ge307XG4gICAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgICAgcmV0dXJuIHVud3JhcERlZmF1bHQoZXhwb3J0cyk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiKSBtb2R1bGUuZXhwb3J0cyA9IHVud3JhcERlZmF1bHQoZXhwb3J0cyk7XG4gIH0gZWxzZSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBleHBvcnRzID0ge307XG4gICAgICBmYWN0b3J5KGV4cG9ydHMpO1xuICAgICAgZ2xvYmFsLkxvbmcgPSB1bndyYXBEZWZhdWx0KGV4cG9ydHMpO1xuICAgIH0pKCk7XG4gIH1cbn0pKFxuICB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gXCJ1bmRlZmluZWRcIlxuICAgID8gZ2xvYmFsVGhpc1xuICAgIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgID8gc2VsZlxuICAgICAgOiB0aGlzLFxuICBmdW5jdGlvbiAoX2V4cG9ydHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgIH0pO1xuICAgIF9leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGxpY2Vuc2VcbiAgICAgKiBDb3B5cmlnaHQgMjAwOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnNcbiAgICAgKiBDb3B5cmlnaHQgMjAyMCBEYW5pZWwgV2lydHogLyBUaGUgbG9uZy5qcyBBdXRob3JzLlxuICAgICAqXG4gICAgICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgICpcbiAgICAgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgICpcbiAgICAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgICAgKlxuICAgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gICAgICovXG5cbiAgICAvLyBXZWJBc3NlbWJseSBvcHRpbWl6YXRpb25zIHRvIGRvIG5hdGl2ZSBpNjQgbXVsdGlwbGljYXRpb24gYW5kIGRpdmlkZVxuICAgIHZhciB3YXNtID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgd2FzbSA9IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShcbiAgICAgICAgbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShcbiAgICAgICAgICBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAvLyBcXDBhc21cbiAgICAgICAgICAgIDAsIDk3LCAxMTUsIDEwOSxcbiAgICAgICAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgICAgICAgMSwgMCwgMCwgMCxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJ0eXBlXCJcbiAgICAgICAgICAgIDEsIDEzLCAyLFxuICAgICAgICAgICAgLy8gMCwgKCkgPT4gaTMyXG4gICAgICAgICAgICA5NiwgMCwgMSwgMTI3LFxuICAgICAgICAgICAgLy8gMSwgKGkzMiwgaTMyLCBpMzIsIGkzMikgPT4gaTMyXG4gICAgICAgICAgICA5NiwgNCwgMTI3LCAxMjcsIDEyNywgMTI3LCAxLCAxMjcsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgMywgNywgNixcbiAgICAgICAgICAgIC8vIDAsIHR5cGUgMFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIC8vIDEsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDIsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDMsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDQsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIDUsIHR5cGUgMVxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJnbG9iYWxcIlxuICAgICAgICAgICAgNiwgNiwgMSxcbiAgICAgICAgICAgIC8vIDAsIFwiaGlnaFwiLCBtdXRhYmxlIGkzMlxuICAgICAgICAgICAgMTI3LCAxLCA2NSwgMCwgMTEsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiZXhwb3J0XCJcbiAgICAgICAgICAgIDcsIDUwLCA2LFxuICAgICAgICAgICAgLy8gMCwgXCJtdWxcIlxuICAgICAgICAgICAgMywgMTA5LCAxMTcsIDEwOCwgMCwgMSxcbiAgICAgICAgICAgIC8vIDEsIFwiZGl2X3NcIlxuICAgICAgICAgICAgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNSwgMCwgMixcbiAgICAgICAgICAgIC8vIDIsIFwiZGl2X3VcIlxuICAgICAgICAgICAgNSwgMTAwLCAxMDUsIDExOCwgOTUsIDExNywgMCwgMyxcbiAgICAgICAgICAgIC8vIDMsIFwicmVtX3NcIlxuICAgICAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNSwgMCwgNCxcbiAgICAgICAgICAgIC8vIDQsIFwicmVtX3VcIlxuICAgICAgICAgICAgNSwgMTE0LCAxMDEsIDEwOSwgOTUsIDExNywgMCwgNSxcbiAgICAgICAgICAgIC8vIDUsIFwiZ2V0X2hpZ2hcIlxuICAgICAgICAgICAgOCwgMTAzLCAxMDEsIDExNiwgOTUsIDEwNCwgMTA1LCAxMDMsIDEwNCwgMCwgMCxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJjb2RlXCJcbiAgICAgICAgICAgIDEwLCAxOTEsIDEsIDYsXG4gICAgICAgICAgICAvLyAwLCBcImdldF9oaWdoXCJcbiAgICAgICAgICAgIDQsIDAsIDM1LCAwLCAxMSxcbiAgICAgICAgICAgIC8vIDEsIFwibXVsXCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjYsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gMiwgXCJkaXZfc1wiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI3LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDMsIFwiZGl2X3VcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyOCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgICAvLyA0LCBcInJlbV9zXCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjksIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gNSwgXCJyZW1fdVwiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTMwLCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKSxcbiAgICAgICAge30sXG4gICAgICApLmV4cG9ydHM7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBubyB3YXNtIHN1cHBvcnQgOihcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciwgZ2l2ZW4gaXRzIGxvdyBhbmQgaGlnaCAzMiBiaXQgdmFsdWVzIGFzICpzaWduZWQqIGludGVnZXJzLlxuICAgICAqICBTZWUgdGhlIGZyb20qIGZ1bmN0aW9ucyBiZWxvdyBmb3IgbW9yZSBjb252ZW5pZW50IHdheXMgb2YgY29uc3RydWN0aW5nIExvbmdzLlxuICAgICAqIEBleHBvcnRzIExvbmdcbiAgICAgKiBAY2xhc3MgQSBMb25nIGNsYXNzIGZvciByZXByZXNlbnRpbmcgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3cgVGhlIGxvdyAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2ggVGhlIGhpZ2ggKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb25nKGxvdywgaGlnaCwgdW5zaWduZWQpIHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5sb3cgPSBsb3cgfCAwO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICovXG4gICAgICB0aGlzLmhpZ2ggPSBoaWdoIHwgMDtcblxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdC5cbiAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICovXG4gICAgICB0aGlzLnVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgICB9XG5cbiAgICAvLyBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBsb25nIGlzIHRoZSB0d28gZ2l2ZW4gc2lnbmVkLCAzMi1iaXQgdmFsdWVzLlxuICAgIC8vIFdlIHVzZSAzMi1iaXQgcGllY2VzIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBzaXplIG9mIGludGVnZXJzIG9uIHdoaWNoXG4gICAgLy8gSmF2YXNjcmlwdCBwZXJmb3JtcyBiaXQtb3BlcmF0aW9ucy4gIEZvciBvcGVyYXRpb25zIGxpa2UgYWRkaXRpb24gYW5kXG4gICAgLy8gbXVsdGlwbGljYXRpb24sIHdlIHNwbGl0IGVhY2ggbnVtYmVyIGludG8gMTYgYml0IHBpZWNlcywgd2hpY2ggY2FuIGVhc2lseSBiZVxuICAgIC8vIG11bHRpcGxpZWQgd2l0aGluIEphdmFzY3JpcHQncyBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiB3aXRob3V0IG92ZXJmbG93XG4gICAgLy8gb3IgY2hhbmdlIGluIHNpZ24uXG4gICAgLy9cbiAgICAvLyBJbiB0aGUgYWxnb3JpdGhtcyBiZWxvdywgd2UgZnJlcXVlbnRseSByZWR1Y2UgdGhlIG5lZ2F0aXZlIGNhc2UgdG8gdGhlXG4gICAgLy8gcG9zaXRpdmUgY2FzZSBieSBuZWdhdGluZyB0aGUgaW5wdXQocykgYW5kIHRoZW4gcG9zdC1wcm9jZXNzaW5nIHRoZSByZXN1bHQuXG4gICAgLy8gTm90ZSB0aGF0IHdlIG11c3QgQUxXQVlTIGNoZWNrIHNwZWNpYWxseSB3aGV0aGVyIHRob3NlIHZhbHVlcyBhcmUgTUlOX1ZBTFVFXG4gICAgLy8gKC0yXjYzKSBiZWNhdXNlIC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFIChzaW5jZSAyXjYzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhc1xuICAgIC8vIGEgcG9zaXRpdmUgbnVtYmVyLCBpdCBvdmVyZmxvd3MgYmFjayBpbnRvIGEgbmVnYXRpdmUpLiAgTm90IGhhbmRsaW5nIHRoaXNcbiAgICAvLyBjYXNlIHdvdWxkIG9mdGVuIHJlc3VsdCBpbiBpbmZpbml0ZSByZWN1cnNpb24uXG4gICAgLy9cbiAgICAvLyBDb21tb24gY29uc3RhbnQgdmFsdWVzIFpFUk8sIE9ORSwgTkVHX09ORSwgZXRjLiBhcmUgZGVmaW5lZCBiZWxvdyB0aGUgZnJvbSpcbiAgICAvLyBtZXRob2RzIG9uIHdoaWNoIHRoZXkgZGVwZW5kLlxuXG4gICAgLyoqXG4gICAgICogQW4gaW5kaWNhdG9yIHVzZWQgdG8gcmVsaWFibHkgZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIExvbmcgb3Igbm90LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBjb25zdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgTG9uZy5wcm90b3R5cGUuX19pc0xvbmdfXztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTG9uZy5wcm90b3R5cGUsIFwiX19pc0xvbmdfX1wiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTG9uZyhvYmopIHtcbiAgICAgIHJldHVybiAob2JqICYmIG9ialtcIl9faXNMb25nX19cIl0pID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgbnVtYmVyXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdHozMih2YWx1ZSkge1xuICAgICAgdmFyIGMgPSBNYXRoLmNsejMyKHZhbHVlICYgLXZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZSA/IDMxIC0gYyA6IGM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBMb25nLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIE9iamVjdFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmcuaXNMb25nID0gaXNMb25nO1xuXG4gICAgLyoqXG4gICAgICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgaW50ZWdlciB2YWx1ZXMuXG4gICAgICogQHR5cGUgeyFPYmplY3R9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIElOVF9DQUNIRSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQSBjYWNoZSBvZiB0aGUgTG9uZyByZXByZXNlbnRhdGlvbnMgb2Ygc21hbGwgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuXG4gICAgICogQHR5cGUgeyFPYmplY3R9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFVJTlRfQ0FDSEUgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21JbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICB2YXIgb2JqLCBjYWNoZWRPYmosIGNhY2hlO1xuICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgIHZhbHVlID4+Pj0gMDtcbiAgICAgICAgaWYgKChjYWNoZSA9IDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTYpKSB7XG4gICAgICAgICAgY2FjaGVkT2JqID0gVUlOVF9DQUNIRVt2YWx1ZV07XG4gICAgICAgICAgaWYgKGNhY2hlZE9iaikgcmV0dXJuIGNhY2hlZE9iajtcbiAgICAgICAgfVxuICAgICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgMCwgdHJ1ZSk7XG4gICAgICAgIGlmIChjYWNoZSkgVUlOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSB8PSAwO1xuICAgICAgICBpZiAoKGNhY2hlID0gLTEyOCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDEyOCkpIHtcbiAgICAgICAgICBjYWNoZWRPYmogPSBJTlRfQ0FDSEVbdmFsdWVdO1xuICAgICAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgICAgIH1cbiAgICAgICAgb2JqID0gZnJvbUJpdHModmFsdWUsIHZhbHVlIDwgMCA/IC0xIDogMCwgZmFsc2UpO1xuICAgICAgICBpZiAoY2FjaGUpIElOVF9DQUNIRVt2YWx1ZV0gPSBvYmo7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiAzMiBiaXQgaW50ZWdlciB2YWx1ZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIDMyIGJpdCBpbnRlZ2VyIGluIHF1ZXN0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUludCA9IGZyb21JbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tTnVtYmVyKHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiBVWkVSTztcbiAgICAgICAgaWYgKHZhbHVlID49IFRXT19QV1JfNjRfREJMKSByZXR1cm4gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlIDw9IC1UV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1JTl9WQUxVRTtcbiAgICAgICAgaWYgKHZhbHVlICsgMSA+PSBUV09fUFdSXzYzX0RCTCkgcmV0dXJuIE1BWF9WQUxVRTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA8IDApIHJldHVybiBmcm9tTnVtYmVyKC12YWx1ZSwgdW5zaWduZWQpLm5lZygpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB2YWx1ZSAlIFRXT19QV1JfMzJfREJMIHwgMCxcbiAgICAgICAgKHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpIHwgMCxcbiAgICAgICAgdW5zaWduZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gdmFsdWUsIHByb3ZpZGVkIHRoYXQgaXQgaXMgYSBmaW5pdGUgbnVtYmVyLiBPdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgaW4gcXVlc3Rpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tTnVtYmVyID0gZnJvbU51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IExvbmcobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIDY0IGJpdCBpbnRlZ2VyIHRoYXQgY29tZXMgYnkgY29uY2F0ZW5hdGluZyB0aGUgZ2l2ZW4gbG93IGFuZCBoaWdoIGJpdHMuIEVhY2ggaXNcbiAgICAgKiAgYXNzdW1lZCB0byB1c2UgMzIgYml0cy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93Qml0cyBUaGUgbG93IDMyIGJpdHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgVGhlIGhpZ2ggMzIgYml0c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CaXRzID0gZnJvbUJpdHM7XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBleHBvbmVudFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIHBvd19kYmwgPSBNYXRoLnBvdzsgLy8gVXNlZCA0IHRpbWVzICg0KjggdG8gMTUrNClcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICAgKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXhcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIsIHVuc2lnbmVkLCByYWRpeCkge1xuICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHRocm93IEVycm9yKFwiZW1wdHkgc3RyaW5nXCIpO1xuICAgICAgaWYgKHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAvLyBGb3IgZ29vZy5tYXRoLmxvbmcgY29tcGF0aWJpbGl0eVxuICAgICAgICByYWRpeCA9IHVuc2lnbmVkO1xuICAgICAgICB1bnNpZ25lZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5zaWduZWQgPSAhIXVuc2lnbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzdHIgPT09IFwiTmFOXCIgfHxcbiAgICAgICAgc3RyID09PSBcIkluZmluaXR5XCIgfHxcbiAgICAgICAgc3RyID09PSBcIitJbmZpbml0eVwiIHx8XG4gICAgICAgIHN0ciA9PT0gXCItSW5maW5pdHlcIlxuICAgICAgKVxuICAgICAgICByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xuICAgICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG4gICAgICB2YXIgcDtcbiAgICAgIGlmICgocCA9IHN0ci5pbmRleE9mKFwiLVwiKSkgPiAwKSB0aHJvdyBFcnJvcihcImludGVyaW9yIGh5cGhlblwiKTtcbiAgICAgIGVsc2UgaWYgKHAgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcoc3RyLnN1YnN0cmluZygxKSwgdW5zaWduZWQsIHJhZGl4KS5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gc2V2ZXJhbCAoOCkgZGlnaXRzIGVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLCBzbyBhcyB0b1xuICAgICAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXG4gICAgICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA4KSk7XG4gICAgICB2YXIgcmVzdWx0ID0gWkVSTztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSArPSA4KSB7XG4gICAgICAgIHZhciBzaXplID0gTWF0aC5taW4oOCwgc3RyLmxlbmd0aCAtIGkpLFxuICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQoc3RyLnN1YnN0cmluZyhpLCBpICsgc2l6ZSksIHJhZGl4KTtcbiAgICAgICAgaWYgKHNpemUgPCA4KSB7XG4gICAgICAgICAgdmFyIHBvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCBzaXplKSk7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChwb3dlcikuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHJhZGl4VG9Qb3dlcik7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC51bnNpZ25lZCA9IHVuc2lnbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nLCB3cml0dGVuIHVzaW5nIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgTG9uZ1xuICAgICAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFRoZSByYWRpeCBpbiB3aGljaCB0aGUgdGV4dCBpcyB3cml0dGVuICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21TdHJpbmcgPSBmcm9tU3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8c3RyaW5nfCF7bG93OiBudW1iZXIsIGhpZ2g6IG51bWJlciwgdW5zaWduZWQ6IGJvb2xlYW59fSB2YWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tVmFsdWUodmFsLCB1bnNpZ25lZCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIpIHJldHVybiBmcm9tTnVtYmVyKHZhbCwgdW5zaWduZWQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHJldHVybiBmcm9tU3RyaW5nKHZhbCwgdW5zaWduZWQpO1xuICAgICAgLy8gVGhyb3dzIGZvciBub24tb2JqZWN0cywgY29udmVydHMgbm9uLWluc3RhbmNlb2YgTG9uZzpcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdmFsLmxvdyxcbiAgICAgICAgdmFsLmhpZ2gsXG4gICAgICAgIHR5cGVvZiB1bnNpZ25lZCA9PT0gXCJib29sZWFuXCIgPyB1bnNpZ25lZCA6IHZhbC51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIExvbmcgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGZyb20qIGZ1bmN0aW9uIGZvciBpdHMgdHlwZS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfCF7bG93OiBudW1iZXIsIGhpZ2g6IG51bWJlciwgdW5zaWduZWQ6IGJvb2xlYW59fSB2YWwgVmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuZnJvbVZhbHVlID0gZnJvbVZhbHVlO1xuXG4gICAgLy8gTk9URTogdGhlIGNvbXBpbGVyIHNob3VsZCBpbmxpbmUgdGhlc2UgY29uc3RhbnQgdmFsdWVzIGJlbG93IGFuZCB0aGVuIHJlbW92ZSB0aGVzZSB2YXJpYWJsZXMsIHNvIHRoZXJlIHNob3VsZCBiZVxuICAgIC8vIG5vIHJ1bnRpbWUgcGVuYWx0eSBmb3IgdGhlc2UuXG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzE2X0RCTCA9IDEgPDwgMTY7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzI0X0RCTCA9IDEgPDwgMjQ7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzMyX0RCTCA9IFRXT19QV1JfMTZfREJMICogVFdPX1BXUl8xNl9EQkw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzY0X0RCTCA9IFRXT19QV1JfMzJfREJMICogVFdPX1BXUl8zMl9EQkw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzYzX0RCTCA9IFRXT19QV1JfNjRfREJMIC8gMjtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8yNCA9IGZyb21JbnQoVFdPX1BXUl8yNF9EQkwpO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBaRVJPID0gZnJvbUludCgwKTtcblxuICAgIC8qKlxuICAgICAqIFNpZ25lZCB6ZXJvLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLlpFUk8gPSBaRVJPO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBVWkVSTyA9IGZyb21JbnQoMCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBVbnNpZ25lZCB6ZXJvLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLlVaRVJPID0gVVpFUk87XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE9ORSA9IGZyb21JbnQoMSk7XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQgb25lLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk9ORSA9IE9ORTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVU9ORSA9IGZyb21JbnQoMSwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBVbnNpZ25lZCBvbmUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuVU9ORSA9IFVPTkU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE5FR19PTkUgPSBmcm9tSW50KC0xKTtcblxuICAgIC8qKlxuICAgICAqIFNpZ25lZCBuZWdhdGl2ZSBvbmUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTkVHX09ORSA9IE5FR19PTkU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE1BWF9WQUxVRSA9IGZyb21CaXRzKDB4ZmZmZmZmZmYgfCAwLCAweDdmZmZmZmZmIHwgMCwgZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSBzaWduZWQgdmFsdWUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTUFYX1ZBTFVFID0gTUFYX1ZBTFVFO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBNQVhfVU5TSUdORURfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHhmZmZmZmZmZiB8IDAsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogTWF4aW11bSB1bnNpZ25lZCB2YWx1ZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5NQVhfVU5TSUdORURfVkFMVUUgPSBNQVhfVU5TSUdORURfVkFMVUU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE1JTl9WQUxVRSA9IGZyb21CaXRzKDAsIDB4ODAwMDAwMDAgfCAwLCBmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIHNpZ25lZCB2YWx1ZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5NSU5fVkFMVUUgPSBNSU5fVkFMVUU7XG5cbiAgICAvKipcbiAgICAgKiBAYWxpYXMgTG9uZy5wcm90b3R5cGVcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTG9uZ1Byb3RvdHlwZSA9IExvbmcucHJvdG90eXBlO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSAzMiBiaXQgaW50ZWdlciwgYXNzdW1pbmcgaXQgaXMgYSAzMiBiaXQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb24gdG9JbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCA/IHRoaXMubG93ID4+PiAwIDogdGhpcy5sb3c7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgdGhlIG5lYXJlc3QgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZSAoZG91YmxlLCA1MyBiaXQgbWFudGlzc2EpLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlcigpIHtcbiAgICAgIGlmICh0aGlzLnVuc2lnbmVkKVxuICAgICAgICByZXR1cm4gKHRoaXMuaGlnaCA+Pj4gMCkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHN0cmluZyB3cml0dGVuIGluIHRoZSBzcGVjaWZpZWQgcmFkaXguXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggUmFkaXggKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gSWYgYHJhZGl4YCBpcyBvdXQgb2YgcmFuZ2VcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcocmFkaXgpIHtcbiAgICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gICAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpIHRocm93IFJhbmdlRXJyb3IoXCJyYWRpeFwiKTtcbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gXCIwXCI7XG4gICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgLy8gVW5zaWduZWQgTG9uZ3MgYXJlIG5ldmVyIG5lZ2F0aXZlXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgTG9uZyB2YWx1ZSBiZWZvcmUgaXQgY2FuIGJlIG5lZ2F0ZWQsIHNvIHdlIHJlbW92ZVxuICAgICAgICAgIC8vIHRoZSBib3R0b20tbW9zdCBkaWdpdCBpbiB0aGlzIGJhc2UgYW5kIHRoZW4gcmVjdXJzZSB0byBkbyB0aGUgcmVzdC5cbiAgICAgICAgICB2YXIgcmFkaXhMb25nID0gZnJvbU51bWJlcihyYWRpeCksXG4gICAgICAgICAgICBkaXYgPSB0aGlzLmRpdihyYWRpeExvbmcpLFxuICAgICAgICAgICAgcmVtMSA9IGRpdi5tdWwocmFkaXhMb25nKS5zdWIodGhpcyk7XG4gICAgICAgICAgcmV0dXJuIGRpdi50b1N0cmluZyhyYWRpeCkgKyByZW0xLnRvSW50KCkudG9TdHJpbmcocmFkaXgpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFwiLVwiICsgdGhpcy5uZWcoKS50b1N0cmluZyhyYWRpeCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERvIHNldmVyYWwgKDYpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICAgICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgNiksIHRoaXMudW5zaWduZWQpLFxuICAgICAgICByZW0gPSB0aGlzO1xuICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVtRGl2ID0gcmVtLmRpdihyYWRpeFRvUG93ZXIpLFxuICAgICAgICAgIGludHZhbCA9IHJlbS5zdWIocmVtRGl2Lm11bChyYWRpeFRvUG93ZXIpKS50b0ludCgpID4+PiAwLFxuICAgICAgICAgIGRpZ2l0cyA9IGludHZhbC50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIHJlbSA9IHJlbURpdjtcbiAgICAgICAgaWYgKHJlbS5pc1plcm8oKSkgcmV0dXJuIGRpZ2l0cyArIHJlc3VsdDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKGRpZ2l0cy5sZW5ndGggPCA2KSBkaWdpdHMgPSBcIjBcIiArIGRpZ2l0cztcbiAgICAgICAgICByZXN1bHQgPSBcIlwiICsgZGlnaXRzICsgcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgaGlnaCBiaXRzXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0cyA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGlnaCAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGhpZ2ggYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldEhpZ2hCaXRzVW5zaWduZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID4+PiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTaWduZWQgbG93IGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldExvd0JpdHMgPSBmdW5jdGlvbiBnZXRMb3dCaXRzKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb3cgMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBVbnNpZ25lZCBsb3cgYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0TG93Qml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0TG93Qml0c1Vuc2lnbmVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG93ID4+PiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXROdW1CaXRzQWJzID0gZnVuY3Rpb24gZ2V0TnVtQml0c0FicygpIHtcbiAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSlcbiAgICAgICAgLy8gVW5zaWduZWQgTG9uZ3MgYXJlIG5ldmVyIG5lZ2F0aXZlXG4gICAgICAgIHJldHVybiB0aGlzLmVxKE1JTl9WQUxVRSkgPyA2NCA6IHRoaXMubmVnKCkuZ2V0TnVtQml0c0FicygpO1xuICAgICAgdmFyIHZhbCA9IHRoaXMuaGlnaCAhPSAwID8gdGhpcy5oaWdoIDogdGhpcy5sb3c7XG4gICAgICBmb3IgKHZhciBiaXQgPSAzMTsgYml0ID4gMDsgYml0LS0pIGlmICgodmFsICYgKDEgPDwgYml0KSkgIT0gMCkgYnJlYWs7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoICE9IDAgPyBiaXQgKyAzMyA6IGJpdCArIDE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZyBjYW4gYmUgc2FmZWx5IHJlcHJlc2VudGVkIGFzIGEgSmF2YVNjcmlwdCBudW1iZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNTYWZlSW50ZWdlciA9IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIoKSB7XG4gICAgICAvLyAyXjUzLTEgaXMgdGhlIG1heGltdW0gc2FmZSB2YWx1ZVxuICAgICAgdmFyIHRvcDExQml0cyA9IHRoaXMuaGlnaCA+PiAyMTtcbiAgICAgIC8vIFswLCAyXjUzLTFdXG4gICAgICBpZiAoIXRvcDExQml0cykgcmV0dXJuIHRydWU7XG4gICAgICAvLyA+IDJeNTMtMVxuICAgICAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFstMl41MywgLTFdIGV4Y2VwdCAtMl41M1xuICAgICAgcmV0dXJuIHRvcDExQml0cyA9PT0gLTEgJiYgISh0aGlzLmxvdyA9PT0gMCAmJiB0aGlzLmhpZ2ggPT09IC0weDIwMDAwMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IDAgJiYgdGhpcy5sb3cgPT09IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB6ZXJvLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2lzWmVyb30uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5lcXogPSBMb25nUHJvdG90eXBlLmlzWmVybztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG5lZ2F0aXZlLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzTmVnYXRpdmUgPSBmdW5jdGlvbiBpc05lZ2F0aXZlKCkge1xuICAgICAgcmV0dXJuICF0aGlzLnVuc2lnbmVkICYmIHRoaXMuaGlnaCA8IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIHBvc2l0aXZlIG9yIHplcm8uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNQb3NpdGl2ZSA9IGZ1bmN0aW9uIGlzUG9zaXRpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy51bnNpZ25lZCB8fCB0aGlzLmhpZ2ggPj0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgb2RkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQoKSB7XG4gICAgICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGV2ZW4uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNFdmVuID0gZnVuY3Rpb24gaXNFdmVuKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy51bnNpZ25lZCAhPT0gb3RoZXIudW5zaWduZWQgJiZcbiAgICAgICAgdGhpcy5oaWdoID4+PiAzMSA9PT0gMSAmJlxuICAgICAgICBvdGhlci5oaWdoID4+PiAzMSA9PT0gMVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID09PSBvdGhlci5oaWdoICYmIHRoaXMubG93ID09PSBvdGhlci5sb3c7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZXF1YWxzfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZXEgPSBMb25nUHJvdG90eXBlLmVxdWFscztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHMgPSBmdW5jdGlvbiBub3RFcXVhbHMob3RoZXIpIHtcbiAgICAgIHJldHVybiAhdGhpcy5lcSgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25vdEVxdWFsc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lcSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNub3RFcXVhbHN9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZSA9IExvbmdQcm90b3R5cGUubm90RXF1YWxzO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmxlc3NUaGFuID0gZnVuY3Rpb24gbGVzc1RoYW4ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW59LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sdCA9IExvbmdQcm90b3R5cGUubGVzc1RoYW47XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsID0gZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPD0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbk9yRXF1YWx9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sdGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubGUgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbDtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbiA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFufS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3QgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID49IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3RlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdlID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gICAgICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgaWYgKHRoaXMuZXEob3RoZXIpKSByZXR1cm4gMDtcbiAgICAgIHZhciB0aGlzTmVnID0gdGhpcy5pc05lZ2F0aXZlKCksXG4gICAgICAgIG90aGVyTmVnID0gb3RoZXIuaXNOZWdhdGl2ZSgpO1xuICAgICAgaWYgKHRoaXNOZWcgJiYgIW90aGVyTmVnKSByZXR1cm4gLTE7XG4gICAgICBpZiAoIXRoaXNOZWcgJiYgb3RoZXJOZWcpIHJldHVybiAxO1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgc2lnbiBiaXRzIGFyZSB0aGUgc2FtZVxuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcy5zdWIob3RoZXIpLmlzTmVnYXRpdmUoKSA/IC0xIDogMTtcbiAgICAgIC8vIEJvdGggYXJlIHBvc2l0aXZlIGlmIGF0IGxlYXN0IG9uZSBpcyB1bnNpZ25lZFxuICAgICAgcmV0dXJuIG90aGVyLmhpZ2ggPj4+IDAgPiB0aGlzLmhpZ2ggPj4+IDAgfHxcbiAgICAgICAgKG90aGVyLmhpZ2ggPT09IHRoaXMuaGlnaCAmJiBvdGhlci5sb3cgPj4+IDAgPiB0aGlzLmxvdyA+Pj4gMClcbiAgICAgICAgPyAtMVxuICAgICAgICA6IDE7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvbXBhcmV9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxuICAgICAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvbXAgPSBMb25nUHJvdG90eXBlLmNvbXBhcmU7XG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubmVnYXRlID0gZnVuY3Rpb24gbmVnYXRlKCkge1xuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkICYmIHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE1JTl9WQUxVRTtcbiAgICAgIHJldHVybiB0aGlzLm5vdCgpLmFkZChPTkUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBOZWdhdGVzIHRoaXMgTG9uZydzIHZhbHVlLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25lZ2F0ZX0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lZyA9IExvbmdQcm90b3R5cGUubmVnYXRlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gYWRkZW5kIEFkZGVuZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU3VtXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQoYWRkZW5kKSB7XG4gICAgICBpZiAoIWlzTG9uZyhhZGRlbmQpKSBhZGRlbmQgPSBmcm9tVmFsdWUoYWRkZW5kKTtcblxuICAgICAgLy8gRGl2aWRlIGVhY2ggbnVtYmVyIGludG8gNCBjaHVua3Mgb2YgMTYgYml0cywgYW5kIHRoZW4gc3VtIHRoZSBjaHVua3MuXG5cbiAgICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gICAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYjQ4ID0gYWRkZW5kLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGIzMiA9IGFkZGVuZC5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGIxNiA9IGFkZGVuZC5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGIwMCA9IGFkZGVuZC5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYzQ4ID0gMCxcbiAgICAgICAgYzMyID0gMCxcbiAgICAgICAgYzE2ID0gMCxcbiAgICAgICAgYzAwID0gMDtcbiAgICAgIGMwMCArPSBhMDAgKyBiMDA7XG4gICAgICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgICAgIGMwMCAmPSAweGZmZmY7XG4gICAgICBjMTYgKz0gYTE2ICsgYjE2O1xuICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gICAgICBjMTYgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGEzMiArIGIzMjtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGM0OCArPSBhNDggKyBiNDg7XG4gICAgICBjNDggJj0gMHhmZmZmO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24gc3VidHJhY3Qoc3VidHJhaGVuZCkge1xuICAgICAgaWYgKCFpc0xvbmcoc3VidHJhaGVuZCkpIHN1YnRyYWhlbmQgPSBmcm9tVmFsdWUoc3VidHJhaGVuZCk7XG4gICAgICByZXR1cm4gdGhpcy5hZGQoc3VidHJhaGVuZC5uZWcoKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3N1YnRyYWN0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBzdWJ0cmFoZW5kIFN1YnRyYWhlbmRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IERpZmZlcmVuY2VcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnN1YiA9IExvbmdQcm90b3R5cGUuc3VidHJhY3Q7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5tdWx0aXBseSA9IGZ1bmN0aW9uIG11bHRpcGx5KG11bHRpcGxpZXIpIHtcbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghaXNMb25nKG11bHRpcGxpZXIpKSBtdWx0aXBsaWVyID0gZnJvbVZhbHVlKG11bHRpcGxpZXIpO1xuXG4gICAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgICAgIGlmICh3YXNtKSB7XG4gICAgICAgIHZhciBsb3cgPSB3YXNtW1wibXVsXCJdKFxuICAgICAgICAgIHRoaXMubG93LFxuICAgICAgICAgIHRoaXMuaGlnaCxcbiAgICAgICAgICBtdWx0aXBsaWVyLmxvdyxcbiAgICAgICAgICBtdWx0aXBsaWVyLmhpZ2gsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChtdWx0aXBsaWVyLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBtdWx0aXBsaWVyLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuICAgICAgaWYgKG11bHRpcGxpZXIuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllci5uZWcoKSk7XG4gICAgICAgIGVsc2UgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIpLm5lZygpO1xuICAgICAgfSBlbHNlIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSlcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsKG11bHRpcGxpZXIubmVnKCkpLm5lZygpO1xuXG4gICAgICAvLyBJZiBib3RoIGxvbmdzIGFyZSBzbWFsbCwgdXNlIGZsb2F0IG11bHRpcGxpY2F0aW9uXG4gICAgICBpZiAodGhpcy5sdChUV09fUFdSXzI0KSAmJiBtdWx0aXBsaWVyLmx0KFRXT19QV1JfMjQpKVxuICAgICAgICByZXR1cm4gZnJvbU51bWJlcihcbiAgICAgICAgICB0aGlzLnRvTnVtYmVyKCkgKiBtdWx0aXBsaWVyLnRvTnVtYmVyKCksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcblxuICAgICAgLy8gRGl2aWRlIGVhY2ggbG9uZyBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIGFkZCB1cCA0eDQgcHJvZHVjdHMuXG4gICAgICAvLyBXZSBjYW4gc2tpcCBwcm9kdWN0cyB0aGF0IHdvdWxkIG92ZXJmbG93LlxuXG4gICAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gICAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGI0OCA9IG11bHRpcGxpZXIuaGlnaCA+Pj4gMTY7XG4gICAgICB2YXIgYjMyID0gbXVsdGlwbGllci5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGIxNiA9IG11bHRpcGxpZXIubG93ID4+PiAxNjtcbiAgICAgIHZhciBiMDAgPSBtdWx0aXBsaWVyLmxvdyAmIDB4ZmZmZjtcbiAgICAgIHZhciBjNDggPSAwLFxuICAgICAgICBjMzIgPSAwLFxuICAgICAgICBjMTYgPSAwLFxuICAgICAgICBjMDAgPSAwO1xuICAgICAgYzAwICs9IGEwMCAqIGIwMDtcbiAgICAgIGMxNiArPSBjMDAgPj4+IDE2O1xuICAgICAgYzAwICY9IDB4ZmZmZjtcbiAgICAgIGMxNiArPSBhMTYgKiBiMDA7XG4gICAgICBjMzIgKz0gYzE2ID4+PiAxNjtcbiAgICAgIGMxNiAmPSAweGZmZmY7XG4gICAgICBjMTYgKz0gYTAwICogYjE2O1xuICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gICAgICBjMTYgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGEzMiAqIGIwMDtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMTYgKiBiMTY7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjMzIgKz0gYTAwICogYjMyO1xuICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gICAgICBjMzIgJj0gMHhmZmZmO1xuICAgICAgYzQ4ICs9IGE0OCAqIGIwMCArIGEzMiAqIGIxNiArIGExNiAqIGIzMiArIGEwMCAqIGI0ODtcbiAgICAgIGM0OCAmPSAweGZmZmY7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbXVsdGlwbHl9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubXVsID0gTG9uZ1Byb3RvdHlwZS5tdWx0aXBseTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhlIHJlc3VsdCBpcyBzaWduZWQgaWYgdGhpcyBMb25nIGlzIHNpZ25lZCBvclxuICAgICAqICB1bnNpZ25lZCBpZiB0aGlzIExvbmcgaXMgdW5zaWduZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uIGRpdmlkZShkaXZpc29yKSB7XG4gICAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcbiAgICAgIGlmIChkaXZpc29yLmlzWmVybygpKSB0aHJvdyBFcnJvcihcImRpdmlzaW9uIGJ5IHplcm9cIik7XG5cbiAgICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICAgICAgaWYgKHdhc20pIHtcbiAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBzaWduZWQgZGl2aXNpb24gb3ZlcmZsb3c6IHRoZSBsYXJnZXN0XG4gICAgICAgIC8vIG5lZ2F0aXZlIG51bWJlciAvIC0xIHdvdWxkIGJlIDEgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3RcbiAgICAgICAgLy8gcG9zaXRpdmUgbnVtYmVyLCBkdWUgdG8gdHdvJ3MgY29tcGxlbWVudC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLnVuc2lnbmVkICYmXG4gICAgICAgICAgdGhpcy5oaWdoID09PSAtMHg4MDAwMDAwMCAmJlxuICAgICAgICAgIGRpdmlzb3IubG93ID09PSAtMSAmJlxuICAgICAgICAgIGRpdmlzb3IuaGlnaCA9PT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYmUgY29uc2lzdGVudCB3aXRoIG5vbi13YXNtIGNvZGUgcGF0aFxuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJkaXZfdVwiXSA6IHdhc21bXCJkaXZfc1wiXSkoXG4gICAgICAgICAgdGhpcy5sb3csXG4gICAgICAgICAgdGhpcy5oaWdoLFxuICAgICAgICAgIGRpdmlzb3IubG93LFxuICAgICAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgdmFyIGFwcHJveCwgcmVtLCByZXM7XG4gICAgICBpZiAoIXRoaXMudW5zaWduZWQpIHtcbiAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHNpZ25lZCBsb25ncyBhbmQgaXMgZGVyaXZlZCBmcm9tIHRoZVxuICAgICAgICAvLyBjbG9zdXJlIGxpYnJhcnkgYXMgYSB3aG9sZS5cbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xuICAgICAgICAgIGlmIChkaXZpc29yLmVxKE9ORSkgfHwgZGl2aXNvci5lcShORUdfT05FKSlcbiAgICAgICAgICAgIHJldHVybiBNSU5fVkFMVUU7IC8vIHJlY2FsbCB0aGF0IC1NSU5fVkFMVUUgPT0gTUlOX1ZBTFVFXG4gICAgICAgICAgZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKSByZXR1cm4gT05FO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB8b3RoZXJ8ID49IDIsIHNvIHx0aGlzL290aGVyfCA8IHxNSU5fVkFMVUV8LlxuICAgICAgICAgICAgdmFyIGhhbGZUaGlzID0gdGhpcy5zaHIoMSk7XG4gICAgICAgICAgICBhcHByb3ggPSBoYWxmVGhpcy5kaXYoZGl2aXNvcikuc2hsKDEpO1xuICAgICAgICAgICAgaWYgKGFwcHJveC5lcShaRVJPKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGl2aXNvci5pc05lZ2F0aXZlKCkgPyBPTkUgOiBORUdfT05FO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVtID0gdGhpcy5zdWIoZGl2aXNvci5tdWwoYXBwcm94KSk7XG4gICAgICAgICAgICAgIHJlcyA9IGFwcHJveC5hZGQocmVtLmRpdihkaXZpc29yKSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IubmVnKCkpO1xuICAgICAgICAgIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yKS5uZWcoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMuZGl2KGRpdmlzb3IubmVnKCkpLm5lZygpO1xuICAgICAgICByZXMgPSBaRVJPO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGFsZ29yaXRobSBiZWxvdyBoYXMgbm90IGJlZW4gbWFkZSBmb3IgdW5zaWduZWQgbG9uZ3MuIEl0J3MgdGhlcmVmb3JlXG4gICAgICAgIC8vIHJlcXVpcmVkIHRvIHRha2Ugc3BlY2lhbCBjYXJlIG9mIHRoZSBNU0IgcHJpb3IgdG8gcnVubmluZyBpdC5cbiAgICAgICAgaWYgKCFkaXZpc29yLnVuc2lnbmVkKSBkaXZpc29yID0gZGl2aXNvci50b1Vuc2lnbmVkKCk7XG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMpKSByZXR1cm4gVVpFUk87XG4gICAgICAgIGlmIChkaXZpc29yLmd0KHRoaXMuc2hydSgxKSkpXG4gICAgICAgICAgLy8gMTUgPj4+IDEgPSA3IDsgd2l0aCBkaXZpc29yID0gOCA7IHRydWVcbiAgICAgICAgICByZXR1cm4gVU9ORTtcbiAgICAgICAgcmVzID0gVVpFUk87XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcGVhdCB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSByZW1haW5kZXIgaXMgbGVzcyB0aGFuIG90aGVyOiAgZmluZCBhXG4gICAgICAvLyBmbG9hdGluZy1wb2ludCB0aGF0IGFwcHJveGltYXRlcyByZW1haW5kZXIgLyBvdGhlciAqZnJvbSBiZWxvdyosIGFkZCB0aGlzXG4gICAgICAvLyBpbnRvIHRoZSByZXN1bHQsIGFuZCBzdWJ0cmFjdCBpdCBmcm9tIHRoZSByZW1haW5kZXIuICBJdCBpcyBjcml0aWNhbCB0aGF0XG4gICAgICAvLyB0aGUgYXBwcm94aW1hdGUgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSByZWFsIHZhbHVlIHNvIHRoYXQgdGhlXG4gICAgICAvLyByZW1haW5kZXIgbmV2ZXIgYmVjb21lcyBuZWdhdGl2ZS5cbiAgICAgIHJlbSA9IHRoaXM7XG4gICAgICB3aGlsZSAocmVtLmd0ZShkaXZpc29yKSkge1xuICAgICAgICAvLyBBcHByb3hpbWF0ZSB0aGUgcmVzdWx0IG9mIGRpdmlzaW9uLiBUaGlzIG1heSBiZSBhIGxpdHRsZSBncmVhdGVyIG9yXG4gICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgYWN0dWFsIHZhbHVlLlxuICAgICAgICBhcHByb3ggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHJlbS50b051bWJlcigpIC8gZGl2aXNvci50b051bWJlcigpKSk7XG5cbiAgICAgICAgLy8gV2Ugd2lsbCB0d2VhayB0aGUgYXBwcm94aW1hdGUgcmVzdWx0IGJ5IGNoYW5naW5nIGl0IGluIHRoZSA0OC10aCBkaWdpdCBvclxuICAgICAgICAvLyB0aGUgc21hbGxlc3Qgbm9uLWZyYWN0aW9uYWwgZGlnaXQsIHdoaWNoZXZlciBpcyBsYXJnZXIuXG4gICAgICAgIHZhciBsb2cyID0gTWF0aC5jZWlsKE1hdGgubG9nKGFwcHJveCkgLyBNYXRoLkxOMiksXG4gICAgICAgICAgZGVsdGEgPSBsb2cyIDw9IDQ4ID8gMSA6IHBvd19kYmwoMiwgbG9nMiAtIDQ4KSxcbiAgICAgICAgICAvLyBEZWNyZWFzZSB0aGUgYXBwcm94aW1hdGlvbiB1bnRpbCBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlbWFpbmRlci4gIE5vdGVcbiAgICAgICAgICAvLyB0aGF0IGlmIGl0IGlzIHRvbyBsYXJnZSwgdGhlIHByb2R1Y3Qgb3ZlcmZsb3dzIGFuZCBpcyBuZWdhdGl2ZS5cbiAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCksXG4gICAgICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICAgICAgd2hpbGUgKGFwcHJveFJlbS5pc05lZ2F0aXZlKCkgfHwgYXBwcm94UmVtLmd0KHJlbSkpIHtcbiAgICAgICAgICBhcHByb3ggLT0gZGVsdGE7XG4gICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gsIHRoaXMudW5zaWduZWQpO1xuICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBrbm93IHRoZSBhbnN3ZXIgY2FuJ3QgYmUgemVyby4uLiBhbmQgYWN0dWFsbHksIHplcm8gd291bGQgY2F1c2VcbiAgICAgICAgLy8gaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHdlIHdvdWxkIG1ha2Ugbm8gcHJvZ3Jlc3MuXG4gICAgICAgIGlmIChhcHByb3hSZXMuaXNaZXJvKCkpIGFwcHJveFJlcyA9IE9ORTtcbiAgICAgICAgcmVzID0gcmVzLmFkZChhcHByb3hSZXMpO1xuICAgICAgICByZW0gPSByZW0uc3ViKGFwcHJveFJlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZGl2aWRlfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5kaXYgPSBMb25nUHJvdG90eXBlLmRpdmlkZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubW9kdWxvID0gZnVuY3Rpb24gbW9kdWxvKGRpdmlzb3IpIHtcbiAgICAgIGlmICghaXNMb25nKGRpdmlzb3IpKSBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xuXG4gICAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgICAgIGlmICh3YXNtKSB7XG4gICAgICAgIHZhciBsb3cgPSAodGhpcy51bnNpZ25lZCA/IHdhc21bXCJyZW1fdVwiXSA6IHdhc21bXCJyZW1fc1wiXSkoXG4gICAgICAgICAgdGhpcy5sb3csXG4gICAgICAgICAgdGhpcy5oaWdoLFxuICAgICAgICAgIGRpdmlzb3IubG93LFxuICAgICAgICAgIGRpdmlzb3IuaGlnaCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGRpdmlzb3IpLm11bChkaXZpc29yKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI21vZHVsb30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm1vZCA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucmVtID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIE5PVCBvZiB0aGlzIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5vdCA9IGZ1bmN0aW9uIG5vdCgpIHtcbiAgICAgIHJldHVybiBmcm9tQml0cyh+dGhpcy5sb3csIH50aGlzLmhpZ2gsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRMZWFkaW5nWmVyb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID8gTWF0aC5jbHozMih0aGlzLmhpZ2gpIDogTWF0aC5jbHozMih0aGlzLmxvdykgKyAzMjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCBsZWFkaW5nIHplcm9zLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvdW50TGVhZGluZ1plcm9zfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshbnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY2x6ID0gTG9uZ1Byb3RvdHlwZS5jb3VudExlYWRpbmdaZXJvcztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3Mgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvdW50VHJhaWxpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50VHJhaWxpbmdaZXJvcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvdyA/IGN0ejMyKHRoaXMubG93KSA6IGN0ejMyKHRoaXMuaGlnaCkgKyAzMjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCB0cmFpbGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudFRyYWlsaW5nWmVyb3N9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jdHogPSBMb25nUHJvdG90eXBlLmNvdW50VHJhaWxpbmdaZXJvcztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgQU5EIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uIGFuZChvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHRoaXMubG93ICYgb3RoZXIubG93LFxuICAgICAgICB0aGlzLmhpZ2ggJiBvdGhlci5oaWdoLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdGhpcy5sb3cgfCBvdGhlci5sb3csXG4gICAgICAgIHRoaXMuaGlnaCB8IG90aGVyLmhpZ2gsXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIFhPUiBvZiB0aGlzIExvbmcgYW5kIHRoZSBnaXZlbiBvbmUuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3Iob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB0aGlzLmxvdyBeIG90aGVyLmxvdyxcbiAgICAgICAgdGhpcy5oaWdoIF4gb3RoZXIuaGlnaCxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdCA9IGZ1bmN0aW9uIHNoaWZ0TGVmdChudW1CaXRzKSB7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICB0aGlzLmxvdyA8PCBudW1CaXRzLFxuICAgICAgICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgZWxzZSByZXR1cm4gZnJvbUJpdHMoMCwgdGhpcy5sb3cgPDwgKG51bUJpdHMgLSAzMiksIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0TGVmdH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hsID0gTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hpZnRSaWdodCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHQobnVtQml0cykge1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLFxuICAgICAgICAgIHRoaXMuaGlnaCA+PiBudW1CaXRzLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICB0aGlzLmhpZ2ggPj4gKG51bUJpdHMgLSAzMiksXG4gICAgICAgICAgdGhpcy5oaWdoID49IDAgPyAwIDogLTEsXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hyID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0VW5zaWduZWQobnVtQml0cykge1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgaWYgKG51bUJpdHMgPCAzMilcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgICAgICB0aGlzLmhpZ2ggPj4+IG51bUJpdHMsXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgMCwgdGhpcy51bnNpZ25lZCk7XG4gICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoID4+PiAobnVtQml0cyAtIDMyKSwgMCwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNocnUgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0VW5zaWduZWR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNocl91ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0ID0gZnVuY3Rpb24gcm90YXRlTGVmdChudW1CaXRzKSB7XG4gICAgICB2YXIgYjtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpO1xuICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xuICAgICAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYiksXG4gICAgICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG51bUJpdHMgLT0gMzI7XG4gICAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiBiKSxcbiAgICAgICAgKHRoaXMubG93IDw8IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA+Pj4gYiksXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVMZWZ0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RsID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVMZWZ0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0ID0gZnVuY3Rpb24gcm90YXRlUmlnaHQobnVtQml0cykge1xuICAgICAgdmFyIGI7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBudW1CaXRzIC09IDMyO1xuICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgICAgICh0aGlzLmhpZ2ggPDwgYikgfCAodGhpcy5sb3cgPj4+IG51bUJpdHMpLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZVJpZ2h0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RyID0gTG9uZ1Byb3RvdHlwZS5yb3RhdGVSaWdodDtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBzaWduZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2lnbmVkIGxvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvU2lnbmVkID0gZnVuY3Rpb24gdG9TaWduZWQoKSB7XG4gICAgICBpZiAoIXRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIHVuc2lnbmVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFVuc2lnbmVkIGxvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvVW5zaWduZWQgPSBmdW5jdGlvbiB0b1Vuc2lnbmVkKCkge1xuICAgICAgaWYgKHRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMubG93LCB0aGlzLmhpZ2gsIHRydWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCeXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzID0gZnVuY3Rpb24gdG9CeXRlcyhsZSkge1xuICAgICAgcmV0dXJuIGxlID8gdGhpcy50b0J5dGVzTEUoKSA6IHRoaXMudG9CeXRlc0JFKCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvQnl0ZXNMRSA9IGZ1bmN0aW9uIHRvQnl0ZXNMRSgpIHtcbiAgICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICAgICAgbG8gPSB0aGlzLmxvdztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGxvICYgMHhmZixcbiAgICAgICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIChsbyA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgbG8gPj4+IDI0LFxuICAgICAgICBoaSAmIDB4ZmYsXG4gICAgICAgIChoaSA+Pj4gOCkgJiAweGZmLFxuICAgICAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIGhpID4+PiAyNCxcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUFycmF5LjxudW1iZXI+fSBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvQnl0ZXNCRSA9IGZ1bmN0aW9uIHRvQnl0ZXNCRSgpIHtcbiAgICAgIHZhciBoaSA9IHRoaXMuaGlnaCxcbiAgICAgICAgbG8gPSB0aGlzLmxvdztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGhpID4+PiAyNCxcbiAgICAgICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgICAgICAoaGkgPj4+IDgpICYgMHhmZixcbiAgICAgICAgaGkgJiAweGZmLFxuICAgICAgICBsbyA+Pj4gMjQsXG4gICAgICAgIChsbyA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgKGxvID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIGxvICYgMHhmZixcbiAgICAgIF07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gbGUgV2hldGhlciBsaXR0bGUgb3IgYmlnIGVuZGlhbiwgZGVmYXVsdHMgdG8gYmlnIGVuZGlhblxuICAgICAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tQnl0ZXMgPSBmdW5jdGlvbiBmcm9tQnl0ZXMoYnl0ZXMsIHVuc2lnbmVkLCBsZSkge1xuICAgICAgcmV0dXJuIGxlXG4gICAgICAgID8gTG9uZy5mcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpXG4gICAgICAgIDogTG9uZy5mcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJ5dGVzTEUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNMRShieXRlcywgdW5zaWduZWQpIHtcbiAgICAgIHJldHVybiBuZXcgTG9uZyhcbiAgICAgICAgYnl0ZXNbMF0gfCAoYnl0ZXNbMV0gPDwgOCkgfCAoYnl0ZXNbMl0gPDwgMTYpIHwgKGJ5dGVzWzNdIDw8IDI0KSxcbiAgICAgICAgYnl0ZXNbNF0gfCAoYnl0ZXNbNV0gPDwgOCkgfCAoYnl0ZXNbNl0gPDwgMTYpIHwgKGJ5dGVzWzddIDw8IDI0KSxcbiAgICAgICAgdW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJ5dGVzIEJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJ5dGVzQkUgPSBmdW5jdGlvbiBmcm9tQnl0ZXNCRShieXRlcywgdW5zaWduZWQpIHtcbiAgICAgIHJldHVybiBuZXcgTG9uZyhcbiAgICAgICAgKGJ5dGVzWzRdIDw8IDI0KSB8IChieXRlc1s1XSA8PCAxNikgfCAoYnl0ZXNbNl0gPDwgOCkgfCBieXRlc1s3XSxcbiAgICAgICAgKGJ5dGVzWzBdIDw8IDI0KSB8IChieXRlc1sxXSA8PCAxNikgfCAoYnl0ZXNbMl0gPDwgOCkgfCBieXRlc1szXSxcbiAgICAgICAgdW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBTdXBwb3J0IGNvbnZlcnNpb24gdG8vZnJvbSBCaWdJbnQgd2hlcmUgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBCaWdJbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGJpZyBpbnRlZ2VyLlxuICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIGJpZyBpbnRlZ2VyIHZhbHVlXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgICAqL1xuICAgICAgTG9uZy5mcm9tQmlnSW50ID0gZnVuY3Rpb24gZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgICAgdmFyIGxvd0JpdHMgPSBOdW1iZXIoQmlnSW50LmFzSW50TigzMiwgdmFsdWUpKTtcbiAgICAgICAgdmFyIGhpZ2hCaXRzID0gTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsIHZhbHVlID4+IEJpZ0ludCgzMikpKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBPdmVycmlkZVxuICAgICAgTG9uZy5mcm9tVmFsdWUgPSBmdW5jdGlvbiBmcm9tVmFsdWVXaXRoQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSByZXR1cm4gZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpO1xuICAgICAgICByZXR1cm4gZnJvbVZhbHVlKHZhbHVlLCB1bnNpZ25lZCk7XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGl0cyBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAgICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgICAqIEByZXR1cm5zIHtiaWdpbnR9XG4gICAgICAgKi9cbiAgICAgIExvbmdQcm90b3R5cGUudG9CaWdJbnQgPSBmdW5jdGlvbiB0b0JpZ0ludCgpIHtcbiAgICAgICAgdmFyIGxvd0JpZ0ludCA9IEJpZ0ludCh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgICAgIHZhciBoaWdoQmlnSW50ID0gQmlnSW50KHRoaXMudW5zaWduZWQgPyB0aGlzLmhpZ2ggPj4+IDAgOiB0aGlzLmhpZ2gpO1xuICAgICAgICByZXR1cm4gKGhpZ2hCaWdJbnQgPDwgQmlnSW50KDMyKSkgfCBsb3dCaWdJbnQ7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgX2RlZmF1bHQgPSAoX2V4cG9ydHMuZGVmYXVsdCA9IExvbmcpO1xuICB9LFxuKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gSGVscGVycy5cbmNvbnN0IHMgPSAxMDAwO1xuY29uc3QgbSA9IHMgKiA2MDtcbmNvbnN0IGggPSBtICogNjA7XG5jb25zdCBkID0gaCAqIDI0O1xuY29uc3QgdyA9IGQgKiA3O1xuY29uc3QgeSA9IGQgKiAzNjUuMjU7XG5mdW5jdGlvbiBtcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zPy5sb25nID8gZm10TG9uZyh2YWx1ZSkgOiBmbXRTaG9ydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBpcyBub3QgYSBzdHJpbmcgb3IgbnVtYmVyLicpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGlzRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICA/IGAke2Vycm9yLm1lc3NhZ2V9LiB2YWx1ZT0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgICAgICA6ICdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG59XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy4nKTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICBjb25zdCB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3lyJzpcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHk7XG4gICAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB3O1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGQ7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hycyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGg7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIG07XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2VjJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHM7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbXNlY3MnOlxuICAgICAgICBjYXNlICdtc2VjJzpcbiAgICAgICAgY2FzZSAnbXMnOlxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ci5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHVuaXQgJHt0eXBlfSB3YXMgbWF0Y2hlZCwgYnV0IG5vIG1hdGNoaW5nIGNhc2UgZXhpc3RzLmApO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IG1zO1xuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBkKX1kYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBoKX1oYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBtKX1tYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBzKX1zYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfW1zYDtcbn1cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfSBtc2A7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgY29uc3QgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbil9ICR7bmFtZX0ke2lzUGx1cmFsID8gJ3MnIDogJyd9YDtcbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnbWVzc2FnZScgaW4gZXJyb3I7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQ7XG4iLCIvLyBIZWxwZXJzLlxuY29uc3QgcyA9IDEwMDA7XG5jb25zdCBtID0gcyAqIDYwO1xuY29uc3QgaCA9IG0gKiA2MDtcbmNvbnN0IGQgPSBoICogMjQ7XG5jb25zdCB3ID0gZCAqIDc7XG5jb25zdCB5ID0gZCAqIDM2NS4yNTtcbmZ1bmN0aW9uIG1zKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM/LmxvbmcgPyBmbXRMb25nKHZhbHVlKSA6IGZtdFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGlzIG5vdCBhIHN0cmluZyBvciBudW1iZXIuJyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gaXNFcnJvcihlcnJvcilcbiAgICAgICAgICAgID8gYCR7ZXJyb3IubWVzc2FnZX0uIHZhbHVlPSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWBcbiAgICAgICAgICAgIDogJ0FuIHVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn1cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICovXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLicpO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIGNvbnN0IHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdW5pdCAke3R5cGV9IHdhcyBtYXRjaGVkLCBidXQgbm8gbWF0Y2hpbmcgY2FzZSBleGlzdHMuYCk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgbXM7XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqL1xuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIGQpfWRgO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIGgpfWhgO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG0pfW1gO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIHMpfXNgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXN9bXNgO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqL1xuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXN9IG1zYDtcbn1cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICBjb25zdCBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBuKX0gJHtuYW1lfSR7aXNQbHVyYWwgPyAncycgOiAnJ31gO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGVycm9ycy5cbiAqL1xuZnVuY3Rpb24gaXNFcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdtZXNzYWdlJyBpbiBlcnJvcjtcbn1cbiIsIlxuY2xhc3MgUHJvZ3Jlc3NTcGFuIHtcbiAgICB1bml0c0RvbmU6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBQcm9ncmVzcywgcHVibGljIHBhcmVudFVuaXRzOiBudW1iZXIsIHB1YmxpYyBzcGFuVW5pdHM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnVuaXRzRG9uZSA9IDA7XG4gICAgfVxuXG4gICAgZG9uZSh1bml0cz86IG51bWJlcikge1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLnNwYW5Vbml0cyAtIHRoaXMudW5pdHNEb25lO1xuICAgICAgICBpZiAoIXJlbWFpbmluZykgcmV0dXJuOyAvLyBpZ25vcmUgaWYgYWxyZWFkeSBkb25lXG4gICAgICAgIGlmICghdW5pdHMgfHwgdW5pdHMgPiByZW1haW5pbmcpIHtcbiAgICAgICAgICAgIHVuaXRzID0gcmVtYWluaW5nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5pdHNEb25lICs9IHVuaXRzO1xuICAgICAgICB0aGlzLnBhcmVudC5kb25lKHVuaXRzICogdGhpcy5wYXJlbnRVbml0cyAvIHRoaXMuc3BhblVuaXRzKTtcbiAgICB9XG5cbiAgICBnZXQgcGFyZW50VW5pdHNEb25lKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnVuaXRzRG9uZSAqIHRoaXMucGFyZW50VW5pdHMgLyB0aGlzLnNwYW5Vbml0cyk7XG4gICAgfVxuXG4gICAgZ2V0IGlzRG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pdHNEb25lID49IHRoaXMuc3BhblVuaXRzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyZXNzIHtcbiAgICB1bml0c0RvbmU6IG51bWJlciA9IDA7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdG90YWw6IG51bWJlcikge1xuICAgIH1cblxuICAgIGdldCBmcmFjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pdHNEb25lIC8gdGhpcy50b3RhbDtcbiAgICB9XG5cbiAgICBnZXQgcGVyY2VudCgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5mcmFjdGlvbiAqIDEwMCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzRG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pdHNEb25lID49IHRoaXMudG90YWw7XG4gICAgfVxuXG4gICAgZG9uZSh1bml0cz86IG51bWJlcikge1xuICAgICAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLnRvdGFsIC0gdGhpcy51bml0c0RvbmU7XG4gICAgICAgIGlmICghcmVtYWluaW5nKSByZXR1cm47IC8vIGlnbm9yZSBpZiBhbHJlYWR5IGRvbmVcbiAgICAgICAgaWYgKCF1bml0cyB8fCB1bml0cyA+IHJlbWFpbmluZykge1xuICAgICAgICAgICAgdW5pdHMgPSByZW1haW5pbmc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bml0c0RvbmUgKz0gdW5pdHM7XG4gICAgfVxuXG4gICAgc3Bhbih1bml0czogbnVtYmVyLCBzcGFuVW5pdHM/OiBudW1iZXIpOiBQcm9ncmVzc1NwYW4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb2dyZXNzU3Bhbih0aGlzLCB1bml0cywgc3BhblVuaXRzIHx8IHVuaXRzKTtcbiAgICB9XG59IiwiLyoqXG4gKiBAbW9kdWxlIGFjY2Vzcy1jb250cm9sXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFjY2VzcyBjb250cm9sIGludGVyZmFjZXNcbiAqL1xuXG5pbXBvcnQgeyBQcm9qZWN0Um9sZXMgfSBmcm9tIFwiLi9wcm9qZWN0LmpzXCI7XG5cbmV4cG9ydCBlbnVtIFBlcm1pc3Npb24ge1xuICAgIGludF9yZWFkID0gXCJpbnRlcmFjdGlvbjpyZWFkXCIsXG4gICAgaW50X3dyaXRlID0gXCJpbnRlcmFjdGlvbjp3cml0ZVwiLFxuICAgIGludF9kZWxldGUgPSBcImludGVyYWN0aW9uOmRlbGV0ZVwiLFxuXG4gICAgaW50X2V4ZWN1dGUgPSBcImludGVyYWN0aW9uOmV4ZWN1dGVcIixcbiAgICBydW5fcmVhZCA9IFwicnVuOnJlYWRcIixcbiAgICBydW5fd3JpdGUgPSBcInJ1bjp3cml0ZVwiLFxuXG4gICAgZW52X21hbmFnZSA9IFwiZW52aXJvbm1lbnQ6bWFuYWdlXCIsXG5cbiAgICBwcm9qZWN0X21hbmFnZSA9IFwicHJvamVjdDptYW5hZ2VcIixcblxuICAgIGFwaV9rZXlfY3JlYXRlID0gXCJhcGlfa2V5OmNyZWF0ZVwiLFxuICAgIGFwaV9rZXlfcmVhZCA9IFwiYXBpX2tleTpyZWFkXCIsXG5cbiAgICBhY2NvdW50X3JlYWQgPSBcImFjY291bnQ6cmVhZFwiLFxuICAgIGFjY291bnRfbWFuYWdlID0gXCJhY2NvdW50Om1hbmFnZVwiLFxuICAgIG1hbmFnZV9iaWxsaW5nID0gXCJhY2NvdW50OmJpbGxpbmdcIixcbiAgICBhY2NvdW50X21lbWJlciA9IFwiYWNjb3VudDptZW1iZXJcIixcblxuXG4gICAgY29udGVudF9yZWFkID0gXCJjb250ZW50OnJlYWRcIixcbiAgICBjb250ZW50X2NyZWF0ZSA9IFwiY29udGVudDpjcmVhdGVcIixcbiAgICBjb250ZW50X3VwZGF0ZSA9IFwiY29udGVudDp1cGRhdGVcIixcbiAgICBjb250ZW50X2RlbGV0ZSA9IFwiY29udGVudDpkZWxldGVcIixcblxuICAgIGNvbnRlbnRfYWRtaW4gPSBcImNvbnRlbnQ6YWRtaW5cIiwgLy9tYW5hZ2Ugc2NoZW1hcywgd29ya2Zsb3dzLCBydWxlc1xuXG4gICAgd29ya2Zsb3dfcnVuID0gXCJ3b3JrZmxvdzpydW5cIixcbn1cblxuZXhwb3J0IGVudW0gQWNjZXNzQ29udHJvbGxlZFJlc291cmNlIHtcbiAgICBwcm9qZWN0ID0gXCJwcm9qZWN0XCIsXG4gICAgZW52aXJvbm1lbnQgPSBcImVudmlyb25tZW50XCIsXG4gICAgYWNjb3VudCA9IFwiYWNjb3VudFwiLFxuICAgIGludGVyYWN0aW9uID0gXCJpbnRlcmFjdGlvblwiLFxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzQ29udHJvbEVudHJ5IHtcbiAgICByb2xlOiBQcm9qZWN0Um9sZXM7XG4gICAgcmVzb3VyY2U6IHN0cmluZzsgLy9vYmplY3RJZFxuICAgIHByaW5jaXBhbDogc3RyaW5nOyAvL29iamVjdElkXG4gICAgdHlwZTogQWNjZXNzQ29udHJvbGxlZFJlc291cmNlO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBleHBpcmVzX2F0Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9hdD86IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFDRUNyZWF0ZVBheWxvYWQgZXh0ZW5kc1xuICAgIE9taXQ8QWNjZXNzQ29udHJvbEVudHJ5LCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJpZFwiPiB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUNFVXBkYXRlUGF5bG9hZCBleHRlbmRzIFBhcnRpYWw8QUNFQ3JlYXRlUGF5bG9hZD4ge1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWNlc1F1ZXJ5T3B0aW9ucyB7XG5cbiAgICBsZXZlbD86ICdyZXNvdXJjZScgfCAncHJvamVjdCcgfCAnYWNjb3VudCdcbiAgICByZXNvdXJjZT86IHN0cmluZ1xuICAgIHByaW5jaXBhbD86IHN0cmluZ1xuICAgIHJvbGU/OiBzdHJpbmdcbiAgICB0eXBlPzogQWNjZXNzQ29udHJvbGxlZFJlc291cmNlXG5cbn0iLCJcbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl0aWNzQXhpcyB7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgcHJvamVjdD86IHN0cmluZztcbiAgICBpbnRlcmFjdGlvbnM/OiBzdHJpbmdbXTtcbiAgICBtb2RlbHM/OiBzdHJpbmdbXTtcbiAgICBzdGF0dXM/OiBzdHJpbmdbXTtcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgc2VsZWN0ZWRPbmx5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5BbmFseXRpY3NRdWVyeSB7XG5cbiAgICAvKiogZmlsdGVycyB0byBhcHBseSB0byB0aGUgcXVlcnkgKi9cbiAgICBmaWx0ZXJCeTogQW5hbHl0aWNzQXhpcztcblxuICAgIC8qKiBUaGUgZmllbGQgdG8gZ3JvdXAgYnkgKi9cbiAgICBncm91cEJ5PzogUnVuQW5hbHl0aWNzR3JvdXBCeVxuXG4gICAgLyoqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBxdWVyeSBpbiBFUE9DSCBmb3JtYXQgKi9cbiAgICBmcm9tPzogbnVtYmVyO1xuICAgIC8qKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHF1ZXJ5IGluIEVQT0NIIGZvcm1hdCAqL1xuICAgIHRvPzogbnVtYmVyO1xuXG4gICAgLyoqIFRoZSB0aW1lIHJlc29sdXRpb24gb2YgdGhlIGFuYWx5dGljcyBxdWVyeSAqL1xuICAgIHJlc29sdXRpb24/OiBUaW1lUmVzb2x1dGlvbjtcblxuICAgIC8qKiBUaGUgZmllbGQgdG8gc29ydCBieSAqL1xuICAgIHZpcnR1YWw/OiBib29sZWFuO1xuXG59XG5cblxuZXhwb3J0IHR5cGUgUnVuQW5hbHl0aWNzR3JvdXBCeSA9IFwiaW50ZXJhY3Rpb25cIiB8IFwibW9kZWxJZFwiIHwgXCJwcm9qZWN0XCIgfCBcInN0YXR1c1wiIHwgXCJ0YWdzXCIgfCBcImVudmlyb25tZW50XCI7XG5cbmV4cG9ydCB0eXBlIFRpbWVSZXNvbHV0aW9uID0gXCJob3VyXCIgfCBcImRheVwiIHwgXCJ3ZWVrXCIgfCBcIm1vbnRoXCIgfCBcInllYXJcIjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkFuYWx5dGljc1Jlc3VsdCB7XG4gICAgZGF0ZTogc3RyaW5nLFxuICAgIHRpbWVzdGFtcDogc3RyaW5nLFxuICAgIGdyb3VwOiBzdHJpbmdcbiAgICBjb3VudDogbnVtYmVyLFxuICAgIGV4ZWN1dGlvbl90aW1lOiB7XG4gICAgICAgIGF2ZzogbnVtYmVyLFxuICAgICAgICBtaW46IG51bWJlcixcbiAgICAgICAgbWF4OiBudW1iZXJcbiAgICB9LFxufVxuIiwiaW1wb3J0IHsgUHJvamVjdFJlZiwgUHJvamVjdFJvbGVzIH0gZnJvbSBcIi4vcHJvamVjdC5qc1wiO1xuaW1wb3J0IHsgQWNjb3VudFJlZiB9IGZyb20gXCIuL3VzZXIuanNcIjtcblxuXG5leHBvcnQgZW51bSBBcGlLZXlUeXBlcyB7XG4gICAgcHVibGljID0gJ3BrJyxcbiAgICBzZWNyZXQgPSAnc2snXG59XG5leHBvcnQgaW50ZXJmYWNlIEFwaUtleSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogQXBpS2V5VHlwZXM7XG4gICAgcm9sZTogUHJvamVjdFJvbGVzO1xuICAgIG1hc2tlZFZhbHVlPzogc3RyaW5nOyAvL21hc2tlZCB2YWx1ZVxuICAgIGFjY291bnQ6IHN0cmluZzsgLy8gdGhlIGFjY291bnQgaWRcbiAgICBwcm9qZWN0OiBzdHJpbmc7IC8vIHRoZSBwcm9qZWN0IGlkIGlmIGFueVxuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgY3JlYXRlZF9ieTogc3RyaW5nLFxuICAgIHVwZGF0ZWRfYnk6IHN0cmluZyxcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVwZGF0ZWRfYXQ6IERhdGU7XG4gICAgZXhwaXJlc19hdD86IERhdGU7IC8vIGluIGNhc2Ugb2YgcHVibGljIGtleSBvbmx5XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPclVwZGF0ZUFwaUtleVBheWxvYWQgZXh0ZW5kcyBQYXJ0aWFsPEFwaUtleT4ge1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpS2V5V2l0aFZhbHVlIGV4dGVuZHMgT21pdDxBcGlLZXksICdtYXNrZWRWYWx1ZSc+IHtcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHVibGljS2V5UGF5bG9hZCB7XG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBwcm9qZWN0SWQ/OiBzdHJpbmcsXG4gICAgdHRsPzogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhUb2tlblJlc3BvbnNlIHtcbiAgICB0b2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhUb2tlblBheWxvYWQge1xuICAgIHN1Yjogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIHBpY3R1cmU/OiBzdHJpbmc7XG5cbiAgICB0eXBlOiBQcmluY2lwYWxUeXBlXG4gICAgYWNjb3VudDogQWNjb3VudFJlZjtcbiAgICBhY2NvdW50X3JvbGVzOiBQcm9qZWN0Um9sZXNbXTtcbiAgICBhY2NvdW50czogQWNjb3VudFJlZltdO1xuICAgIHByb2plY3Q/OiBQcm9qZWN0UmVmO1xuICAgIHByb2plY3Rfcm9sZXM/OiBQcm9qZWN0Um9sZXNbXTtcblxuICAgIGlzczogc3RyaW5nOyAvL2lzc3VlclxuICAgIGF1ZDogc3RyaW5nOyAvL2F1ZGllbmNlXG4gICAgZXhwOiBudW1iZXI7IC8vZXhwaXJlcyBpbiAoRVBPQyBzZWNvbmRzKVxufVxuXG5cbmV4cG9ydCBlbnVtIFByaW5jaXBhbFR5cGUge1xuICAgIFVzZXIgPSBcInVzZXJcIixcbiAgICBBcGlLZXkgPSBcImFwaWtleVwiLFxuICAgIFNlcnZpY2VBY2NvdW50ID0gXCJzZXJ2aWNlX2FjY291bnRcIixcbn0iLCJleHBvcnQgaW50ZXJmYWNlIEZpbmRQYXlsb2FkIHtcbiAgICBxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgc2VsZWN0Pzogc3RyaW5nO1xuICAgIGFsbF9yZXZpc2lvbnM/OiBib29sZWFuO1xuICAgIGZyb21fcm9vdD86IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNDb21tYW5kUmVzcG9uc2Uge1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBlcnI/OiBhbnk7XG4gICAgZGV0YWlscz86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uUGF5bG9hZCB7XG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiBuYW1lXG4gICAgICovXG4gICAgbmFtZTogXCJjaGFuZ2VfdHlwZVwiIHwgXCJkZWxldGVcIiB8IFwic3RhcnRfd29ya2Zsb3dcIiB8IFwidXBkYXRlXCI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSURzIG9mIHRoZSBvYmplY3RzIHRvIG9wZXJhdGUgb25cbiAgICAgKi9cbiAgICBpZHM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wZXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uUmVzdWx0IHtcbiAgICBzdGF0dXM6IFwiaW5fcHJvZ3Jlc3NcIiB8IFwiY29tcGxldGVkXCIgfCBcImZhaWxlZFwiO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBSU1vZGVsLCBUZXh0RmFsbGJhY2tPcHRpb25zIH0gZnJvbSBcIkBsbHVtaXZlcnNlL2NvbW1vblwiO1xuXG5cbmV4cG9ydCBlbnVtIFN1cHBvcnRlZFByb3ZpZGVycyB7XG4gICAgLy8gZnJvbSBsbHVtaXZlcnNlXG4gICAgb3BlbmFpID0gJ29wZW5haScsXG4gICAgYXp1cmVfb3BlbmFpID0gJ2F6dXJlX29wZW5haScsXG4gICAgaHVnZ2luZ2ZhY2VfaWUgPSAnaHVnZ2luZ2ZhY2VfaWUnLFxuICAgIHJlcGxpY2F0ZSA9ICdyZXBsaWNhdGUnLFxuICAgIGJlZHJvY2sgPSAnYmVkcm9jaycsXG4gICAgdmVydGV4YWkgPSAndmVydGV4YWknLFxuICAgIHRvZ2V0aGVyYWkgPSAndG9nZXRoZXJhaScsXG4gICAgbWlzdHJhbGFpID0gJ21pc3RyYWxhaScsXG4gICAgZ3JvcSA9ICdncm9xJyxcbiAgICB3YXRzb254ID0gJ3dhdHNvbngnLFxuICAgIC8vIGZyb20gc3R1ZGlvXG4gICAgdmlydHVhbF9sYiA9ICd2aXJ0dWFsX2xiJyxcbiAgICB2aXJ0dWFsX21lZGlhdG9yID0gJ3ZpcnR1YWxfbWVkaWF0b3InLFxuICAgIHRlc3QgPSAndGVzdCdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdXBwb3J0ZWRQcm92aWRlclBhcmFtcyB7XG4gICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcmVxdWlyZXNBcGlLZXk6IGJvb2xlYW47XG4gICAgcmVxdWlyZXNFbmRwb2ludFVybDogYm9vbGVhbjtcbiAgICBlbmRwb2ludFBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIHN1cHBvcnRTZWFyY2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkUHJvdmlkZXJzTGlzdDogUmVjb3JkPFN1cHBvcnRlZFByb3ZpZGVycywgU3VwcG9ydGVkUHJvdmlkZXJQYXJhbXM+ID0ge1xuICAgICdvcGVuYWknOlxuICAgIHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy5vcGVuYWksXG4gICAgICAgIG5hbWU6IFwiT3BlbkFJXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiB0cnVlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbiAgICAnYXp1cmVfb3BlbmFpJzpcbiAgICB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMuYXp1cmVfb3BlbmFpLFxuICAgICAgICBuYW1lOiBcIkF6dXJlIE9wZW5BSVwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IHRydWUsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlLFxuICAgIH0sXG4gICAgJ2h1Z2dpbmdmYWNlX2llJzpcbiAgICB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMuaHVnZ2luZ2ZhY2VfaWUsXG4gICAgICAgIG5hbWU6IFwiSHVnZ2luZ0ZhY2UgSW5mZXJlbmNlIEVuZHBvaW50XCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiB0cnVlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiB0cnVlLFxuICAgIH0sXG4gICAgJ3JlcGxpY2F0ZSc6XG4gICAge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLnJlcGxpY2F0ZSxcbiAgICAgICAgbmFtZTogXCJSZXBpY2F0ZVwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IHRydWUsXG4gICAgfSxcbiAgICAnYmVkcm9jayc6XG4gICAge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLmJlZHJvY2ssXG4gICAgICAgIG5hbWU6IFwiQVdTIEJlZHJvY2tcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IGZhbHNlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgZW5kcG9pbnRQbGFjZWhvbGRlcjogXCJyZWdpb24gbmFtZSAoZWcuIHVzLWVhc3QtMSlcIixcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbiAgICB2ZXJ0ZXhhaToge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLnZlcnRleGFpLFxuICAgICAgICBuYW1lOiBcIkdvb2dsZSBWZXJ0ZXggQUlcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IGZhbHNlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbiAgICB0b2dldGhlcmFpOiB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMudG9nZXRoZXJhaSxcbiAgICAgICAgbmFtZTogXCJUb2dldGhlciBBSVwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxuICAgIG1pc3RyYWxhaToge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLm1pc3RyYWxhaSxcbiAgICAgICAgbmFtZTogXCJNaXN0cmFsIEFJXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlLFxuICAgIH0sXG4gICAgZ3JvcToge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLmdyb3EsXG4gICAgICAgIG5hbWU6IFwiR3JvcSBDbG91ZFwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxuICAgIHdhdHNvbng6IHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy53YXRzb254LFxuICAgICAgICBuYW1lOiBcIklCTSBXYXRzb25YXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiB0cnVlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiB0cnVlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZVxuICAgIH0sXG4gICAgJ3ZpcnR1YWxfbGInOlxuICAgIHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy52aXJ0dWFsX2xiLFxuICAgICAgICBuYW1lOiBcIlZpcnR1YWwgLSBMb2FkIEJhbGFuY2VyXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlLFxuICAgIH0sXG4gICAgJ3ZpcnR1YWxfbWVkaWF0b3InOlxuICAgIHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy52aXJ0dWFsX21lZGlhdG9yLFxuICAgICAgICBuYW1lOiBcIlZpcnR1YWwgLSBNZWRpYXRvclwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxuICAgICd0ZXN0Jzoge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLnRlc3QsXG4gICAgICAgIG5hbWU6IFwiVGVzdCBMTE1cIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IGZhbHNlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbn07XG5cblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsRW52RW50cnkge1xuICAgIG1vZGVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tIGNvbmZpZ3VyYXRpb24gZm9yIHZpcnR1YWwgZW52aXJvbm1lbnRzXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNpbmdFbnZDb25maWcge1xuICAgIGVudHJpZXM/OiBMb2FkQmFsYW5jaW5nRW52RW50cnlDb25maWdbXTtcbiAgICBiYWxhbmNlX2lmX2ZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEJhbGFuY2luZ0VudkVudHJ5Q29uZmlnIGV4dGVuZHMgVmlydHVhbEVudkVudHJ5IHtcbiAgICB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZWRpYXRvckVudkNvbmZpZyB7XG4gICAgZW50cmllcz86IFZpcnR1YWxFbnZFbnRyeVtdO1xuICAgIG1heF9jb25jdXJyZW50X3JlcXVlc3RzPzogbnVtYmVyO1xuICAgIC8vIHRoZSBtb2RlbCB1c2VkIHRvIGV2YWx1YXRlIHRoZSByZXNwb25zZXMuIElmIG5vdCBzcGVjaWZpZWQgYWxsIGVudHJpZXMgd2lsbCBtZWRpYXRlcyB0aGUgcmVzcG9uc2VcbiAgICAvLyBhbmQgdGhlIGJlc3QgcmVzcG9uc2Ugd2lsbCBiZSBwaWNrZWRcbiAgICBtZWRpYXRvcnM/OiBWaXJ0dWFsRW52RW50cnlbXTtcbiAgICBtb2RlbF9vcHRpb25zPzogVGV4dEZhbGxiYWNrT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25FbnZpcm9ubWVudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcHJvdmlkZXI6IFN1cHBvcnRlZFByb3ZpZGVycztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBlbmRwb2ludF91cmw/OiBzdHJpbmc7XG4gICAgZGVmYXVsdF9tb2RlbD86IHN0cmluZztcbiAgICBlbmFibGVkX21vZGVscz86IEFJTW9kZWxbXTtcbiAgICBhcGlLZXk/OiBzdHJpbmc7XG4gICAgY29uZmlnPzogYW55O1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBhbGxvd2VkX3Byb2plY3RzPzogc3RyaW5nW107XG4gICAgY3JlYXRlZF9ieTogc3RyaW5nLFxuICAgIHVwZGF0ZWRfYnk6IHN0cmluZyxcbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkVudmlyb25tZW50UmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBwcm92aWRlcjogU3VwcG9ydGVkUHJvdmlkZXJzO1xuICAgIGVuYWJsZWRfbW9kZWxzPzogQUlNb2RlbFtdO1xuICAgIGRlZmF1bHRfbW9kZWw/OiBzdHJpbmc7XG4gICAgZW5kcG9pbnRfdXJsPzogc3RyaW5nO1xuICAgIGFsbG93ZWRfcHJvamVjdHM/OiBzdHJpbmdbXTtcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgY3JlYXRlZF9ieTogc3RyaW5nO1xuICAgIHVwZGF0ZWRfYnk6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgRXhlY3V0aW9uRW52aXJvbm1lbnRSZWZQb3B1bGF0ZSA9IFwiaWQgbmFtZSBwcm92aWRlciBlbmFibGVkX21vZGVscyBkZWZhdWx0X21vZGVsIGVuZHBvaW50X3VybCBhbGxvd2VkX3Byb2plY3RzIGFjY291bnQgY3JlYXRlZF9hdCB1cGRhdGVkX2F0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uRW52aXJvbm1lbnRDcmVhdGVQYXlsb2FkIGV4dGVuZHMgT21pdDxFeGVjdXRpb25FbnZpcm9ubWVudCwgJ2lkJyB8ICdhY2NvdW50JyB8ICdjcmVhdGVkX2F0JyB8ICd1cGRhdGVkX2F0JyB8ICdjcmVhdGVkX2J5JyB8ICd1cGRhdGVkX2J5JyB8ICdwcm9qZWN0Jz4geyB9XG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkVudmlyb25tZW50VXBkYXRlUGF5bG9hZCBleHRlbmRzIFBhcnRpYWw8T21pdDxFeGVjdXRpb25FbnZpcm9ubWVudCwgJ2lkJyB8ICdhY2NvdW50JyB8ICdjcmVhdGVkX2F0JyB8ICd1cGRhdGVkX2F0JyB8ICdjcmVhdGVkX2J5JyB8ICd1cGRhdGVkX2J5Jz4+IHsgfVxuIiwiXG4vLyB0aGlzIGlzIHRoZSBtb25nbyBkZWZpbml0aW9uIG9mIGEgZmFjZXQuIHNlZSBodHRwczovL3d3dy5tb25nb2RiLmNvbS9kb2NzL2F0bGFzL2F0bGFzLXNlYXJjaC9mYWNldC9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nRmFjZXQge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG51bUJ1Y2tldHM/OiBudW1iZXIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtZXJpY0ZhY2V0IHtcbiAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib3VuZGFyaWVzOiBudW1iZXJbXSxcbiAgICBkZWZhdWx0Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZUZhY2V0PFQgZXh0ZW5kcyAoRGF0ZSB8IHN0cmluZykgPSBzdHJpbmc+IHtcbiAgICB0eXBlOiBcImRhdGVcIixcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm91bmRhcmllczogVFtdLCAvLyBhcnJheSBvZiBkYXRlc1xuICAgIGRlZmF1bHQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRmFjZXQ8RGF0ZVQgZXh0ZW5kcyAoRGF0ZSB8IHN0cmluZykgPSBzdHJpbmc+ID0gU3RyaW5nRmFjZXQgfCBOdW1lcmljRmFjZXQgfCBEYXRlRmFjZXQ8RGF0ZVQ+O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjZXRTcGVjIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmllbGQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGYWNldEJ1Y2tldCB7XG4gICAgX2lkOiBzdHJpbmcsXG4gICAgY291bnQ6IG51bWJlcixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGYWNldE5hbWVCdWNrZXQge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfaWQ6IHN0cmluZyxcbiAgICBjb3VudDogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhY2V0UmVzdWx0IHtcbiAgICBidWNrZXRzOiBGYWNldEJ1Y2tldFtdXG59XG4iLCJleHBvcnQgKiBmcm9tICcuL2FjY2Vzcy1jb250cm9sLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYW5hbHl0aWNzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpa2V5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW52aXJvbm1lbnQuanMnO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjZXRzLmpzXCI7XG5leHBvcnQgKiBmcm9tICcuL2ludGVncmF0aW9ucy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyYWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWV0ZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGF5bG9hZC5qcyc7XG5leHBvcnQgKiBmcm9tIFwiLi9wbHVnaW4uanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Byb2dyZXNzLmpzXCI7XG5leHBvcnQgKiBmcm9tICcuL3Byb2plY3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9tcHQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlZnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ydW5zLmpzJztcbmV4cG9ydCAqIGZyb20gXCIuL3N0b3JlL2luZGV4LmpzXCI7XG5leHBvcnQgKiBmcm9tICcuL3RlbmFudC5qcyc7XG5leHBvcnQgKiBmcm9tIFwiLi90cmFpbmluZy5qc1wiO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc2llbnQtdG9rZW5zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXNlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2F1dGguanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zY2hlbWFzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vanNvbi1zY2hlbWEuanMnIiwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdyYXRpb25Db25maWd1cmF0aW9uQmFzZSB7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHbGFkaWFDb25maWd1cmF0aW9uIGV4dGVuZHMgSW50ZWdyYXRpb25Db25maWd1cmF0aW9uQmFzZSB7XG4gICAgYXBpX2tleTogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdGh1YkNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJbnRlZ3JhdGlvbkNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgICBhbGxvd2VkX3JlcG9zaXRvcmllczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ29uZmlndXJhdGlvbiBleHRlbmRzIEludGVncmF0aW9uQ29uZmlndXJhdGlvbkJhc2Uge1xuICAgIHMzX3JvbGVfYXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFnaWNQZGZDb25maWd1cmF0aW9uIGV4dGVuZHMgSW50ZWdyYXRpb25Db25maWd1cmF0aW9uQmFzZSB7XG4gICAgLy8gTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgZGVmYXVsdF9mZWF0dXJlcz86IHN0cmluZ1tdO1xuICAgIGRlZmF1bHRfem9uZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJwZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgSW50ZWdyYXRpb25Db25maWd1cmF0aW9uQmFzZSB7XG4gICAgYXBpX2tleTogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gU3VwcG9ydGVkSW50ZWdyYXRpb25zIHtcbiAgICBnbGFkaWEgPSBcImdsYWRpYVwiLFxuICAgIGdpdGh1YiA9IFwiZ2l0aHViXCIsXG4gICAgYXdzID0gXCJhd3NcIixcbiAgICBtYWdpY19wZGYgPSBcIm1hZ2ljX3BkZlwiLFxuICAgIHNlcnBlciA9IFwic2VycGVyXCIsXG59IiwiaW1wb3J0IHR5cGUge1xuICAgIEpTT05PYmplY3QsXG4gICAgSlNPTlNjaGVtYSxcbiAgICBNb2RhbGl0aWVzLFxuICAgIE1vZGVsT3B0aW9ucyxcbiAgICBTdGF0ZWxlc3NFeGVjdXRpb25PcHRpb25zLFxuICAgIFRvb2xEZWZpbml0aW9uLFxuICAgIFRvb2xVc2UsXG59IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTQgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcblxuaW1wb3J0IHsgRXhlY3V0aW9uVG9rZW5Vc2FnZSB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcblxuaW1wb3J0IHsgRXhlY3V0aW9uRW52aXJvbm1lbnRSZWYgfSBmcm9tIFwiLi9lbnZpcm9ubWVudC5qc1wiO1xuaW1wb3J0IHsgUHJvamVjdFJlZiB9IGZyb20gXCIuL3Byb2plY3QuanNcIjtcbmltcG9ydCB7XG4gICAgUG9wdWxhdGVkUHJvbXB0U2VnbWVudERlZixcbiAgICBQcm9tcHRTZWdtZW50RGVmLFxuICAgIFByb21wdFRlbXBsYXRlUmVmLFxuICAgIFByb21wdFRlbXBsYXRlUmVmV2l0aFNjaGVtYSxcbn0gZnJvbSBcIi4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgeyBFeGVjdXRpb25SdW5Eb2NSZWYgfSBmcm9tIFwiLi9ydW5zLmpzXCI7XG5pbXBvcnQgeyBBY2NvdW50UmVmIH0gZnJvbSBcIi4vdXNlci5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uRXhlY3V0aW9uRXJyb3Ige1xuICAgIGNvZGU6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZGF0YT86IGFueTtcbn1cblxuLyoqXG4gKiBUaGUgcGF5bG9hZCB0byBxdWVyeSB0aGUgaW50ZXJhY3Rpb24gZW5kcG9pbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25FbmRwb2ludFF1ZXJ5IHtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG5cbiAgICBzdGF0dXM/OiBJbnRlcmFjdGlvblN0YXR1cztcbiAgICB2aXNpYmlsaXR5PzogSW50ZXJhY3Rpb25WaXNpYmlsaXR5O1xuICAgIHZlcnNpb24/OiBudW1iZXI7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGJ5IGludGVyYWN0aW9uIGVuZHBvaW50IG5hbWUgdG8gaW5jbHVkZSBvbmx5IHRoZSBzcGVjaWZpZWQgZW5kcG9pbnRzXG4gICAgICogKiBJZiBib3RoIGluY2x1ZGVzIGFuZCBleGNsdWRlcyBhcmUgc3BlY2lmaWVkIHRoZW4gb25seSB0aGUgaW5jbHVkZXMgZmlsdGVyIHdpbGwgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBpbmNsdWRlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGJ5IGludGVyYWN0aW9uIGVuZHBvaW50IG5hbWUgdG8gZXhjbHVkZXMgdGhlIHNwZWNpZmllZCBlbmRwb2ludHMuXG4gICAgICogSWYgYm90aCBpbmNsdWRlcyBhbmQgZXhjbHVkZXMgYXJlIHNwZWNpZmllZCB0aGVuIG9ubHkgdGhlIGluY2x1ZGVzIGZpbHRlciB3aWxsIGJlIHVzZWQuXG4gICAgICovXG4gICAgZXhjbHVkZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgcGFyYW1ldGVycyBzY2hlbWEuXG4gICAgICogVGhlIHBhcmFtZXRlcnMgc2NoZW1hIGlzIGFuIGFycmF5IG9mIEpTT04gc2NoZW1hcy5cbiAgICAgKiBFYWNoIHNjaGVtYSBpcyBhIEpTT04gc2NoZW1hIHRoYXQgZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIGludGVyYWN0aW9uIHByb21wdC5cbiAgICAgKi9cbiAgICBpbmNsdWRlX3BhcmFtc19zY2hlbWE/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSByZXN1bHQgc2NoZW1hXG4gICAgICovXG4gICAgaW5jbHVkZV9yZXN1bHRfc2NoZW1hPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIGFuIGludGVyYWN0aW9uIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uRW5kcG9pbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVuZHBvaW50OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cztcbiAgICB2aXNpYmlsaXR5PzogSW50ZXJhY3Rpb25WaXNpYmlsaXR5O1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICB0YWdzOiBzdHJpbmdbXTtcbiAgICByZXN1bHRfc2NoZW1hPzogSlNPTlNjaGVtYTtcbiAgICBwYXJhbXNfc2NoZW1hPzogSlNPTlNjaGVtYTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvblJlZiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ6IHN0cmluZztcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cztcbiAgICB2aXNpYmlsaXR5PzogSW50ZXJhY3Rpb25WaXNpYmlsaXR5O1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICB0YWdzOiBzdHJpbmdbXTtcbiAgICBwcm9tcHRzPzogUHJvbXB0U2VnbWVudERlZjxQcm9tcHRUZW1wbGF0ZVJlZj5bXTtcbiAgICB1cGRhdGVkX2F0OiBEYXRlO1xufVxuZXhwb3J0IGNvbnN0IEludGVyYWN0aW9uUmVmUG9wdWxhdGUgPVxuICAgIFwiaWQgbmFtZSBlbmRwb2ludCBwYXJlbnQgZGVzY3JpcHRpb24gc3RhdHVzIHZlcnNpb24gdmlzaWJpbGl0eSB0YWdzIHVwZGF0ZWRfYXQgcHJvbXB0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uUmVmV2l0aFNjaGVtYSBleHRlbmRzIE9taXQ8SW50ZXJhY3Rpb25SZWYsIFwicHJvbXB0c1wiPiB7XG4gICAgcmVzdWx0X3NjaGVtYT86IEpTT05TY2hlbWE0O1xuICAgIHByb21wdHM/OiBQcm9tcHRTZWdtZW50RGVmPFByb21wdFRlbXBsYXRlUmVmV2l0aFNjaGVtYT5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvbnNFeHBvcnRQYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJhY3Rpb24uIElmIG5vdCBzcGVjaWZpZWQgYWxsIHRoZSBpbnRlcmFjdGlvbnMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdCB3aWxsIGJlIGV4cG9ydGVkXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKlxuICAgICAqIHRhZ3MgdG8gZmlsdGVyIHRoZSBleHBvcnRlZCBpbnRlcmFjdGlvbnNcbiAgICAgKi9cbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgLypcbiAgICAgKiBpZiBub3Qgc3BlY2lmaWVkLCBhbGwgdmVyc2lvbnMgd2lsbCBiZSBleHBvcnRlZFxuICAgICAqL1xuICAgIHZlcnNpb25zPzogKG51bWJlciB8IFwiZHJhZnRcIiB8IFwibGF0ZXN0XCIpW107XG59XG5cbmV4cG9ydCBlbnVtIEludGVyYWN0aW9uU3RhdHVzIHtcbiAgICBkcmFmdCA9IFwiZHJhZnRcIixcbiAgICBwdWJsaXNoZWQgPSBcInB1Ymxpc2hlZFwiLFxuICAgIGFyY2hpdmVkID0gXCJhcmNoaXZlZFwiLFxufVxuXG5leHBvcnQgZW51bSBFeGVjdXRpb25SdW5TdGF0dXMge1xuICAgIGNyZWF0ZWQgPSBcImNyZWF0ZWRcIixcbiAgICBwcm9jZXNzaW5nID0gXCJwcm9jZXNzaW5nXCIsXG4gICAgY29tcGxldGVkID0gXCJjb21wbGV0ZWRcIixcbiAgICBmYWlsZWQgPSBcImZhaWxlZFwiLFxufVxuXG5leHBvcnQgZW51bSBSdW5EYXRhU3RvcmFnZUxldmVsIHtcbiAgICBTVEFOREFSRCA9IFwiU1RBTkRBUkRcIixcbiAgICBSRVNUUklDVEVEID0gXCJSRVNUUklDVEVEXCIsXG4gICAgREVCVUcgPSBcIkRFQlVHXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJ1bkRhdGFTdG9yYWdlRGVzY3JpcHRpb24ge1xuICAgIFNUQU5EQVJEID0gXCJSdW4gZGF0YSBpcyBzdG9yZWQgZm9yIGJvdGggdGhlIG1vZGVsIGlucHV0cyBhbmQgb3V0cHV0LlwiLFxuICAgIFJFU1RSSUNURUQgPSBcIk5vIHJ1biBkYXRhIGlzIHN0b3JlZCBmb3IgdGhlIG1vZGVsIGlucHV0cyDigJQgb25seSB0aGUgbW9kZWwgb3V0cHV0LlwiLFxuICAgIERFQlVHID0gXCJSdW4gZGF0YSBpcyBzdG9yZWQgZm9yIHRoZSBtb2RlbCBpbnB1dHMgYW5kIG91dHB1dCwgc2NoZW1hLCBhbmQgZmluYWwgcHJvbXB0LlwiLFxufVxuXG5leHBvcnQgY29uc3QgUnVuRGF0YVN0b3JhZ2VPcHRpb25zOiBSZWNvcmQ8UnVuRGF0YVN0b3JhZ2VMZXZlbCwgUnVuRGF0YVN0b3JhZ2VEZXNjcmlwdGlvbj4gPSB7XG4gICAgW1J1bkRhdGFTdG9yYWdlTGV2ZWwuU1RBTkRBUkRdOiBSdW5EYXRhU3RvcmFnZURlc2NyaXB0aW9uLlNUQU5EQVJELFxuICAgIFtSdW5EYXRhU3RvcmFnZUxldmVsLlJFU1RSSUNURURdOiBSdW5EYXRhU3RvcmFnZURlc2NyaXB0aW9uLlJFU1RSSUNURUQsXG4gICAgW1J1bkRhdGFTdG9yYWdlTGV2ZWwuREVCVUddOiBSdW5EYXRhU3RvcmFnZURlc2NyaXB0aW9uLkRFQlVHLFxufTtcblxuLyoqXG4gKiBTY2hlbWEgY2FuIGJlIHN0b3JlZCBvciBzcGVjaWZpZWQgYXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc2NoZW1hLlxuICogV2Ugb25seSBzdXBwb3J0IFwic3RvcmU6XCIgcmVmZXJlbmNlcyBmb3Igbm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hUmVmIHtcbiAgICAkdXJpOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIENhY2hlUG9saWN5IHtcbiAgICB0eXBlOiBcImNhY2hlXCIgfCBcIm5vX2NhY2hlXCIgfCBcImNhY2hlX2FuZF9yZWZyZXNoXCI7XG4gICAgcmVmcmVzaF9wcm9iYWJpbGl0eTogbnVtYmVyO1xuICAgIHZhcmllc19vbjogc3RyaW5nW107XG4gICAgdHRsOiBudW1iZXI7XG59XG5leHBvcnQgdHlwZSBJbnRlcmFjdGlvblZpc2liaWxpdHkgPSBcInB1YmxpY1wiIHwgXCJwcml2YXRlXCI7XG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uIHtcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbmRwb2ludDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHN0YXR1czogSW50ZXJhY3Rpb25TdGF0dXM7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIC8vIG9ubHkgdXNlZCBmb3IgdmVyc2lvbnMgKHN0YXR1cyA9PT0gXCJwdWJsaXNoZWRcIilcbiAgICB2aXNpYmlsaXR5OiBJbnRlcmFjdGlvblZpc2liaWxpdHk7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xuICAgIHRlc3RfZGF0YT86IEpTT05PYmplY3Q7XG4gICAgaW50ZXJhY3Rpb25fc2NoZW1hPzogSlNPTlNjaGVtYTQgfCBTY2hlbWFSZWY7XG4gICAgcmVzdWx0X3NjaGVtYT86IEpTT05TY2hlbWE0IHwgU2NoZW1hUmVmO1xuICAgIGNhY2hlX3BvbGljeT86IENhY2hlUG9saWN5O1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgbW9kZWxfb3B0aW9ucz86IE1vZGVsT3B0aW9ucztcbiAgICBwcm9tcHRzOiBQcm9tcHRTZWdtZW50RGVmW107XG4gICAgb3V0cHV0X21vZGFsaXR5PzogTW9kYWxpdGllcztcbiAgICBlbnZpcm9ubWVudDogc3RyaW5nIHwgRXhlY3V0aW9uRW52aXJvbm1lbnRSZWY7XG4gICAgcmVzdHJpY3Rpb24/OiBSdW5EYXRhU3RvcmFnZUxldmVsO1xuICAgIHByb2plY3Q6IHN0cmluZyB8IFByb2plY3RSZWY7XG4gICAgLy8gb25seSBmb3IgZHJhZnRzIC0gd2hlbiBpdCB3YXMgbGFzdCBwdWJsaXNoZWRcbiAgICBsYXN0X3B1Ymxpc2hlZF9hdD86IERhdGU7XG4gICAgY3JlYXRlZF9ieTogc3RyaW5nO1xuICAgIHVwZGF0ZWRfYnk6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVwZGF0ZWRfYXQ6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9wdWxhdGVkSW50ZXJhY3Rpb24gZXh0ZW5kcyBPbWl0PEludGVyYWN0aW9uLCBcInByb21wdHNcIj4ge1xuICAgIHByb21wdHM6IFBvcHVsYXRlZFByb21wdFNlZ21lbnREZWZbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvbkNyZWF0ZVBheWxvYWRcbiAgICBleHRlbmRzIE9taXQ8XG4gICAgICAgIEludGVyYWN0aW9uLFxuICAgICAgICB8IFwiaWRcIlxuICAgICAgICB8IFwiY3JlYXRlZF9hdFwiXG4gICAgICAgIHwgXCJ1cGRhdGVkX2F0XCJcbiAgICAgICAgfCBcImNyZWF0ZWRfYnlcIlxuICAgICAgICB8IFwidXBkYXRlZF9ieVwiXG4gICAgICAgIHwgXCJwcm9qZWN0XCJcbiAgICAgICAgfCBcImZvcm1hdHRlclwiXG4gICAgICAgIHwgXCJ0YWdzXCJcbiAgICAgICAgfCBcInBhcmVudFwiXG4gICAgICAgIHwgXCJ2ZXJzaW9uXCJcbiAgICAgICAgfCBcInZpc2liaWxpdHlcIlxuICAgICAgICB8IFwiZW5kcG9pbnRcIlxuICAgID4ge1xuICAgIHZpc2liaWxpdHk/OiBJbnRlcmFjdGlvblZpc2liaWxpdHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25VcGRhdGVQYXlsb2FkXG4gICAgZXh0ZW5kcyBQYXJ0aWFsPFxuICAgICAgICBPbWl0PFxuICAgICAgICAgICAgSW50ZXJhY3Rpb24sXG4gICAgICAgICAgICBcInJlc3VsdF9zY2hlbWFcIiB8IFwiaWRcIiB8IFwiY3JlYXRlZF9hdFwiIHwgXCJ1cGRhdGVkX2F0XCIgfCBcImNyZWF0ZWRfYnlcIiB8IFwidXBkYXRlZF9ieVwiIHwgXCJwcm9qZWN0XCJcbiAgICAgICAgPlxuICAgID4ge1xuICAgIHJlc3VsdF9zY2hlbWE/OiBKU09OU2NoZW1hNCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25QdWJsaXNoUGF5bG9hZCB7XG4gICAgdmlzaWJpbGl0eT86IEludGVyYWN0aW9uVmlzaWJpbGl0eTtcbiAgICB0YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25Gb3JrUGF5bG9hZCB7XG4gICAga2VlcFRhZ3M/OiBib29sZWFuO1xuICAgIGZvcmtQcm9tcHRzPzogYm9vbGVhbjtcbiAgICB0YXJnZXRQcm9qZWN0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uRXhlY3V0aW9uUGF5bG9hZCB7XG4gICAgLyoqXG4gICAgICogSWYgYSBgQG1lbW9yeWAgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSBpbnB1dCBkYXRhIHRoZW4gdGhlIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgYSBtZW1vcnkgcGFjayBsb2NhdGlvbi5cbiAgICAgKiBhbmQgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGRhdGEgd2lsbCBjb250YWluIHRoZSBtZW1vcnkgcGFjayBtYXBwaW5nLlxuICAgICAqL1xuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYG1lbW9yeToke3N0cmluZ31gO1xuICAgIGNvbmZpZz86IEludGVyYWN0aW9uRXhlY3V0aW9uQ29uZmlndXJhdGlvbjtcbiAgICByZXN1bHRfc2NoZW1hPzogSlNPTlNjaGVtYTQ7XG4gICAgc3RyZWFtPzogYm9vbGVhbjtcbiAgICBkb192YWxpZGF0ZT86IGJvb2xlYW47XG4gICAgdGFncz86IHN0cmluZyB8IHN0cmluZ1tdOyAvLyB0YWdzIHRvIGJlIGFkZGVkIHRvIHRoZSBleGVjdXRpb24gcnVuXG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udmVyc2F0aW9uIHN0YXRlIHRvIGJlIHVzZWQgaW4gdGhlIGV4ZWN1dGlvbiBpZiBhbnkuXG4gICAgICogSWYgdGhlIGB0cnVlYCBpcyBwYXNzZWQgdGhlbiB0aGUgY29udmVyc2F0aW9uIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdC5cbiAgICAgKiBUaGUgdHJ1ZSB2YWx1ZSBtdXN0IGJlIHVzZWQgZm9yIHRoZSBmaXJzdCBleGVjdXRpb24gdGhhdCBzdGFydHMgdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKiBJZiBjb252ZXJzYXRpb24gaXMgZmFsc3kgdGhlbiBubyBjb252ZXJzYXRpb24gaXMgcmV0dXJuZWQgYmFjay5cbiAgICAgKiBGb3IgcmVndWxhciBleGVjdXRpb25zIHRoZSBjb252ZXJzYXRpb24gaXMgbm90IHJldHVybmVkIGJhY2sgdG8gc2F2ZSBtZW1vcnkuXG4gICAgICovXG4gICAgY29udmVyc2F0aW9uPzogdHJ1ZSB8IHVua25vd247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHMgdG8gYmUgdXNlZCBpbiB0aGUgZXhlY3V0aW9uXG4gICAgICovXG4gICAgdG9vbHM/OiBUb29sRGVmaW5pdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkIGV4dGVuZHMgSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJhY3Rpb24gbmFtZSBhbmQgc3VmZml4ZWQgYnkgYW4gb3B0aW9uYWwgdGFnIG9yIHZlcnNpb24gc2VwYXJhdGVkIGZyb20gdGhlIG5hbWUgdXNpbmcgYSBAIGNoYXJhY3RlclxuICAgICAqIElmIG5vIHZlcnNpb24vdGFnIHBhcnQgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIHVzZWQuXG4gICAgICogRXhhbXBsZTogUmV2aWV3Q29udHJhY3QsIFJldmlld0NvbnRyYWN0QGRyYWZ0LCBSZXZpZXdDb250cmFjdEAxLCBSZXZpZXdDb250cmFjdEBzb21lLXRhZ1xuICAgICAqL1xuICAgIGludGVyYWN0aW9uOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09IGFzeW5jIGV4ZWN1dGlvbiBwYXlsb2FkcyA9PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHR5cGUgVG9vbFJlZiA9IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH07XG5cbmludGVyZmFjZSBBc3luY0V4ZWN1dGlvblBheWxvYWRCYXNlIHtcbiAgICB0eXBlOiBcImNvbnZlcnNhdGlvblwiIHwgXCJpbnRlcmFjdGlvblwiO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGludGVyYWN0aW9uIGVuZHBvaW50IHRvIGV4ZWN1dGUgdG8gc3RhcnQgdGhlIGNvbnZlcnNhdGlvbi5cbiAgICAgKi9cbiAgICBpbnRlcmFjdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVudmlyb25tZW50IElEIHRvIHVzZS5cbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBtb2RlbCB0byB1c2VcbiAgICAgKi9cbiAgICBtb2RlbD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb25zIHRvIHVzZSBvbiB0aGUgZmlyc3QgZXhlY3V0aW9uXG4gICAgICovXG4gICAgbW9kZWxfb3B0aW9ucz86IE1vZGVsT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIHByb21wdCBpbnB1dCBkYXRhXG4gICAgICovXG4gICAgcHJvbXB0X2RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcmVzdWx0IHNjaGVtYVxuICAgICAqL1xuICAgIHJlc3VsdF9zY2hlbWE/OiBKU09OU2NoZW1hO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgdGFncyB0byBhZGQgdG8gdGhlIGV4ZWN1dGlvbiBydW5cbiAgICAgKi9cbiAgICB0YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNDb252ZXJzYXRpb25FeGVjdXRpb25QYXlsb2FkIGV4dGVuZHMgQXN5bmNFeGVjdXRpb25QYXlsb2FkQmFzZSB7XG4gICAgdHlwZTogXCJjb252ZXJzYXRpb25cIjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29scyB0byB1c2UsIGxpc3Qgb2YgdG9vbCBvciBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBZb3UgY2FuIHVzZSArIGFuZCAtIHRvIGFkZCBvciByZW1vdmUgZnJvbSBkZWZhdWx0LCBpZiBubyBzaWduLCB0aGVuIGxpc3QgcmVwbGFjZXMgZGVmYXVsdFxuICAgICAqL1xuICAgIHRvb2xzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpbiBjYXNlIG9mIGEgY29udmVyc2F0aW9uLiBJZiA8PTAgdGhlIGRlZmF1bHQgb2YgMjAgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIG1heF9pdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29udmVyc2F0aW9uIHNob3VsZCBiZSBpbnRlcmFjdGl2ZSBvciBub3RcbiAgICAgKi9cbiAgICBpbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3Rpb24gdG9vbHMgb3Igbm90LlxuICAgICAqL1xuICAgIGRpc2FibGVfaW50ZXJhY3Rpb25fdG9vbHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogT24gd2hpY2ggc2NvcGUgc2hvdWxkIHRoZSBzZWFyY2hlZCBieSBhcHBsaWVkLCBieSB0aGUgc2VhcmNoX3Rvb2wuXG4gICAgICogT25seSBzdXBwb3J0cyBjb2xsZWN0aW9uIHNjb3BlIG9yIG51bGwgZm9yIG5vdy5cbiAgICAgKi9cbiAgICBzZWFyY2hfc2NvcGU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29sbGVjdGlvbiBpbiB3aGljaCB0aGlzIHdvcmtmbG93IGlzIGV4ZWN1dGluZ1xuICAgICAqL1xuICAgIGNvbGxlY3Rpb25faWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9rZW4gdGhyZXNob2xkIGluIHRob3VzYW5kcyAoSykgZm9yIGNyZWF0aW5nIGNoZWNrcG9pbnRzLlxuICAgICAqIElmIHRvdGFsIHRva2VucyBleGNlZWQgdGhpcyB2YWx1ZSwgYSBjaGVja3BvaW50IHdpbGwgYmUgY3JlYXRlZC5cbiAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0IHZhbHVlIG9mIDE1MEsgdG9rZW5zIHdpbGwgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBjaGVja3BvaW50X3Rva2Vucz86IG51bWJlcjtcblxuICAgIC8qKiBJbiBjaGlsZCBleGVjdXRpb24gd29ya2Zsb3csIHRoaXMgaXMgdGhlIGN1cmVudCB0YXNrX2lkICovXG4gICAgdGFza19pZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3luY0ludGVyYWN0aW9uRXhlY3V0aW9uUGF5bG9hZCBleHRlbmRzIEFzeW5jRXhlY3V0aW9uUGF5bG9hZEJhc2Uge1xuICAgIHR5cGU6IFwiaW50ZXJhY3Rpb25cIjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29scyB0byB1c2VcbiAgICAgKi9cbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9uW107XG5cbiAgICAvKipcbiAgICAgKiBPbmx5IHVzZWQgZm9yIG5vbiBjb252ZXJzYXRpb24gd29ya2Zsb3dzIHRvIGluY2x1ZGUgdGhlIGVycm9yIG9uIG5leHQgcmV0cnkuXG4gICAgICogSWYgdG9vbHMgaXMgZGVmaW5lZCB0aGlzIGlzIG5vdCB1c2VkXG4gICAgICovXG4gICAgaW5jbHVkZV9wcmV2aW91c19lcnJvcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jRXhlY3V0aW9uUGF5bG9hZCA9IEFzeW5jQ29udmVyc2F0aW9uRXhlY3V0aW9uUGF5bG9hZCB8IEFzeW5jSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkO1xuXG5pbnRlcmZhY2UgUmVzdW1lQ29udmVyc2F0aW9uUGF5bG9hZCB7XG4gICAgcnVuOiBFeGVjdXRpb25SdW5Eb2NSZWY7IC8vIHRoZSBydW4gY3JlYXRlZCBieSB0aGUgZmlyc3QgZXhlY3V0aW9uLlxuICAgIGVudmlyb25tZW50OiBzdHJpbmc7IC8vIHRoZSBlbnZpcm9ubWVudCBJRFxuICAgIG9wdGlvbnM6IFN0YXRlbGVzc0V4ZWN1dGlvbk9wdGlvbnM7IC8vIHRoZSBvcHRpb25zIHVzZWQgb24gdGhlIGZpcnN0IGV4ZWN1dGlvblxuICAgIGNvbnZlcnNhdGlvbjogdW5rbm93bjsgLy8gdGhlIGNvbnZlcnNhdGlvbiBzdGF0ZVxuICAgIHRvb2xzOiBUb29sRGVmaW5pdGlvbltdOyAvLyB0aGUgdG9vbHMgdG8gYmUgdXNlZFxufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHRvIHNlbnQgdGhlIHRvb2wgcmVzcG9uc2VzIGJhY2sgdG8gdGhlIHRhcmdldCBMTE1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sUmVzdWx0c1BheWxvYWQgZXh0ZW5kcyBSZXN1bWVDb252ZXJzYXRpb25QYXlsb2FkIHtcbiAgICByZXN1bHRzOiB7XG4gICAgICAgIHRvb2xfdXNlX2lkOiBzdHJpbmc7XG4gICAgICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1lc3NhZ2VQYXlsb2FkIGV4dGVuZHMgUmVzdW1lQ29udmVyc2F0aW9uUGF5bG9hZCB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDaGVja3BvaW50Q29udmVyc2F0aW9uUGF5bG9hZCA9IE9taXQ8VG9vbFJlc3VsdHNQYXlsb2FkLCBcInJlc3VsdHNcIj47XG5cbi8vID09PT09PT09PT09PT09PT09IGVuZCBhc3luYyBleGVjdXRpb24gcGF5bG9hZHMgPT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGVudW0gUnVuU291cmNlVHlwZXMge1xuICAgIGFwaSA9IFwiYXBpXCIsXG4gICAgY2xpID0gXCJjbGlcIixcbiAgICB1aSA9IFwidWlcIixcbiAgICB3ZWJob29rID0gXCJ3ZWJob29rXCIsXG4gICAgdGVzdCA9IFwidGVzdC1kYXRhXCIsXG4gICAgc3lzdGVtID0gXCJzeXN0ZW1cIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5Tb3VyY2Uge1xuICAgIHR5cGU6IFJ1blNvdXJjZVR5cGVzO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgcHJpbmNpcGFsX3R5cGU6IFwidXNlclwiIHwgXCJhcGlrZXlcIjtcbiAgICBwcmluY2lwYWxfaWQ6IHN0cmluZztcbiAgICBjbGllbnRfaXA6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25SdW48UCA9IGFueSwgUiA9IGFueT4ge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT25seSB1c2VkIGJ5IHJ1bnMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgYSB2aXJ0dWFsIHJ1biB0byBwb2ludCB0b3dhcmQgdGhlIHZpcnR1YWwgcnVuIHBhcmVudFxuICAgICAqL1xuICAgIHBhcmVudD86IHN0cmluZyB8IEV4ZWN1dGlvblJ1bjtcbiAgICBldmFsdWF0aW9uPzoge1xuICAgICAgICBzY29yZT86IG51bWJlcjtcbiAgICAgICAgc2VsZWN0ZWQ/OiBib29sZWFuO1xuICAgICAgICBzY29yZXM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIH07XG4gICAgcmVzdWx0OiBSO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJhbWV0ZXJzIHVzZWQgdG8gY3JlYXRlIHRoZSBpbnRlcmFjdGlvbi5cbiAgICAgKiBJZiB0aGUgcGFyYW1ldGVycyBjb250YWlucyB0aGUgc3BlY2lhbCBwcm9wZXJ0eSBcIkBtZW1vcnlcIiBpdCB3aWxsIGJlIHVzZWRcbiAgICAgKiB0byBsb2NhdGUgYSBtZW1vcnkgcGFjayBhbmQgdGhlIG90aGVyIHByb3BlcnRpZXMgd2lsbCBiZSB1c2VkIGFzIHRoZSBtZW1vcnkgcGFjayBtYXBwaW5nLlxuICAgICAqL1xuICAgIHBhcmFtZXRlcnM6IFA7IC8vcGFyYW1zIHVzZWQgdG8gY3JlYXRlIHRoZSBpbnRlcmFjdGlvbiwgb25seSBpbiB2YXJpZXMgb24/XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIC8vVE9ETyBhIHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIGV4ZWN1dGluZyBub3QgdGhlIGludGVyYWN0aW9uIG9iamVjdFxuICAgIGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbjtcbiAgICAvL1RPRE8gYSBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBleGVjdXRpb24gbm90IHRoZSBlbnYgb2JqZWN0XG4gICAgZW52aXJvbm1lbnQ6IEV4ZWN1dGlvbkVudmlyb25tZW50UmVmO1xuICAgIG1vZGVsSWQ6IHN0cmluZztcbiAgICByZXN1bHRfc2NoZW1hOiBKU09OU2NoZW1hNDtcbiAgICB0dGw6IG51bWJlcjtcbiAgICBzdGF0dXM6IEV4ZWN1dGlvblJ1blN0YXR1cztcbiAgICBmaW5pc2hfcmVhc29uPzogc3RyaW5nO1xuICAgIHByb21wdDogYW55O1xuICAgIHRva2VuX3VzZT86IEV4ZWN1dGlvblRva2VuVXNhZ2U7XG4gICAgY2h1bmtzPzogbnVtYmVyO1xuICAgIGV4ZWN1dGlvbl90aW1lPzogbnVtYmVyOyAvL3NcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVwZGF0ZWRfYXQ6IERhdGU7XG4gICAgYWNjb3VudDogQWNjb3VudFJlZjtcbiAgICBwcm9qZWN0OiBQcm9qZWN0UmVmO1xuICAgIGNvbmZpZzogSW50ZXJhY3Rpb25FeGVjdXRpb25Db25maWd1cmF0aW9uO1xuICAgIGVycm9yPzogSW50ZXJhY3Rpb25FeGVjdXRpb25FcnJvcjtcbiAgICBzb3VyY2U6IFJ1blNvdXJjZTtcbiAgICBvdXRwdXRfbW9kYWxpdHk6IE1vZGFsaXRpZXM7XG4gICAgY3JlYXRlZF9ieTogc3RyaW5nO1xuICAgIHVwZGF0ZWRfYnk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvbkV4ZWN1dGlvblJlc3VsdDxQID0gYW55LCBSID0gYW55PiBleHRlbmRzIEV4ZWN1dGlvblJ1bjxQLCBSPiB7XG4gICAgdG9vbF91c2U/OiBUb29sVXNlW107XG4gICAgY29udmVyc2F0aW9uPzogdW5rbm93bjtcbiAgICBvcHRpb25zPzogU3RhdGVsZXNzRXhlY3V0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25SdW5SZWYgZXh0ZW5kcyBPbWl0PEV4ZWN1dGlvblJ1biwgXCJyZXN1bHRcIiB8IFwicGFyYW1ldGVyc1wiIHwgXCJpbnRlcmFjdGlvblwiPiB7XG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uUmVmO1xufVxuXG5leHBvcnQgY29uc3QgRXhlY3V0aW9uUnVuUmVmU2VsZWN0ID0gXCItcmVzdWx0IC1wYXJhbWV0ZXJzIC1yZXN1bHRfc2NoZW1hIC1wcm9tcHRcIjtcblxuZXhwb3J0IGVudW0gQ29uZmlnTW9kZXMge1xuICAgIFJVTl9BTkRfSU5URVJBQ1RJT05fQ09ORklHID0gXCJSVU5fQU5EX0lOVEVSQUNUSU9OX0NPTkZJR1wiLFxuICAgIFJVTl9DT05GSUdfT05MWSA9IFwiUlVOX0NPTkZJR19PTkxZXCIsXG4gICAgSU5URVJBQ1RJT05fQ09ORklHX09OTFkgPSBcIklOVEVSQUNUSU9OX0NPTkZJR19PTkxZXCIsXG59XG5cbmV4cG9ydCBlbnVtIENvbmZpZ01vZGVzRGVzY3JpcHRpb24ge1xuICAgIFJVTl9BTkRfSU5URVJBQ1RJT05fQ09ORklHID0gXCJUaGlzIHJ1biBjb25maWd1cmF0aW9uIGlzIHVzZWQuIFVuZGVmaW5lZCBvcHRpb25zIGFyZSBmaWxsZWQgd2l0aCBpbnRlcmFjdGlvbiBjb25maWd1cmF0aW9uLlwiLFxuICAgIFJVTl9DT05GSUdfT05MWSA9IFwiT25seSB0aGlzIHJ1biBjb25maWd1cmF0aW9uIGlzIHVzZWQuIFVuZGVmaW5lZCBvcHRpb25zIHJlbWFpbiB1bmRlZmluZWQuXCIsXG4gICAgSU5URVJBQ1RJT05fQ09ORklHX09OTFkgPSBcIk9ubHkgaW50ZXJhY3Rpb24gY29uZmlndXJhdGlvbiBpcyB1c2VkLlwiLFxufVxuXG5leHBvcnQgY29uc3QgQ29uZmlnTW9kZXNPcHRpb25zOiBSZWNvcmQ8Q29uZmlnTW9kZXMsIENvbmZpZ01vZGVzRGVzY3JpcHRpb24+ID0ge1xuICAgIFtDb25maWdNb2Rlcy5SVU5fQU5EX0lOVEVSQUNUSU9OX0NPTkZJR106IENvbmZpZ01vZGVzRGVzY3JpcHRpb24uUlVOX0FORF9JTlRFUkFDVElPTl9DT05GSUcsXG4gICAgW0NvbmZpZ01vZGVzLlJVTl9DT05GSUdfT05MWV06IENvbmZpZ01vZGVzRGVzY3JpcHRpb24uUlVOX0NPTkZJR19PTkxZLFxuICAgIFtDb25maWdNb2Rlcy5JTlRFUkFDVElPTl9DT05GSUdfT05MWV06IENvbmZpZ01vZGVzRGVzY3JpcHRpb24uSU5URVJBQ1RJT05fQ09ORklHX09OTFksXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uRXhlY3V0aW9uQ29uZmlndXJhdGlvbiB7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgZG9fdmFsaWRhdGU/OiBib29sZWFuO1xuICAgIHJ1bl9kYXRhPzogUnVuRGF0YVN0b3JhZ2VMZXZlbDtcbiAgICBjb25maWdNb2RlPzogQ29uZmlnTW9kZXM7XG4gICAgbW9kZWxfb3B0aW9ucz86IE1vZGVsT3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUludGVyYWN0aW9uUGF5bG9hZCB7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb25maWc6IEludGVyYWN0aW9uRXhlY3V0aW9uQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVRlc3REYXRhUGF5bG9hZCB7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgICBjb3VudD86IG51bWJlcjtcbiAgICBjb25maWc6IEludGVyYWN0aW9uRXhlY3V0aW9uQ29uZmlndXJhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbXByb3ZlUHJvbXB0UGF5bG9hZCB7XG4gICAgY29uZmlnOiBJbnRlcmFjdGlvbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb247XG59XG4iLCJleHBvcnQgdHlwZSB7XG4gICAgSlNPTlNjaGVtYSxcbiAgICBKU09OU2NoZW1hQXJyYXksXG4gICAgSlNPTlNjaGVtYU9iamVjdCxcbiAgICBKU09OU2NoZW1hVHlwZSxcbiAgICBKU09OU2NoZW1hVHlwZU5hbWUsXG59IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbiIsImltcG9ydCB7IEJpbGxpbmdNZXRob2QgfSBmcm9tIFwiLi91c2VyLmpzXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBNZXRlckFkanVzdG1lbnQge1xuICAgIG1ldGVyOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBpZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRqdXN0TWV0ZXJzTWV0ZXJXb3JrZmxvd1BhcmFtcyB7XG4gICAgYWRqdXN0bWVudHM6IE1ldGVyQWRqdXN0bWVudFtdO1xufVxuXG5leHBvcnQgZW51bSBNZXRlck5hbWVzIHtcbiAgICBhbmFseXplZF9wYWdlcyA9ICdhbmFseXplZF9wYWdlcycsXG4gICAgZXh0cmFjdGVkX3RhYmxlcyA9ICdleHRyYWN0ZWRfdGFibGVzJyxcbiAgICBhbmFseXplZF9pbWFnZXMgPSAnYW5hbHl6ZWRfaW1hZ2VzJyxcbiAgICBpbnB1dF90b2tlbl91c2VkID0gJ2lucHV0X3Rva2VuX3VzZWQnLFxuICAgIG91dHB1dF90b2tlbl91c2VkID0gJ291dHB1dF90b2tlbl91c2VkJyxcbiAgICB0YXNrX3J1biA9ICd0YXNrX3J1bicsXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBTdHJpcGVCaWxsaW5nU3RhdHVzUmVzcG9uc2Uge1xuICAgIHN0YXR1czogJ2VuYWJsZWQnIHwgJ2Rpc2FibGVkJyxcbiAgICBiaWxsaW5nX21ldGhvZDogQmlsbGluZ01ldGhvZCB8IG51bGwsXG4gICAgcG9ydGFsX3VybD86IHN0cmluZyxcbiAgICByZWFzb24/OiBzdHJpbmdcbn0iLCJpbXBvcnQgeyBGYWNldFNwZWMgfSBmcm9tIFwiLi9mYWNldHMuanNcIjtcbmltcG9ydCB7XG4gICAgQ29tcGxleFNlYXJjaFF1ZXJ5LFxuICAgIEludGVyYWN0aW9uU2VhcmNoUXVlcnksXG4gICAgT2JqZWN0U2VhcmNoUXVlcnksXG4gICAgT2JqZWN0VHlwZVNlYXJjaFF1ZXJ5LFxuICAgIFByb21wdFNlYXJjaFF1ZXJ5LFxuICAgIFJ1blNlYXJjaFF1ZXJ5LFxuICAgIFNpbXBsZVNlYXJjaFF1ZXJ5LFxuICAgIFZlY3RvclNlYXJjaFF1ZXJ5LFxufSBmcm9tIFwiLi9xdWVyeS5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBheWxvYWQge1xuICAgIHF1ZXJ5PzogU2ltcGxlU2VhcmNoUXVlcnk7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIHNlbGVjdD86IHN0cmluZztcbiAgICBhbGxfcmV2aXNpb25zPzogYm9vbGVhbjtcbiAgICBmcm9tX3Jvb3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZUZhY2V0UGF5bG9hZCB7XG4gICAgZmFjZXRzOiBGYWNldFNwZWNbXTtcbiAgICBxdWVyeT86IFNpbXBsZVNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uU2VhcmNoUGF5bG9hZCBleHRlbmRzIFNlYXJjaFBheWxvYWQge1xuICAgIHF1ZXJ5PzogSW50ZXJhY3Rpb25TZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RTZWFyY2hQYXlsb2FkIGV4dGVuZHMgU2VhcmNoUGF5bG9hZCB7XG4gICAgcXVlcnk/OiBPYmplY3RTZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RUeXBlU2VhcmNoUGF5bG9hZCBleHRlbmRzIFNlYXJjaFBheWxvYWQge1xuICAgIHF1ZXJ5PzogT2JqZWN0VHlwZVNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFNlYXJjaFBheWxvYWQgZXh0ZW5kcyBTZWFyY2hQYXlsb2FkIHtcbiAgICBxdWVyeT86IFByb21wdFNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blNlYXJjaFBheWxvYWQgZXh0ZW5kcyBTZWFyY2hQYXlsb2FkIHtcbiAgICBxdWVyeT86IFJ1blNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVJbnRlcmFjdGlvbkZhY2V0UGF5bG9hZCBleHRlbmRzIENvbXB1dGVGYWNldFBheWxvYWQge1xuICAgIHF1ZXJ5PzogSW50ZXJhY3Rpb25TZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlT2JqZWN0RmFjZXRQYXlsb2FkIGV4dGVuZHMgQ29tcHV0ZUZhY2V0UGF5bG9hZCB7XG4gICAgcXVlcnk/OiBPYmplY3RTZWFyY2hRdWVyeTtcbiAgICB2ZWN0b3I/OiBWZWN0b3JTZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUHJvbXB0RmFjZXRQYXlsb2FkIGV4dGVuZHMgQ29tcHV0ZUZhY2V0UGF5bG9hZCB7XG4gICAgcXVlcnk/OiBQcm9tcHRTZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlUnVuRmFjZXRQYXlsb2FkIGV4dGVuZHMgQ29tcHV0ZUZhY2V0UGF5bG9hZCB7XG4gICAgcXVlcnk/OiBSdW5TZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQcm9wZXJ0aWVzUGF5bG9hZCB7XG4gICAgb2JqZWN0SWRzOiBzdHJpbmdbXTtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgcXVlcnk/OiBDb21wbGV4U2VhcmNoUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0UHJvcGVydGllc1Jlc3BvbnNlIHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRhdGE6IEJsb2I7XG59XG4iLCIvKipcbiAqIEEgdmVydGVzaWEgcGx1Z2luIG1hbmlmZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTWFuaWZlc3Qge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc3JjOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBwdWJsaXNoZXI6IHN0cmluZztcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHBsdWdpbiBzaG91bGQgYmUgbG9hZGVkIGFzIHBhcnQgb2YgdGhlIGhvc3QgbGF5b3V0XG4gICAgICogb3IgaW4gYSBuZXcgdGFiLlxuICAgICAqIElmIGV4dGVybmFsIGlzIHRydWUsIHRoZSBwbHVnaW4gbXVzdCBtYW5hZ2UgaXRzZWxmIHRoZSBnbG9iYWwgbGF5b3V0IG9mIHRoZSBwYWdlLlxuICAgICAqIEl0IHdpbGwgYmUgbG9hZGVkIGluIGEgbmV3IHRhYi5cbiAgICAgKiBJZiBleHRlcm5hbCBpcyBmYWxzZSB0aGUgcGx1Z2luIHdpbGwgYmUgbG9hZGVkIGFzIGEgcGFnZSBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgaXQgd2lsbCBzaGFyZSB0aGUgc2FtZSBsYXlvdXQuXG4gICAgICogRGVmYXVsdCBpcyBmYWxzZS5cbiAgICAgKi9cbiAgICBleHRlcm5hbD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgaXMgXCJiZXRhXCIuXG4gICAgICovXG4gICAgc3RhdHVzPzogXCJiZXRhXCIgfCBcInN0YWJsZVwiIHwgXCJkZXByZWNhdGVkXCIgfCBcImhpZGRlblwiO1xufVxuIiwiaW1wb3J0IHsgU3VwcG9ydGVkSW50ZWdyYXRpb25zIH0gZnJvbSBcIi4vaW50ZWdyYXRpb25zLmpzXCI7XG5pbXBvcnQgeyBBY2NvdW50UmVmIH0gZnJvbSBcIi4vdXNlci5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDcmVhdGVQcm9qZWN0UGF5bG9hZCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGF1dG9fY29uZmlnPzogYm9vbGVhbjtcbn1cbmV4cG9ydCBlbnVtIFByb2plY3RSb2xlcyB7XG4gICAgb3duZXIgPSBcIm93bmVyXCIsIC8vIGFsbCBwZXJtaXNzaW9uc1xuICAgIGFkbWluID0gXCJhZG1pblwiLCAvLyBhbGwgcGVybWlzc2lvbnNcbiAgICBwcm9qZWN0X2FkbWluID0gXCJwcm9qZWN0X2FkbWluXCIsIC8vIGFsbCBwZXJtaXNzaW9ucyBidXQgbWFuYWdlX2FjY291bnQsIG1hbmFnZV9iaWxsaW5nXG4gICAgZGV2ZWxvcGVyID0gXCJkZXZlbG9wZXJcIiwgLy8gYWxsIHBlcm1pc3Npb25zIGJ1dCBtYW5hZ2VfYWNjb3VudCwgbWFuYWdlX2JpbGxpbmcsIG1hbmFnZV9yb2xlcywgZGVsZXRlXG4gICAgYXBwbGljYXRpb24gPSBcImFwcGxpY2F0aW9uXCIsIC8vIGV4ZWN1dG9yICsgcmVxdWVzdF9wa1xuICAgIGV4ZWN1dG9yID0gXCJleGVjdXRvclwiLCAvLyBjYW4gb25seSByZWFkIGFuZCBleGVjdXRlIGludGVyYWN0aW9uc1xuICAgIHJlYWRlciA9IFwicmVhZGVyXCIsIC8vIGNhbiBvbmx5IHJlYWQgKGJyb3dzZSlcbiAgICBiaWxsaW5nID0gXCJiaWxsaW5nXCIsIC8vIGNhbiBvbmx5IG1hbmFnZSBiaWxsaW5nc1xuICAgIG1lbWJlciA9IFwibWVtYmVyXCIsIC8vIGNhbiBvbmx5IGFjY2VzcywgYnV0IG5vIHNwZWNpZmljIHBlcm1pc3Npb25zXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JvbGVJbmNsdWRlZEluKHJvbGU6IHN0cmluZywgaW5jbHVkaW5nUm9sZTogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChpbmNsdWRpbmdSb2xlKSB7XG4gICAgICAgIGNhc2UgUHJvamVjdFJvbGVzLm93bmVyOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGluY2x1ZGVzIGJpbGxpbmcgdG8/XG4gICAgICAgIGNhc2UgUHJvamVjdFJvbGVzLmFkbWluOlxuICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFByb2plY3RSb2xlcy5iaWxsaW5nICYmIHJvbGUgIT09IFByb2plY3RSb2xlcy5vd25lcjtcbiAgICAgICAgY2FzZSBQcm9qZWN0Um9sZXMuZGV2ZWxvcGVyOlxuICAgICAgICAgICAgcmV0dXJuIHJvbGUgPT09IFByb2plY3RSb2xlcy5kZXZlbG9wZXI7XG4gICAgICAgIGNhc2UgUHJvamVjdFJvbGVzLmJpbGxpbmc6XG4gICAgICAgICAgICByZXR1cm4gcm9sZSA9PT0gUHJvamVjdFJvbGVzLmJpbGxpbmc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9wdWxhdGVkUHJvamVjdFJlZiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYWNjb3VudDogQWNjb3VudFJlZlxufVxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0UmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT25seSBzZXQgd2hlbiBmZXRjaGluZyB0aGUgbGlzdCBvZiBwcm9qZWN0cyB2aXNpYmxlIHRvIGFuIHVzZXIgd2hpY2ggaXMgYW4gb3JnIGFkbWluIG9yIG93bmVyLlxuICAgICAqIElmIHByZXNlbnQgYW5kIHRydWUsIGl0IG1lYW5zIHRoYXQgdGhlIHByb2plY3QgaXMgbm90IGFjY2Vzc2libGUgdG8gdGhlIHVzZXIuKGV2ZW4gaWYgaXQgdmlzaWJsZSBpbiBsaXN0aW5nKVxuICAgICAqIElmIG5vdCBwcmVzZW50IG9yIGZhbHNlIHRoZW4gdGhlIHByb2plY3QgaXMgYWNjZXNzaWJsZSB0byB0aGUgdXNlci5cbiAgICAgKi9cbiAgICByZXN0cmljdGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGVudW0gUmVzb3VyY2VWaXNpYmlsaXR5IHtcbiAgICBwdWJsaWMgPSBcInB1YmxpY1wiLFxuICAgIGFjY291bnQgPSBcImFjY291bnRcIixcbiAgICBwcm9qZWN0ID0gXCJwcm9qZWN0XCJcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RDb25maWd1cmF0aW9uIHtcblxuICAgIGh1bWFuX2NvbnRleHQ6IHN0cmluZztcblxuICAgIGRlZmF1bHRfZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZGVmYXVsdF9tb2RlbD86IHN0cmluZztcblxuICAgIGVtYmVkZGluZ3M6IHtcbiAgICAgICAgdGV4dD86IFByb2plY3RDb25maWd1cmF0aW9uRW1iZWRkaW5ncztcbiAgICAgICAgaW1hZ2U/OiBQcm9qZWN0Q29uZmlndXJhdGlvbkVtYmVkZGluZ3M7XG4gICAgICAgIHByb3BlcnRpZXM/OiBQcm9qZWN0Q29uZmlndXJhdGlvbkVtYmVkZGluZ3NcbiAgICB9XG5cbiAgICBkYXRhY2VudGVyPzogc3RyaW5nO1xuICAgIHN0b3JhZ2VfYnVja2V0Pzogc3RyaW5nO1xuXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENvbmZpZ3VyYXRpb25FbWJlZGRpbmdzIHtcbi8vICAgICBlbnZpcm9ubWVudDogc3RyaW5nO1xuLy8gICAgIG1heF90b2tlbnM6IG51bWJlcjtcbi8vICAgICBkaW1lbnNpb25zOiBudW1iZXI7XG4vLyAgICAgbW9kZWw/OiBzdHJpbmc7XG4vLyB9XG5cbmV4cG9ydCBlbnVtIFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzIHtcbiAgICB0ZXh0ID0gXCJ0ZXh0XCIsXG4gICAgaW1hZ2UgPSBcImltYWdlXCIsXG4gICAgcHJvcGVydGllcyA9IFwicHJvcGVydGllc1wiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENvbmZpZ3VyYXRpb25FbWJlZGRpbmdzIHtcbiAgICBlbnZpcm9ubWVudDogc3RyaW5nO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgZGltZW5zaW9uczogbnVtYmVyO1xuICAgIG1heF90b2tlbnM/OiBudW1iZXI7XG4gICAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGNvbmZpZ3VyYXRpb246IFByb2plY3RDb25maWd1cmF0aW9uO1xuICAgIGludGVncmF0aW9uczogTWFwPHN0cmluZywgYW55PjtcbiAgICBwbHVnaW5zOiBzdHJpbmdbXTtcbiAgICBjcmVhdGVkX2J5OiBzdHJpbmcsXG4gICAgdXBkYXRlZF9ieTogc3RyaW5nLFxuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q3JlYXRlUGF5bG9hZCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RVcGRhdGVQYXlsb2FkIGV4dGVuZHMgUGFydGlhbDxQcm9qZWN0PiB7IH1cblxuXG5leHBvcnQgY29uc3QgUHJvamVjdFJlZlBvcHVsYXRlID0gXCJpZCBuYW1lIGFjY291bnRcIjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ3NTdGF0dXNSZXNwb25zZSB7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgZW1iZWRkaW5nUnVuc0luUHJvZ3Jlc3M6IG51bWJlcjtcbiAgICB0b3RhbFJ1bnNJblByb2dyZXNzOiBudW1iZXI7XG4gICAgdG90YWxJbmRleGFibGVPYmplY3RzOiBudW1iZXI7XG4gICAgZW1iZWRkaW5nc01vZGVsczogc3RyaW5nW107XG4gICAgb2JqZWN0c1dpdGhFbWJlZGRpbmdzOiBudW1iZXI7XG4gICAgdmVjdG9ySW5kZXg6IHtcbiAgICAgICAgc3RhdHVzOiBcIlJFQURZXCIgfCBcIlBFTkRJTkdcIiB8IFwiREVMRVRJTkdcIiB8IFwiQUJTRU5UXCIsXG4gICAgICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgICAgIHR5cGU/OiBzdHJpbmdcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdEludGVncmF0aW9uTGlzdEVudHJ5IHtcbiAgICBpZDogU3VwcG9ydGVkSW50ZWdyYXRpb25zO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG59IiwiaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNCB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuaW1wb3J0IHR5cGUgeyBKU09OT2JqZWN0IH0gZnJvbSBcIkBsbHVtaXZlcnNlL2NvbW1vblwiO1xuaW1wb3J0IHsgUHJvamVjdFJlZiB9IGZyb20gXCIuL3Byb2plY3QuanNcIjtcbmltcG9ydCB7IFByb21wdFJvbGUgfSBmcm9tIFwiQGxsdW1pdmVyc2UvY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFByb21wdFNjaGVtYSB7XG4gICAgcm9sZTogUHJvbXB0Um9sZS51c2VyIHwgUHJvbXB0Um9sZS5hc3Npc3RhbnQ7XG4gICAgY29udGVudDogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBQcm9tcHRTdGF0dXMge1xuICAgIGRyYWZ0ID0gXCJkcmFmdFwiLFxuICAgIHB1Ymxpc2hlZCA9IFwicHVibGlzaGVkXCIsXG4gICAgYXJjaGl2ZWQgPSBcImFyY2hpdmVkXCIsXG59XG5cblxuZXhwb3J0IGVudW0gUHJvbXB0U2VnbWVudERlZlR5cGUge1xuICAgIGNoYXQgPSBcImNoYXRcIixcbiAgICB0ZW1wbGF0ZSA9IFwidGVtcGxhdGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRTZWdtZW50RGVmPFxuICAgIFQgPSBzdHJpbmcgfCBQcm9tcHRUZW1wbGF0ZSB8IFByb21wdFRlbXBsYXRlUmVmLFxuPiB7XG4gICAgdHlwZTogUHJvbXB0U2VnbWVudERlZlR5cGU7XG4gICAgdGVtcGxhdGU/OiBUOyAvLyB0aGUgdGVtcGxhdGUgaWQgaW4gY2FzZSBvZiBhIHByb21wdCB0ZW1wbGF0ZVxuICAgIGNvbmZpZ3VyYXRpb24/OiBhbnk7IC8vIHRoZSBjb25maWd1cmF0aW9uIGlmIGFueSBpbiBjYXNlIG9mIGJ1aWx0aW4gcHJvbXB0c1xufVxuZXhwb3J0IGludGVyZmFjZSBQb3B1bGF0ZWRQcm9tcHRTZWdtZW50RGVmXG4gICAgZXh0ZW5kcyBPbWl0PFByb21wdFNlZ21lbnREZWYsIFwidGVtcGxhdGVcIj4ge1xuICAgIHRlbXBsYXRlPzogUHJvbXB0VGVtcGxhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0VGVtcGxhdGVSZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHJvbGU6IFByb21wdFJvbGU7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIHN0YXR1czogUHJvbXB0U3RhdHVzO1xuICAgIGNvbnRlbnRfdHlwZTogVGVtcGxhdGVUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFRlbXBsYXRlUmVmV2l0aFNjaGVtYSBleHRlbmRzIFByb21wdFRlbXBsYXRlUmVmIHtcbiAgICBpbnB1dFNjaGVtYT86IEpTT05TY2hlbWE0O1xufVxuXG5leHBvcnQgZW51bSBUZW1wbGF0ZVR5cGUge1xuICAgIHRleHQgPSBcInRleHRcIixcbiAgICBqcyA9IFwianNcIixcbiAgICBqc3QgPSBcImpzdFwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFRlbXBsYXRlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICByb2xlOiBQcm9tcHRSb2xlO1xuICAgIHN0YXR1czogUHJvbXB0U3RhdHVzO1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvLyBvbmx5IHRvIGJlIHVzZWQgYnkgcHVibGlzaGVkIHZlcnNpb25zXG4gICAgLy8gdGhlIGlkIGRyYWZ0IHZlcnNpb24gd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiB0aGlzIHB1Ymxpc2hlZCB2ZXJzaW9uIChvbmx5IHdoZW4gcHVibGlzaGVkKVxuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBjb250ZW50X3R5cGU6IFRlbXBsYXRlVHlwZTtcbiAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgdGVzdF9kYXRhPzogSlNPTk9iamVjdDsgLy8gb3B0aW9uYWwgdGVzdCBkYXRhIHNhdGlzZnlpbmcgdGhlIHNjaGVtYVxuICAgIHNjcmlwdD86IHN0cmluZzsgLy8gY2FjaGUgdGhlIHRlbXBsYXRlIG91dHB1dFxuICAgIGlucHV0U2NoZW1hPzogSlNPTlNjaGVtYTQ7XG4gICAgcHJvamVjdDogc3RyaW5nIHwgUHJvamVjdFJlZjsgLy8gb3IgcHJvamVjdFJlZj8gT2JqZWN0SWRUeXBlO1xuICAgIC8vIFRoZSBuYW1lIG9mIGEgZmllbGQgaW4gdGhlIGlucHV0IGRhdGEgdGhhdCBpcyBvZiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBhbmQgb24gZWFjaCB0aGUgdGVtcGxhdGUgd2lsbCBpdGVyYXRlLlxuICAgIC8vIElmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgc2NoZW1hIHdpbGwgZGVmaW5lIHRoZSB3aG9sZSBpbnB1dCBkYXRhXG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIC8vIG9ubHkgZm9yIGRyYWZ0cyAtIHdoZW4gaXQgd2FzIGxhc3QgcHVibGlzaGVkXG4gICAgbGFzdF9wdWJsaXNoZWRfYXQ/OiBEYXRlO1xuICAgIGNyZWF0ZWRfYnk6IHN0cmluZyxcbiAgICB1cGRhdGVkX2J5OiBzdHJpbmcsXG4gICAgY3JlYXRlZF9hdDogRGF0ZTtcbiAgICB1cGRhdGVkX2F0OiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFRlbXBsYXRlRm9ya1BheWxvYWQge1xuICAgIGtlZXBUYWdzPzogYm9vbGVhbjtcbiAgICB0YXJnZXRQcm9qZWN0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFRlbXBsYXRlQ3JlYXRlUGF5bG9hZFxuICAgIGV4dGVuZHMgT21pdDxcbiAgICAgICAgUHJvbXB0VGVtcGxhdGUsXG4gICAgICAgIFwiaWRcIiB8IFwiY3JlYXRlZF9hdFwiIHwgXCJ1cGRhdGVkX2F0XCIgfCBcImNyZWF0ZWRfYnlcIiB8IFwidXBkYXRlZF9ieVwiIHwgXCJwcm9qZWN0XCIgfCBcInN0YXR1c1wiIHwgXCJ2ZXJzaW9uXCJcbiAgICA+IHsgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFRlbXBsYXRlVXBkYXRlUGF5bG9hZFxuICAgIGV4dGVuZHMgUGFydGlhbDxcbiAgICAgICAgT21pdDxQcm9tcHRUZW1wbGF0ZSwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBcInVwZGF0ZWRfYXRcIiB8IFwiY3JlYXRlZF9ieVwiIHwgXCJ1cGRhdGVkX2J5XCIgfCBcInByb2plY3RcIj5cbiAgICA+IHsgfVxuIiwiaW1wb3J0IHsgRXhlY3V0aW9uUnVuU3RhdHVzIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFbWJlZGRpbmdUeXBlcyB9IGZyb20gJy4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuTGlzdGluZ1F1ZXJ5T3B0aW9ucyB7XG4gICAgcHJvamVjdD86IHN0cmluZztcbiAgICBpbnRlcmFjdGlvbj86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBmaWx0ZXJzPzogUnVuTGlzdGluZ0ZpbHRlcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuTGlzdGluZ0ZpbHRlcnMge1xuICAgIGludGVyYWN0aW9uPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgc3RhdHVzPzogRXhlY3V0aW9uUnVuU3RhdHVzLFxuICAgIG1vZGVsPzogc3RyaW5nLFxuICAgIGVudmlyb25tZW50Pzogc3RyaW5nLFxuICAgIHRhZz86IHN0cmluZyxcbiAgICBmcm9tRGF0ZT86IHN0cmluZyxcbiAgICB0b0RhdGU/OiBzdHJpbmcsXG4gICAgcGFyZW50Pzogc3RyaW5nIHwgZmFsc2UsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVjdG9yU2VhcmNoUXVlcnkge1xuICAgIG9iamVjdElkPzogc3RyaW5nO1xuICAgIHZhbHVlcz86IG51bWJlcltdO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgaW1hZ2U/OiBzdHJpbmc7XG4gICAgdGhyZXNob2xkPzogbnVtYmVyO1xuICAgIHR5cGU6IFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlU2VhcmNoUXVlcnkge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFNlYXJjaFF1ZXJ5IGV4dGVuZHMgU2ltcGxlU2VhcmNoUXVlcnkge1xuICAgIGxvY2F0aW9uPzogc3RyaW5nO1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBzaW1pbGFyVG8/OiBzdHJpbmc7XG4gICAgZW1iZWRkaW5nVHlwZT86IFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzO1xuICAgIHR5cGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VHlwZVNlYXJjaFF1ZXJ5IGV4dGVuZHMgU2ltcGxlU2VhcmNoUXVlcnkge1xuICAgIGNodW5rYWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0U2VhcmNoUXVlcnkgZXh0ZW5kcyBTaW1wbGVTZWFyY2hRdWVyeSB7XG4gICAgcm9sZT86IHN0cmluZztcbiAgICBtYXRjaEludGVyYWN0aW9ucz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25TZWFyY2hRdWVyeSBleHRlbmRzIFNpbXBsZVNlYXJjaFF1ZXJ5IHtcbiAgICBwcm9tcHQ/OiBzdHJpbmc7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIHZlcnNpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU2VhcmNoUXVlcnkgZXh0ZW5kcyBTaW1wbGVTZWFyY2hRdWVyeSB7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIGludGVyYWN0aW9uPzogc3RyaW5nO1xuICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICAgIHN0YXR1cz86IEV4ZWN1dGlvblJ1blN0YXR1cztcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgcXVlcnk/OiBzdHJpbmc7XG4gICAgZGVmYXVsdF9xdWVyeV9wYXRoPzogc3RyaW5nO1xuICAgIHBhcmVudD86IHN0cmluZ1tdIHwgZmFsc2U7XG4gICAgb2JqZWN0Pzogc3RyaW5nO1xuICAgIHN0YXJ0Pzogc3RyaW5nO1xuICAgIGVuZD86IHN0cmluZztcbiAgICBmaW5pc2hfcmVhc29uPzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dFeGVjdXRpb25TZWFyY2hRdWVyeSBleHRlbmRzIFNpbXBsZVNlYXJjaFF1ZXJ5IHtcbiAgICBkb2N1bWVudElkPzogc3RyaW5nO1xuICAgIGV2ZW50TmFtZT86IHN0cmluZztcbiAgICBydWxlSWQ/OiBzdHJpbmc7XG4gICAgc3RhcnQ/OiBzdHJpbmc7XG4gICAgZW5kPzogc3RyaW5nO1xuICAgIHN0YXR1cz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4U2VhcmNoUXVlcnkgZXh0ZW5kcyBPYmplY3RTZWFyY2hRdWVyeSB7XG4gICAgdmVjdG9yPzogVmVjdG9yU2VhcmNoUXVlcnk7XG4gICAgbWF0Y2g/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufSIsIlxuXG5leHBvcnQgZW51bSBSZXNvbHZhYmxlUmVmVHlwZSB7XG4gICAgcHJvamVjdCA9IFwiUHJvamVjdFwiLFxuICAgIGVudmlyb25tZW50ID0gXCJFbnZpcm9ubWVudFwiLFxuICAgIHVzZXIgPSBcIlVzZXJcIixcbiAgICBhY2NvdW50ID0gXCJBY2NvdW50XCIsXG4gICAgaW50ZXJhY3Rpb24gPSBcIkludGVyYWN0aW9uXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZhYmxlUmVmIHtcbiAgICB0eXBlOiBSZXNvbHZhYmxlUmVmVHlwZVxuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWZSZXNvbHV0aW9uUmVxdWVzdCB7XG5cbiAgICByZWZzOiBSZXNvbHZhYmxlUmVmW11cblxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VSZWYge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICB0eXBlOiBzdHJpbmdcbn0iLCJpbXBvcnQgeyBGYWNldFJlc3VsdCB9IGZyb20gJy4vZmFjZXRzLmpzJztcbmltcG9ydCB7IE5hbWVkSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi5qcyc7XG5cbi8qKlxuICogVGhlIHJ1biByZWYgaXMgdXNlZCB0byBpZGVudGlmeSBhIHJ1biBkb2N1bWVudCBpbiB0aGUgc3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvblJ1bkRvY1JlZiB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBhY2NvdW50OiBzdHJpbmcsXG4gICAgcHJvamVjdDogc3RyaW5nLFxufVxuXG4vKipcbiAqIEludGVyYWN0aW9uIGV4ZWN1dGlvbiBwYXlsb2FkIGZvciBjcmVhdGluZyBhIG5ldyBydW5cbiAqIEl0IHVzZXMgaW50ZXJhY3Rpb24gZmllbGQgKGZyb20gTmFtZWRJbnRlcmFjdGlvbkV4ZWN1dGlvblBheWxvYWQpIHRvIHBhc3MgdGhlIGludGVyYWN0aW9uIElEIHRvIHJ1blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkNyZWF0ZVBheWxvYWQgZXh0ZW5kcyBOYW1lZEludGVyYWN0aW9uRXhlY3V0aW9uUGF5bG9hZCB7XG59XG5cbi8qKlxuICogVG8gYmUgdXNlZCBhcyBhIHZhbHVlIGZvciBhIG51bWVyaWMgb3IgZGF0ZSBmaWx0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VWYWx1ZSB7XG4gICAgZ3Q/OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgZ3RlPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIGx0PzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIGx0ZT86IG51bWJlciB8IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TZWFyY2hNZXRhUmVzcG9uc2Uge1xuICAgIGNvdW50OiB7XG4gICAgICAgIGxvd2VyX2JvdW5kPzogbnVtYmVyLFxuICAgICAgICB0b3RhbD86IG51bWJlcixcbiAgICB9LFxuICAgIGZhY2V0OiBSZWNvcmQ8c3RyaW5nLCBGYWNldFJlc3VsdD5cbn1cbiIsImV4cG9ydCB0eXBlIFRzUHJvcFR5cGUgPSBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJyZWNvcmRcIiB8IFwib2JqZWN0XCIgfCBcImFycmF5XCIgfCBcImVudW1cIiB8IFwibGl0ZXJhbFwiIHwgXCJ1bmlvblwiIHwgXCJwcm9taXNlXCIgfCBcImFueVwiIHwgXCJ2b2lkXCI7XG5cbi8vIGdlbmVyaWMgdHlwZXMgYXJlIHJlcGxhY2VkIGJ5IFwiYW55XCJcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlUeXBlRGVmaW5pdGlvbiB7XG4gICAgbmFtZTogVHNQcm9wVHlwZTtcbiAgICAvLyBpbiBjYXNlIG9mIHByaW1pdGl2ZXMgd2lsbCBiZSB0aGUgdHlwZSBuYW1lOiBzdHJpbmcsIGJvb2xlYW4gbnVtYmVyLlxuICAgIC8vIGluIGNhc2Ugb2Ygb2JqZWN0cyBvciBlbnVtcyB3aWxsIGJlIHRoZSBvYmplY3QgbmFtZVxuICAgIC8vIGluIGNhc2Ugb2YgYXJyYXlzIHdpbGwgYmUgU3RyaW5nKGl0ZW1UeXBlLnZhbHVlKStcIltdXCJcbiAgICAvLyBpbiBjYXNlIG9mIHByaW1pdGl2ZSBsaXRlcmFscyB3aWxsIGJlIHRoZSB2YWx1ZVxuICAgIC8vIG9yIG5lc3RlZCBvYmplY3RzIC8gYXJyYXlzIHdpbGwgYmUgXCJvYmplY3RcIiBvciBcImFycmF5XCJcbiAgICAvLyBmb3IgcmVjb3JkIHRoaXMgaXMgUmVjb3JkPHR5cGUsdHlwZT5cbiAgICB2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbiB8IG51bWJlciB8IG51bGw7XG4gICAgLy8gaW4gY2FzZSBvZiBvYmplY3RzXG4gICAgbWVtYmVycz86IEFjdGl2aXR5UHJvcGVydHlEZWZpbml0aW9uW107XG4gICAgLy8gaW4gY2FzZSBvZiBhcnJheXMgb3IgcHJvbWlzZXMgd2lsbCBiZSBpbm5lclR5cGUgKGkuZS4gdGhlIGVsZW1lbnQgdHlwZSBmb3IgYXJyYXlzKVxuICAgIGlubmVyVHlwZT86IEFjdGl2aXR5VHlwZURlZmluaXRpb247XG4gICAgLy8gaW4gY2FzZSBvZiBlbnVtcyB0aGUgZW51bSB2YWx1ZXMgd2lsbCBiZSBoZXJlXG4gICAgZW51bT86IHN0cmluZ1tdIHwgbnVtYmVyW10gfCB1bmRlZmluZWQ7XG4gICAgLy8gaW4gY2FzZSBvZiB1bmlvbnNcbiAgICB1bmlvbj86IEFjdGl2aXR5VHlwZURlZmluaXRpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eVByb3BlcnR5RGVmaW5pdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHR5cGU6IEFjdGl2aXR5VHlwZURlZmluaXRpb247XG4gICAgb3B0aW9uYWw6IGJvb2xlYW47XG4gICAgLy8gdGhlIEpTRG9jIGNvbW1lbnQgZm9yIHRoZSBhY3Rpdml0eSBwcm9wZXJ0eVxuICAgIGRvYz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eURlZmluaXRpb24ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvLyBnZW5lcmF0ZWQgZnJvbSBuYW1lXG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvLyB0aGUgSlNEb2MgY29tbWVudCBmb3IgdGhlIGFjdGl2aXR5IGZ1bmN0aW9uXG4gICAgZG9jPzogc3RyaW5nO1xuICAgIHBhcmFtc1R5cGU6IHN0cmluZztcbiAgICBwYXJhbXM6IEFjdGl2aXR5UHJvcGVydHlEZWZpbml0aW9uW107XG4gICAgcmV0dXJuVHlwZT86IEFjdGl2aXR5VHlwZURlZmluaXRpb24gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlDYXRhbG9nIHtcbiAgICBhY3Rpdml0aWVzOiBBY3Rpdml0eURlZmluaXRpb25bXTtcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQWdlbnREZXBsb3ltZW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZW50IElEIGlzIGNvbXBvc2VkIGZyb20gdGhlIGFnZW50IG9yZ2FuaXphdGlvbiBhbmQgdGhlIGFnZW50IG5hbWUsIHNlcGFyYXRlZCBieSBhIHNsYXNoLlxuICAgICAqIEV4YW1wbGU6IHZlcnRlc2lhL2RvY2dlbi1hZ2VudFxuICAgICAqL1xuICAgIGFnZW50SWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW52aXJvbm1lbnQgdG8gZGVwbG95IHRoZSBhZ2VudCB0by4gVGhpcyBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuICAgICAqICAgLSBgcHJvZHVjdGlvbmBcbiAgICAgKiAgIC0gYHByZXZpZXdgXG4gICAgICogICAtIGBzdGFnaW5nYFxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicgfCAncHJldmlldycgfCAnc3RhZ2luZyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWdlbnQgZG9ja2VyIGltYWdlIHZlcnNpb24uIEEgbWFqb3IubWlub3IucGF0Y2hbLW1vZGlmaWVyXSBzdHJpbmcuXG4gICAgICovXG4gICAgdmVyc2lvbjogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgQmFzZU9iamVjdCB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0IHsgQ29sdW1uTGF5b3V0LCBDb250ZW50T2JqZWN0VHlwZVJlZiB9IGZyb20gXCIuL3N0b3JlLmpzXCI7XG5cbmV4cG9ydCBlbnVtIENvbGxlY3Rpb25TdGF0dXMge1xuICAgIGFjdGl2ZSA9IFwiYWN0aXZlXCIsXG4gICAgYXJjaGl2ZWQgPSBcImFyY2hpdmVkXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ29sbGVjdGlvblBheWxvYWQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkeW5hbWljOiBib29sZWFuO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwYXJlbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHRhYmxlX2xheW91dD86IENvbHVtbkxheW91dFtdIHwgbnVsbDtcbiAgICBhbGxvd2VkX3R5cGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkl0ZW0gZXh0ZW5kcyBCYXNlT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZHluYW1pYyBvciBzdGF0aWMuXG4gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gaXMgZHluYW1pYywgdGhlIG1lbWJlcnMgYXJlIGRldGVybWluZWQgYnkgYSBxdWVyeSB1c2luZyB0aGUgcXVlcnkgZmllbGQuXG4gICAgICogSWYgdGhlIGNvbGxlY3Rpb24gaXMgc3RhdGljLCB0aGUgbWVtYmVycyBhcmUgZXhwbGljaXRseSBkZWZpbmVkIHVzaW5nIHRoZSBtZW1iZXJzIGFycmF5LlxuICAgICAqL1xuICAgIGR5bmFtaWM6IGJvb2xlYW47XG4gICAgc3RhdHVzOiBDb2xsZWN0aW9uU3RhdHVzO1xuICAgIC8vIEEgcmVmIHRvIHRoZSBvYmplY3QgdHlwZVxuICAgIHR5cGU/OiBDb250ZW50T2JqZWN0VHlwZVJlZjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IGNvbGxlY3Rpb24gaWYgYW55XG4gICAgICovXG4gICAgcGFyZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFibGUgbGF5b3V0IHRvIHVzZSBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gICAgICogVGhlIGxheW91dCBkZWZpbmVkIGluIHRoZSB0eXBlIGNvdWxkIHNlcnZlIGFzIGEgZmFsbGJhY2sgaWYgbm90IGRlZmluZWQgaGVyZS5cbiAgICAgKi9cbiAgICB0YWJsZV9sYXlvdXQ/OiBDb2x1bW5MYXlvdXRbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhbGxvd2VkIHR5cGVzIGZvciB0aGUgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBhbGxvd2VkX3R5cGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbiBleHRlbmRzIENvbGxlY3Rpb25JdGVtIHtcbiAgICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNDb2xsZWN0aW9uIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgZHluYW1pYzogZmFsc2U7XG4gICAgbWVtYmVyczogc3RyaW5nW107XG4gICAgcXVlcnk6IG5ldmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtaWNDb2xsZWN0aW9uIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgZHluYW1pYzogdHJ1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uU2VhcmNoUGF5bG9hZCB7XG4gICAgZHluYW1pYz86IGJvb2xlYW47XG4gICAgc3RhdHVzPzogQ29sbGVjdGlvblN0YXR1cztcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4iLCIvKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbGwgZG9tYWluIG9iamVjdHMgaW4gdGhlIHN5c3RlbS5cbiAqIFByb3ZpZGVzIGNvbW1vbiBwcm9wZXJ0aWVzIHNoYXJlZCBhY3Jvc3MgYWxsIGJ1c2luZXNzIGVudGl0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VPYmplY3Qge1xuICAgIC8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9iamVjdCAqL1xuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbmFtZSBvciB0aXRsZSAqL1xuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBPcHRpb25hbCBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0ICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvKiogT3B0aW9uYWwgYXJyYXkgb2YgY2F0ZWdvcml6YXRpb24gdGFncyAqL1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcblxuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBvYmplY3QgKi9cbiAgICB1cGRhdGVkX2J5OiBzdHJpbmc7XG5cbiAgICAvKiogSWRlbnRpZmllciBvZiB0aGUgdXNlciB3aG8gY3JlYXRlZCB0aGUgb2JqZWN0ICovXG4gICAgY3JlYXRlZF9ieTogc3RyaW5nO1xuXG4gICAgLyoqIElTTyB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuXG4gICAgLyoqIElTTyB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgb2JqZWN0IHdhcyBsYXN0IHVwZGF0ZWQgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG5cbn0iLCJpbXBvcnQgeyBXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsIFdvcmtmbG93UnVuU3RhdHVzIH0gZnJvbSBcIi4vd29ya2Zsb3cuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQZGZUb1JpY2h0ZXh0T3B0aW9ucyB7XG4gICAgZmVhdHVyZXM6IHN0cmluZ1tdO1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGRmVG9SaWNoVGV4dFdvcmtmbG93UGF5bG9hZCBleHRlbmRzIE9taXQ8V29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkLCBcInZhcnNcIj4ge1xuICAgIHZhcnM6IFBkZlRvUmljaHRleHRPcHRpb25zO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBpbWFnZSBpbiBhIGRvY3VtZW50IHRoYXQgaGFzIGJlZW4gYW5hbHl6ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NJbWFnZSB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgcGFnZV9udW1iZXI/OiBudW1iZXI7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgaXNfbWVhbmluZ2Z1bD86IGJvb2xlYW47XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBleHBvcnQgdHlwZSBmb3JtYXRzIGZvciB0YWJsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIEV4cG9ydFRhYmxlRm9ybWF0cyA9ICdqc29uJyB8ICdjc3YnIHwgJ3htbCc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRhYmxlIGluIGEgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiBhbmFseXplZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY1RhYmxlIHtcbiAgICBwYWdlX251bWJlcj86IG51bWJlcjtcbiAgICB0YWJsZV9udW1iZXI/OiBudW1iZXI7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBcImFwcGxpY2F0aW9uL2NzdlwiIHwgXCJhcHBsaWNhdGlvbi9qc29uXCI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRhYmxlIGluIGEgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiBhbmFseXplZCBpbiBDU1YgZm9ybWF0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jVGFibGVDc3YgZXh0ZW5kcyBEb2NUYWJsZSB7XG4gICAgZm9ybWF0OiBcImFwcGxpY2F0aW9uL2NzdlwiO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGFibGUgaW4gYSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIGFuYWx5emVkIGluIEpTT04gZm9ybWF0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jVGFibGVKc29uIGV4dGVuZHMgRG9jVGFibGUge1xuICAgIGZvcm1hdDogXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgZGF0YTogT2JqZWN0W107XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRvY3VtZW50IGFuYWx5c2lzIHJ1biBzdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NBbmFseXplUnVuU3RhdHVzUmVzcG9uc2UgZXh0ZW5kcyBXb3JrZmxvd1J1blN0YXR1cyB7XG4gICAgcHJvZ3Jlc3M/OiBEb2NBbmFseXplclByb2dyZXNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvY0FuYWx5emVyUmVzdWx0UmVzcG9uc2Uge1xuICAgIGRvY3VtZW50Pzogc3RyaW5nO1xuICAgIHRhYmxlcz86IERvY1RhYmxlQ3N2W10gfCBEb2NUYWJsZUpzb25bXTtcbiAgICBpbWFnZXM/OiBEb2NJbWFnZVtdO1xuICAgIGFubm90YXRlZD86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jQW5hbHl6ZXJQcm9ncmVzcyB7XG4gICAgcGFnZXM6IERvY0FuYWx5emVyUHJvZ3Jlc3NTdGF0dXM7XG4gICAgaW1hZ2VzOiBEb2NBbmFseXplclByb2dyZXNzU3RhdHVzO1xuICAgIHRhYmxlczogRG9jQW5hbHl6ZXJQcm9ncmVzc1N0YXR1cztcbiAgICB2aXN1YWxzOiBEb2NBbmFseXplclByb2dyZXNzU3RhdHVzO1xuICAgIHN0YXJ0ZWRfYXQ/OiBudW1iZXI7XG4gICAgcGVyY2VudDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRG9jQW5hbHl6ZXJQcm9ncmVzc1N0YXR1cyB7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBwcm9jZXNzZWQ6IG51bWJlcjtcbiAgICBzdWNjZXNzOiBudW1iZXI7XG4gICAgZmFpbGVkOiBudW1iZXI7XG59XG5cbi8qKlxuICogQWRhcHQgVGFibGVzIFBhcmFtZXRlcnMsIHBhcnQgb2YgdGhlIHJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGFwdFRhYmxlc1BhcmFtcyB7XG4gICAgLyoqXG4gICAgICogSlNPTiBTY2hlbWEgdG8gdG8gY29udmVydCB0aGUgdGFibGUgaW50b1xuICAgICAqL1xuICAgIHRhcmdldF9zY2hlbWE6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE5hdHVyYWwgbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgaXRlbSB0aGUgdGFibGUgYXJlIGNvbXBvc2VkIG9mXG4gICAgICovXG4gICAgaXRlbV9uYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBOYXR1cmFsIGxhbmd1YWdlIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIHRhYmxlIG9yIGl0ZW0gdG8gY29udmVydFxuICAgICAqL1xuICAgIGluc3RydWN0aW9ucz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCB0byByZXR1cm4gdGhlIGRhdGEgaW4gKGNzdiwganNvbilcbiAgICAgKi9cbiAgICBmb3JtYXQ/OiBcImNzdlwiIHwgXCJqc29uXCI7XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSB0YWJsZSBhcyBhIHdob2xlIG9yIGJ5IHBhZ2VcbiAgICAgKi9cbiAgICBwcm9jZXNzX2FzPzogXCJwYWdlXCIgfCBcInRhYmxlXCI7XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSB0YWJsZSBhcyBhIENTViBmaWxlXG4gICAgICovXG4gICAgcHJvY2Vzc19hc19jc3Y/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRG9jQW5hbHl6ZXJSZXF1ZXN0QmFzZSB7XG4gICAgc3luY2hyb25vdXM/OiBib29sZWFuO1xuXG4gICAgbm90aWZ5X2VuZHBvaW50cz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogV2hhdCBlbnZpcm9ubWVudCB0byB1c2UgdG8gcnVuIHRoZSByZXF1ZXN0XG4gICAgICogSWYgbm9uZSBzcGVjaWZpZWQgdGhlIHByb2plY3QgZW1iZWRkZWQgZW52aXJvbm1lbnQgd2lsbCBiZSB1c2VkXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRUYWJsZXNSZXF1ZXN0IGV4dGVuZHMgRG9jQW5hbHl6ZXJSZXF1ZXN0QmFzZSwgQWRhcHRUYWJsZXNQYXJhbXMge31cblxuLyoqXG4gKiBHZXQgQWRhcHRlZCBUYWJsZXMgUmVxdWVzdFxuICogQHBhcmFtIHJhdyBJZiB0cnVlLCB0aGUgcmF3IGRhdGEgd2lsbCBiZSByZXR1cm5lZFxuICogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0IHRvIHJldHVybiB0aGUgZGF0YSBpbiAoY3N2LCBqc29uKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEFkYXB0ZWRUYWJsZXNSZXF1ZXN0UXVlcnkge1xuICAgIHJhdz86IGJvb2xlYW47XG4gICAgZm9ybWF0OiBcImNzdlwiIHwgXCJqc29uXCI7XG59XG4vKipcbiAqIFRoZSBhZGFwdGVkIHRhYmxlIHJlc3VsdCBmb3JtYXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVkVGFibGUge1xuICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PltdO1xufVxuIiwiaW1wb3J0IHsgU3RyaW5nVmFsdWUgfSBmcm9tIFwibXNcIjtcbmltcG9ydCB7IEJhc2VPYmplY3QgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCB7IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQYXJlbnRDbG9zZVBvbGljeVR5cGUgfSBmcm9tIFwiLi90ZW1wb3JhbGlvLmpzXCI7XG5cblxuLyoqXG4gKiBUaGUgcGF5bG9hZCBzZW50IHdoZW4gc3RhcnRpbmcgYSB3b3JrZmxvdyBmcm9tIHRoZSB0ZW1wb3JhbCBjbGllbnQgdG8gdGhlIHdvcmtmbG93IGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERTTFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCBleHRlbmRzIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB7XG4gICAgLyoqXG4gICAgICogVGhlIHdvcmtmbG93IGRlZmluaXRpb24gdG8gYmUgdXNlZCBieSB0aGUgRFNMIHdvcmtmbG93LlxuICAgICAqIElmIGEgZHNsIHdvcmtmbG93IGlzIGV4ZWN1dGVkIGFuZCBubyBkZWZpbml0aW9uIGlzIHByb3ZpZGVkIHRoZSB3b3JrZmxvdyB3aWxsIGZhaWwuXG4gICAgICovXG4gICAgd29ya2Zsb3c6IERTTFdvcmtmbG93U3BlYztcbn1cblxuLyoqXG4gKiBUaGUgcGF5bG9hZCBmb3IgYSBEU0wgYWN0aXZpdHkgb3B0aW9ucy5cbiAqXG4gKiBAc2VlIEFjdGl2aXR5T3B0aW9ucyBpbiBAdGVtcG9yYWxpby9jb21tb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEU0xBY3Rpdml0eU9wdGlvbnMge1xuICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcbiAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0PzogU3RyaW5nVmFsdWUgfCBudW1iZXI7XG4gICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IFN0cmluZ1ZhbHVlIHwgbnVtYmVyO1xuICAgIHJldHJ5PzogRFNMUmV0cnlQb2xpY3k7XG59XG5cbi8qKlxuICogVGhlIHBheWxvYWQgZm9yIGEgRFNMIHJldHJ5IHBvbGljeS5cbiAqXG4gKiBAc2VlIFJldHJ5UG9saWN5IGluIEB0ZW1wb3JhbGlvL2NvbW1vblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERTTFJldHJ5UG9saWN5IHtcbiAgICBiYWNrb2ZmQ29lZmZpY2llbnQ/OiBudW1iZXI7XG4gICAgaW5pdGlhbEludGVydmFsPzogU3RyaW5nVmFsdWUgfCBudW1iZXI7XG4gICAgbWF4aW11bUF0dGVtcHRzPzogbnVtYmVyO1xuICAgIG1heGltdW1JbnRlcnZhbD86IFN0cmluZ1ZhbHVlIHwgbnVtYmVyO1xuICAgIG5vblJldHJ5YWJsZUVycm9yVHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGF5bG9hZCBmb3IgYSBEU0wgYWN0aXZpdHkgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERTTEFjdGl2aXR5RXhlY3V0aW9uUGF5bG9hZDxQYXJhbXNUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gZXh0ZW5kcyBXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQge1xuICAgIGFjdGl2aXR5OiBEU0xBY3Rpdml0eVNwZWM7XG4gICAgcGFyYW1zOiBQYXJhbXNUO1xuICAgIHdvcmtmbG93X25hbWU6IHN0cmluZztcbiAgICBkZWJ1Z19tb2RlPzogYm9vbGVhbjtcbn1cblxuXG5leHBvcnQgdHlwZSBJbXBvcnRTcGVjID0gKHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW107XG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RmV0Y2hTcGVjIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBwcm92aWRlciBuYW1lXG4gICAgICovXG4gICAgdHlwZTogXCJkb2N1bWVudFwiIHwgXCJkb2N1bWVudF90eXBlXCIgfCBcImludGVyYWN0aW9uX3J1blwiO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIFVSSSB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAgICovXG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB0byBiZSBleGVjdXRlZCBieSB0aGUgZGF0YSBwcm92aWRlclxuICAgICAqL1xuICAgIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIC8qKlxuICAgICAqIGEgc3RyaW5nIG9mIHNwYWNlIHNlcGFyYXRlZCBmaWVsZCBuYW1lcy5cbiAgICAgKiBQcmVmaXggYSBmaWVsZCBuYW1lIHdpdGggXCItXCIgdG8gZXhjbHVkZSBpdCBmcm9tIHRoZSByZXN1bHQuXG4gICAgICovXG4gICAgc2VsZWN0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybi4gSWYgdGhlIHJlc3VsdCBpcyBsaW1pdGVkIHRvIDEgdGhlIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIG9iamVjdFxuICAgICAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogSG93IHRvIGhhbmRsZSBub3QgZm91bmQgb2JqZWN0cy5cbiAgICAgKiAxLiBpZ25vcmUgLSBJZ25vcmUgYW5kIHJldHVybiBhbiBlbXB0eSBhcnJheSBmb3IgbXVsdGkgb2JqZWN0cyBxdWVyeSAob3IgdW5kZWZpbmVkIGZvciBzaW5nbGUgb2JqZWN0IHF1ZXJ5KSBvciBlbXB0eSBhcnJheSBmb3IgbXVsdGlwbGUgb2JqZWN0cyB0aHJvdyBhbiBlcnJvci5cbiAgICAgKiAyLiB0aHJvdyAtIFRocm93IGFuIGVycm9yIGlmIHRoZSBvYmplY3Qgb3Igbm8gb2JqZWN0cyBhcmUgZm91bmQuXG4gICAgICovXG4gICAgb25fbm90X2ZvdW5kPzogXCJpZ25vcmVcIiB8IFwidGhyb3dcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEU0xXb3JrZmxvd1N0ZXBCYXNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBmbyB0aGUgc3RlcC5cbiAgICAgKiBJZiBub3Qgc2V0IGRlZmF1bHRzIHRvIFwiYWN0aXZpdHlcIlxuICAgICAqL1xuICAgIHR5cGU6IFwiYWN0aXZpdHlcIiB8IFwid29ya2Zsb3dcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEU0xBY3Rpdml0eVNwZWM8UEFSQU1TIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHkgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGl0bGUgb2YgdGhlIGFjdGl2aXR5IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkgd29ya2Zsb3cgYnVpbGRlclxuICAgICAqL1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aXZpdHkgdG8gZSBkaXNwbGF5ZWQgaW4gdGhlIFVJIHdvcmtmbG93IGJ1aWxkZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0aWVzIHBhcmFtZXRlcnMuIFRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIGVpdGhlciBsaXRlcmFsc1xuICAgICAqIChoYXJkY29kZWQgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9iamVjdHMsIGFycmF5cyBldGMuKSwgZWl0aGVyXG4gICAgICogcmVmZXJlbmNlcyB0byB0aGUgd29ya2Zsb3cgdmFyaWFibGVzLlxuICAgICAqIFRoZSB3b3JrZmxvdyB2YXJpYWJsZXMgYXJlIGJ1aWx0IGZyb20gdGhlIHdvcmtmbG93IHBhcmFtcyAoZS5nLiB0aGUgd29ya2Zsb3cgY29uZmlndXJhdGlvbilcbiAgICAgKiBhbmQgZnJvbSB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBhY3Rpdml0aWVzLlxuICAgICAqL1xuICAgIHBhcmFtcz86IFBBUkFNUztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cgdmFyaWFibGUgdGhhdCB3aWxsIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlIGFjdGl2aXR5XG4gICAgICogSWYgbm90IHNwZWNpZmllZCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIHN0b3JlZFxuICAgICAqIFRoZSBwYXJhbWV0ZXJzIGRlc2NyaWJlIGhvdyB0aGUgYWN0dWFsIHBhcmFtZXRlcnMgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gdmFycy5cbiAgICAgKiBzaW5jZSBpdCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHdvcmtmbG93IGV4ZWN1dGlvbiB2YXJzLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgSlNPTiBleHByZXNzaW9uIHdoaWNoIGV2YWx1YXRlIHRvIHRydWUgb3IgZmFsc2Ugc2ltaWxhciB0byBtb25nbyBtYXRjaGVzLlxuICAgICAqIFdlIHN1cHBvcnQgZm9yIG5vdyBiYXNpYyBleHByZXNzaW9uIGxpa2U6ICR0cnVlLCAkZmFsc2UsICRlcSwgJG5lLCAkZ3QsICRndGUsICRsdCwgJGx0ZSwgJGluLCAkbmluLCAkcmVnZXhwXG4gICAgICogeyRlcToge25hbWU6IHZhbHVlfX0sXG4gICAgICogRXg6IHskZXE6IHt3ZlZhck5hbWU6IHZhbHVlfX1cbiAgICAgKi9cbiAgICBjb25kaXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGltcG9ydCBzcGVjIGlzIHVzZWQgdG8gaW1wb3J0IGRhdGEgZnJvbSB3b3JrZmxvdyB2YXJpYWJsZXMuXG4gICAgICogVGhlIGltcG9ydCBzcGVjIGlzIGEgbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyB0byBpbXBvcnQgZnJvbSB0aGUgd29ya2Zsb3cgY29udGV4dC5cbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIG9iamVjdHMgdG8gcmVuYW1lIHRoZSBpbXBvcnRlZCB2YXJpYWJsZXMsIG9yIHRvIHJlZmVyZW5jZSBhbiBleHByZXNzaW9uLlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogW1wicnVuSWRcIiwge1widHlwZUlkXCI6IFwiZG9jVHlwZS5pZFwifV1cbiAgICAgKi9cbiAgICBpbXBvcnQ/OiBJbXBvcnRTcGVjO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZldGNoIHBoYXNlIGlzIHVzZWQgdG8gZmV0Y2ggZGF0YSBmcm9tIGV4dGVybmFsIHNvdXJjZXMuXG4gICAgICovXG4gICAgZmV0Y2g/OiBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZldGNoU3BlYz47XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0aW9uIHRvIGFwcGx5IHRvIHRoZSByZXN1bHQuIE5vdCBhbGwgYWN0aXZpdGllcyBzdXBwb3J0IHRoaXMuXG4gICAgICovXG4gICAgcHJvamVjdGlvbj86IG5ldmVyIHwgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIC8vIC0tLS0tLS0tLS0gT3B0aW9uYWwgZmVhdHVyZXMgbm90IGltcGxlbWVudGVkIGluIGEgZmlyc3Qgc3RlcCAtLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBJZiB0cnVlIHRoZSBhY3Rpdml0eSB3aWxsIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGggdGhlIG90aGVyIGFjdGl2aXRpZXMuXG4gICAgICogKGkuZS4gdGhlIHdvcmtmbG93IHdpbGwgbm90IHdhaXQgZm9yIHRoZSBhY3Rpdml0eSB0byBmaW5pc2ggYmVmb3JlIHN0YXJ0aW5nIHRoZSBuZXh0IG9uZSlcbiAgICAgKi9cbiAgICBwYXJhbGxlbD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBd2FpdCBmb3IgYSBwYXJhbGxlbCBhY3Rpdml0eSBleGVjdXRpb24gdG8gcmV0dXJuLlxuICAgICAqL1xuICAgIGF3YWl0Pzogc3RyaW5nOyAvL3RoZSBhY3Rpdml0eSBuYW1lIHRvIGF3YWl0XG5cbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSBvcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uLCB3aGljaCBvdmVycmlkZXMgdGhlIGFjdGl2aXR5IG9wdGlvbnNcbiAgICAgKiBkZWZpbmVkIGF0IHdvcmtmbG93IGxldmVsLlxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBEU0xBY3Rpdml0eU9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRFNMQWN0aXZpdHlTdGVwPFBBUkFNUyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiBleHRlbmRzIERTTEFjdGl2aXR5U3BlYzxQQVJBTVM+LCBEU0xXb3JrZmxvd1N0ZXBCYXNlIHtcbiAgICB0eXBlOiBcImFjdGl2aXR5XCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRFNMQ2hpbGRXb3JrZmxvd1N0ZXAgZXh0ZW5kcyBEU0xXb3JrZmxvd1N0ZXBCYXNlIHtcbiAgICB0eXBlOiBcIndvcmtmbG93XCI7XG4gICAgLy8gdGhlIHdvcmtmbG93IGVuZHBvaW50IHRvIHJ1blxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBjaGlsZCB3b3JrZmxvdy5cbiAgICAgKiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgbWVyZ2VkIG92ZXIgdGhlIHBhcmVudCB3b3JrZmxvdyB2YXJzIGFuZCBwYXNzZWQgYWx0b2dldGhlciB0byB0aGUgY2hpbGQgd29ya2Zsb3cuXG4gICAgICovXG4gICAgdmFycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgLy8gd2hldGhlciBvciBub3QgdG8gd2FpdCBmb3IgdGhlIHdvcmtmbG93IHRvIGZpbmlzaC5cbiAgICAvLyBkZWZhdWx0IGlzIGZhbHNlLiAodGhlIHBhcmVudCB3b3JrZmxvdyB3aWxsIGF3YWl0IGZvciB0aGUgd29ya2Zsb3cgdG8gZmluaXNoKVxuICAgIGFzeW5jPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cgdmFyaWFibGUgdGhhdCB3aWxsIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIHdvcmtmbG93IChpZiBhc3luYyB0aGUgd29ya2Zsb3cgaWQgaXMgc3RvcmVkKVxuICAgICAqIElmIG5vdCBzcGVjaWZpZWQgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBzdG9yZWRcbiAgICAgKiBUaGUgcGFyYW1ldGVycyBkZXNjcmliZSBob3cgdGhlIGFjdHVhbCBwYXJhbWV0ZXJzIHdpbGwgYmUgb2J0YWluZWQgZnJvbSB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHZhcnMuXG4gICAgICogc2luY2UgaXQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byB3b3JrZmxvdyBleGVjdXRpb24gdmFycy5cbiAgICAgKi9cbiAgICBvdXRwdXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gY2FzZSB0aGUgZHNsV29ya2Zsb3cgaXMgdXNlZCBhcyBhIGNoaWxkIHdvcmtmbG93IHRoZSBzcGVjIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBjaGlsZCB3b3JrZmxvdy5cbiAgICAgKiBJZiBzcGVjIGlzIGRlZmluZWQgdGhlbiB0aGUgbmFtZSBtdXN0IGJlIFwiZHNsV29ya2Zsb3dcIlxuICAgICAqL1xuICAgIHNwZWM/OiBEU0xXb3JrZmxvd1NwZWM7XG4gICAgb3B0aW9ucz86IHtcbiAgICAgICAgbWVtbz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgIHJldHJ5PzogRFNMUmV0cnlQb2xpY3k7XG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IG51bWJlcltdIHwgYm9vbGVhbltdIHwgRGF0ZVtdPjtcbiAgICAgICAgdGFza1F1ZXVlPzogc3RyaW5nO1xuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ/OiBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0PzogU3RyaW5nVmFsdWUgfCBudW1iZXI7XG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ/OiBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcbiAgICAgICAgd29ya2Zsb3dJZD86IHN0cmluZztcbiAgICAgICAgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuICAgICAgICBwYXJlbnRDbG9zZVBvbGljeT86IFBhcmVudENsb3NlUG9saWN5VHlwZTtcbiAgICAgICAgLy9UT0RPXG4gICAgICAgIC8vY2FuY2VsbGF0aW9uVHlwZVxuICAgICAgICAvL3ZlcnNpb25pbmdJbnRlbnRcbiAgICAgICAgLy93b3JrZmxvd0lkUmV1c2VQb2xpY3lcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIERTTFdvcmtmbG93U3RlcCA9IERTTEFjdGl2aXR5U3RlcCB8IERTTENoaWxkV29ya2Zsb3dTdGVwO1xuXG5leHBvcnQgaW50ZXJmYWNlIERTTFdvcmtmbG93U3BlY0Jhc2Uge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB0YWdzPzogc3RyaW5nW107XG5cbiAgICBzdGVwcz86IERTTFdvcmtmbG93U3RlcFtdIHwgbmV2ZXI7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHN0ZXBzIGluc3RlYWRcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzPzogRFNMQWN0aXZpdHlTcGVjW10gfCBuZXZlcjtcblxuICAgIC8vIGEgZGljdGlvbmFyeSBvZiB2YXJzIHRvIGluaXRpYWxpemUgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiB2YXJzXG4gICAgLy8gSW5pdGlhbCB2YXJzIGNhbm5vdCBjb250YWlucyByZWZlcmVuY2VzIHRvIG90aGVyIHZhcnNcbiAgICB2YXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIC8vIGFjdGl2aXR5IG9wdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgYWN0aXZpdGllcyB3aXRoaW4gdGhlIHdvcmtmbG93XG4gICAgb3B0aW9ucz86IERTTEFjdGl2aXR5T3B0aW9ucztcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhlIHdvcmtmbG93IHJlc3VsdFxuICAgIC8vIGlmIG5vdCBzcGVjaWZpZWQgXCJyZXN1bHRcIiB3aWxsIGJlIGFzc3VtZWRcbiAgICByZXN1bHQ/OiBzdHJpbmc7XG4gICAgZGVidWdfbW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRFNMV29ya2Zsb3dTcGVjV2l0aFN0ZXBzIGV4dGVuZHMgRFNMV29ya2Zsb3dTcGVjQmFzZSB7XG4gICAgc3RlcHM6IERTTFdvcmtmbG93U3RlcFtdO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBzdGVwcyBpbnN0ZWFkXG4gICAgICovXG4gICAgYWN0aXZpdGllcz86IG5ldmVyO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBzdGVwcyBpbnN0ZWFkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRFNMV29ya2Zsb3dTcGVjV2l0aEFjdGl2aXRpZXMgZXh0ZW5kcyBEU0xXb3JrZmxvd1NwZWNCYXNlIHtcbiAgICBzdGVwcz86IG5ldmVyO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBzdGVwcyBpbnN0ZWFkXG4gICAgICovXG4gICAgYWN0aXZpdGllczogRFNMQWN0aXZpdHlTcGVjW107XG59XG5cbi8qKlxuICogYWN0aXZpdGllcyBhbmQgc3RlcHMgZmllbGRzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcbiAqIHN0ZXBzIHdhcyBhZGRlZCBhZnRlciBhY3Rpdml0aWVzIGFuZCBtYXkgY29udGFpbiBhIG1peCBvZiBhY3Rpdml0aWVzIGFuZCBvdGhlciB0YXNrcyBsaWtlIGV4ZWMgY2hpbGQgd29ya2Zsb3dzLlxuICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2Uga2VlcCB0aGUgYWN0aXZpdGllcyBmaWVsZCBhcyBhIGZhbGxiYWNrIGJ1dCBvbmUgc2hvdWxkIHVzZSBvbmUgb3IgdGhlIG90aGVyIG5vdCBib3RoLlxuICovXG5leHBvcnQgdHlwZSBEU0xXb3JrZmxvd1NwZWMgPSBEU0xXb3JrZmxvd1NwZWNXaXRoU3RlcHMgfCBEU0xXb3JrZmxvd1NwZWNXaXRoQWN0aXZpdGllcztcblxuZXhwb3J0IGludGVyZmFjZSBEU0xXb3JrZmxvd0RlZmluaXRpb24gZXh0ZW5kcyBCYXNlT2JqZWN0LCBEU0xXb3JrZmxvd1NwZWNCYXNlIHtcbiAgICAvLyBhbiBvcHRpb25hbCBKU09OIHNjaGVtYSB0byBkZXNjcmliZSB0aGUgaW5wdXQgdmFycyBvZiB0aGUgd29ya2Zsb3cuXG4gICAgaW5wdXRfc2NoZW1hPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBhY3Rpdml0aWVzPzogRFNMQWN0aXZpdHlTcGVjW107XG4gICAgc3RlcHM/OiBEU0xXb3JrZmxvd1N0ZXBbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0RlZmluaXRpb25SZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVwZGF0ZWRfYXQ6IERhdGU7XG59XG5cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0RlZmluaXRpb25SZWZQb3B1bGF0ZSA9IFwiaWQgbmFtZSBkZXNjcmlwdGlvbiB0YWdzIGNyZWF0ZWRfYXQgdXBkYXRlZF9hdFwiXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9hY3Rpdml0eS1jYXRhbG9nLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hZ2VudC5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29sbGVjdGlvbnMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZG9jLWFuYWx5emVyLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kc2wtd29ya2Zsb3cuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29iamVjdC10eXBlcy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBvcmFsaW8uanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dvcmtmbG93LmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zaWduYWxzLmpzXCI7XG4iLCJpbXBvcnQgdHlwZSB7IEpTT05TY2hlbWFUeXBlIH0gZnJvbSBcImFqdlwiXG5cbi8qRGVmYXVsdCBKU09OIFNjaGVtYSB0eXBlIGZvciByZW5kaXRpb24qL1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRpdGlvblByb3BlcnRpZXMge1xuICAgIG1pbWVfdHlwZTogc3RyaW5nLFxuICAgIHNvdXJjZV9ldGFnPzogc3RyaW5nLFxuICAgIGhlaWdodD86IG51bWJlcixcbiAgICB3aWR0aD86IG51bWJlcixcbiAgICBtdWx0aXBhcnQ/OiBib29sZWFuLFxuICAgIHRvdGFsX3BhcnRzPzogbnVtYmVyLFxufVxuXG5leHBvcnQgY29uc3QgUmVuZGl0aW9uU2NoZW1hOiBKU09OU2NoZW1hVHlwZTxSZW5kaXRpb25Qcm9wZXJ0aWVzPiA9IHtcblxuICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVwcmVzZW50IGEgcmVuZGl0aW9uIG9mIGEgZmlsZSBzdG9yZWQgaW4gYW4gb2JqZWN0LiBJdCB3aWxsIGJlIHN0b3JlZCBhcyBhIHNlcGFyYXRlIG9iamVjdCBpbiB0aGUgZGF0YWJhc2UuXCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBtaW1lX3R5cGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZm9ybWF0IG9mIHRoZSByZW5kaXRpb24uIFRoaXMgaXMgYSBNSU1FIHR5cGUuXCJcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlX2V0YWc6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRVRhZyBvZiB0aGUgZmlsZSB1c2VkIGZvciB0aGUgcmVuZGl0aW9uLlwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgaGVpZ2h0OiB7XG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWlnaHQgb2YgdGhlIHJlbmRpdGlvblwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgd2lkdGg6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHdpZHRoIG9mIHRoZSByZW5kaXRpb25cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIG11bHRpcGFydDoge1xuICAgICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJJZiB0aGUgcmVuZGl0aW9uIGlzIGEgbXVsdGktcGFydCByZW5kaXRpb25cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgdG90YWxfcGFydHM6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRvdGFsIG51bWJlciBvZiBwYXJ0cyBpbiB0aGUgcmVuZGl0aW9uXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogW1wibWltZV90eXBlXCJdLFxufVxuXG5cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFBhcnRQcm9wZXJ0aWVzIHtcblxuICAgIHNvdXJjZV9ldGFnPzogc3RyaW5nLFxuICAgIHBhcnRfbnVtYmVyOiBudW1iZXIsXG4gICAgdGl0bGU/OiBzdHJpbmcsXG4gICAgc291cmNlX2xpbmVfc3RhcnQ/OiBudW1iZXIsXG4gICAgc291cmNlX2xpbmVfZW5kPzogbnVtYmVyLFxuICAgIHR5cGU/OiAndGV4dCcgfCAnaW1hZ2UnIHwgJ3RhYmxlJyB8ICdjaGFydCcgfCAnZGlhZ3JhbScgfCAnY29kZScgfCAnb3RoZXInLFxuICAgIHBhZ2VfbnVtYmVyPzogbnVtYmVyLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIGhlaWdodD86IG51bWJlcixcbiAgICB3aWR0aD86IG51bWJlcixcblxufVxuXG5cbmV4cG9ydCBjb25zdCBEb2N1bWVudFBhcnRTY2hlbWE6IEpTT05TY2hlbWFUeXBlPERvY3VtZW50UGFydFByb3BlcnRpZXM+ID0ge1xuICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUmVwcmVzZW50IGEgc2VtYW50aWMgY2h1bmsgb2YgYSBkb2N1bWVudFwiLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc291cmNlX2V0YWc6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgRVRhZyBvZiB0aGUgZmlsZSB1c2VkIGZvciB0aGUgcmVuZGl0aW9uLlwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgcGFydF9udW1iZXI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHBhcnQgbnVtYmVyIG9mIHRoZSBjaHVua1wiLFxuICAgICAgICB9LFxuICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSB0aXRsZSBvZiB0aGUgY2h1bmtcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZV9saW5lX3N0YXJ0OiB7XG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgY2h1bmsgc3RhcnRzXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VfbGluZV9lbmQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBjaHVuayBlbmRzXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHR5cGUgb2YgdGhlIGNodW5rXCIsXG4gICAgICAgICAgICBlbnVtOiBbJ3RleHQnLCAnaW1hZ2UnLCAndGFibGUnLCAnY2hhcnQnLCAnZGlhZ3JhbScsICdjb2RlJywgJ290aGVyJ10sXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwYWdlX251bWJlcjoge1xuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgcGFnZSBudW1iZXIgb2YgdGhlIGRvY3VtZW50IHBhcnRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkb2N1bWVudCBwYXJ0LCBpZiBpdCdzIGFuIGltYWdlLCB0aGUgZXhoYXVzdGl2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1hZ2VcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGhlaWdodDoge1xuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVpZ2h0IG9mIHRoZSByZW5kaXRpb25cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSB3aWR0aCBvZiB0aGUgcmVuZGl0aW9uXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgfSxcbiAgICByZXF1aXJlZDogW1wicGFydF9udW1iZXJcIl0sXG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIFVzZXJJbnB1dFNpZ25hbCB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBhdXRoX3Rva2VuPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgU2VhcmNoUGF5bG9hZCB9IGZyb20gXCIuLi9wYXlsb2FkLmpzXCI7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFbWJlZGRpbmdUeXBlcyB9IGZyb20gXCIuLi9wcm9qZWN0LmpzXCI7XG5pbXBvcnQgeyBDb21wbGV4U2VhcmNoUXVlcnkgfSBmcm9tIFwiLi4vcXVlcnkuanNcIjtcbmltcG9ydCB7IEJhc2VPYmplY3QgfSBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCB7IFJlbmRpdGlvblByb3BlcnRpZXMgfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZW51bSBDb250ZW50T2JqZWN0U3RhdHVzIHtcbiAgICBjcmVhdGVkID0gXCJjcmVhdGVkXCIsXG4gICAgcHJvY2Vzc2luZyA9IFwicHJvY2Vzc2luZ1wiLCAvLyB0aGUgd2FzIGNyZWF0ZWQgYW5kIHN0aWxsIHByb2Nlc3NpbmdcbiAgICBjb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiLFxuICAgIGZhaWxlZCA9IFwiZmFpbGVkXCIsXG4gICAgYXJjaGl2ZWQgPSBcImFyY2hpdmVkXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nIHtcbiAgICBtb2RlbDogc3RyaW5nOyAvL3RoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgZW1iZWRkaW5nXG4gICAgdmFsdWVzOiBudW1iZXJbXTtcbiAgICBldGFnPzogc3RyaW5nOyAvLyB0aGUgZXRhZyBvZiB0aGUgdGV4dCB1c2VkIGZvciB0aGUgZW1iZWRkaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudE9iamVjdDxUID0gYW55PiBleHRlbmRzIENvbnRlbnRPYmplY3RJdGVtPFQ+IHtcbiAgICB0ZXh0Pzogc3RyaW5nOyAvLyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gICAgdGV4dF9ldGFnPzogc3RyaW5nO1xuICAgIGVtYmVkZGluZ3M6IFBhcnRpYWw8UmVjb3JkPFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzLCBFbWJlZGRpbmc+PjtcbiAgICBwYXJ0cz86IHN0cmluZ1tdOyAvLyB0aGUgbGlzdCBvZiBvYmplY3RJZCBvZiB0aGUgcGFydHMgb2YgdGhlIG9iamVjdFxuICAgIHBhcnRzX2V0YWc/OiBzdHJpbmc7IC8vIHRoZSBldGFnIG9mIHRoZSB0ZXh0IHVzZWQgZm9yIHRoZSBwYXJ0cyBsaXN0XG4gICAgdHJhbnNjcmlwdD86IFRyYW5zY3JpcHQ7XG59XG5cbmV4cG9ydCB0eXBlIENvbnRlbnROYXR1cmUgPSBcInZpZGVvXCIgfCBcImltYWdlXCIgfCBcImF1ZGlvXCIgfCBcImRvY3VtZW50XCIgfCBcImNvZGVcIiB8IFwib3RoZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEaW1lbnNpb25zIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uIHtcbiAgICBsYXRpdHVkZTogbnVtYmVyO1xuICAgIGxvbmdpdHVkZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRpb25SdW5NZXRhZGF0YSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgbW9kZWw6IHN0cmluZztcbiAgICB0YXJnZXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudE1ldGFkYXRhIHtcbiAgICAvLyBDb21tb24gZmllbGRzIGZvciBhbGwgbWVkaWEgdHlwZXNcbiAgICB0eXBlPzogQ29udGVudE5hdHVyZTtcbiAgICBzaXplPzogbnVtYmVyOyAvLyBpbiBieXRlc1xuICAgIGxhbmd1YWdlcz86IHN0cmluZ1tdO1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgZ2VuZXJhdGlvbl9ydW5zOiBHZW5lcmF0aW9uUnVuTWV0YWRhdGFbXTtcbiAgICBldGFnPzogc3RyaW5nO1xufVxuXG4vLyBFeGFtcGxlIG9mIHR5cGUtc3BlY2lmaWMgbWV0YWRhdGEgaW50ZXJmYWNlcyAob3B0aW9uYWwsIGZvciBiZXR0ZXIgdHlwZSBzYWZldHkpXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFsTWVkaWFNZXRhZGF0YSBleHRlbmRzIENvbnRlbnRNZXRhZGF0YSB7XG4gICAgZHVyYXRpb24/OiBudW1iZXI7IC8vIGluIHNlY29uZHNcbiAgICB0cmFuc2NyaXB0PzogVHJhbnNjcmlwdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZU1ldGFkYXRhIGV4dGVuZHMgQ29udGVudE1ldGFkYXRhIHtcbiAgICB0eXBlOiBcImltYWdlXCI7XG4gICAgZGltZW5zaW9ucz86IERpbWVuc2lvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9NZXRhZGF0YSBleHRlbmRzIFRlbXBvcmFsTWVkaWFNZXRhZGF0YSB7XG4gICAgdHlwZTogXCJhdWRpb1wiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvTWV0YWRhdGEgZXh0ZW5kcyBUZW1wb3JhbE1lZGlhTWV0YWRhdGEge1xuICAgIHR5cGU6IFwidmlkZW9cIjtcbiAgICBkaW1lbnNpb25zPzogRGltZW5zaW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudE1ldGFkYXRhIGV4dGVuZHMgQ29udGVudE1ldGFkYXRhIHtcbiAgICB0eXBlOiBcImRvY3VtZW50XCI7XG4gICAgcGFnZV9jb3VudD86IG51bWJlcjtcbiAgICBjb250ZW50X3Byb2Nlc3Nvcj86IHtcbiAgICAgICAgdHlwZT86IHN0cmluZztcbiAgICAgICAgZmVhdHVyZXNfcmVxdWVzdGVkPzogc3RyaW5nW107XG4gICAgICAgIHpvbmVzX3JlcXVlc3RlZD86IHN0cmluZ1tdO1xuICAgICAgICB0YWJsZV9jb3VudD86IG51bWJlcjtcbiAgICAgICAgaW1hZ2VfY291bnQ6IG51bWJlcjtcbiAgICAgICAgem9uZV9jb3VudDogbnVtYmVyO1xuICAgICAgICBuZWVkc19vY3JfY291bnQ/OiBudW1iZXI7XG4gICAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2NyaXB0IHtcbiAgICB0ZXh0Pzogc3RyaW5nO1xuICAgIHNlZ21lbnRzPzogVHJhbnNjcmlwdFNlZ21lbnRbXTtcbiAgICBldGFnPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHRTZWdtZW50IHtcbiAgICBzdGFydDogbnVtYmVyO1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBzcGVha2VyPzogbnVtYmVyO1xuICAgIGVuZD86IG51bWJlcjtcbiAgICBjb25maWRlbmNlPzogbnVtYmVyO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRTb3VyY2Uge1xuICAgIC8vIHRoZSBVUkkgb2YgdGhlIGNvbnRlbnQgc291cmNlLiBVc3VhbGx5IGFuIFVSTCB0byB0aGUgdXBsb2FkZWQgZmlsZSBpbnNpZGUgYSBjbG91ZCBmaWxlIHN0b3JhZ2UgbGlrZSBzMy5cbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgLy8gdGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCBzb3VyY2UuXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvLyB0aGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBpZiBhbnlcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8vIHRoZSBldGFnIG9mIHRoZSBjb250ZW50IHNvdXJjZSBpZiBhbnlcbiAgICBldGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV2aXNpb25JbmZvIHtcbiAgICAvKiogRGlyZWN0IHBhcmVudCByZXZpc2lvbiBpZCAob21pdCBvbiB0aGUgZmlyc3QgcmV2aXNpb24pICovXG4gICAgcGFyZW50Pzogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSByb290IHJldmlzaW9uIGlkIChvbWl0IG9uIHRoZSBmaXJzdCByZXZpc2lvbikgKi9cbiAgICByb290OiBzdHJpbmc7XG5cbiAgICAvKiogVHJ1ZSBpZiB0aGlzIHJldmlzaW9uIGlzIHRoZSBoZWFkIHJldmlzaW9uICovXG4gICAgaGVhZDogYm9vbGVhbjtcblxuICAgIC8qKiBIdW1hbuKAkWZyaWVuZGx5IHRhZyBvciBzdGF0ZSAoXCJ2MS4yXCIsIFwiYXBwcm92ZWRcIikgKi9cbiAgICBsYWJlbD86IHN0cmluZztcblxuICAgIC8qKiBFeHRyYSBwYXJlbnRzIHdoZW4gdHdvIGJyYW5jaGVzIGFyZSBtZXJnZWQgKGxlYXZlIHVuZGVmaW5lZCB1bnRpbCBuZWVkZWQpICovXG4gICAgLy9tZXJnZV9wYXJlbnRzPzogc3RyaW5nW107IC8vbWF5YmUgbGF0ZXJcblxuICAgIC8qKiBQb2ludGVyIHRvIGEgZGlmZiAvIHBhdGNoIGJsb2IgaWYgeW91IHN0b3JlIGRlbHRhcyBpbnN0ZWFkIG9mIGZ1bGwgY29udGVudCAqL1xuICAgIC8vZGVsdGFfcmVmPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBjb250ZW50IG9iamVjdCBpdGVtIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBDb250ZW50T2JqZWN0IHRoYXQgaXMgcmV0dXJuZWQgYnkgdGhlIHN0b3JlIEFQSSB3aGVuIGxpc3Rpbmcgb2JqZWN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50T2JqZWN0SXRlbTxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4gZXh0ZW5kcyBCYXNlT2JqZWN0IHtcbiAgICBwYXJlbnQ6IHN0cmluZzsgLy8gdGhlIGlkIG9mIHRoZSBkaXJlY3QgcGFyZW50IG9iamVjdC4gVGhlIHJvb3Qgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGUgcGFyZW50IGZpZWxkIHNldC5cblxuICAgIC8qKiBBbiBvcHRpb25hbCBwYXRoIGJhc2VkIGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0ICovXG4gICAgbG9jYXRpb246IHN0cmluZzsgLy8gdGhlIHBhdGggb2YgdGhlIHBhcmVudCBvYmplY3RcblxuICAgIC8qKlxuICAgICAqIE9iamVjdCBzdGF0dXMuXG4gICAgICogLSBjcmVhdGVkOiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGFuZCBpcyBiZWluZyBwcm9jZXNzZWRcbiAgICAgKiAtIHByb2Nlc3Npbmc6IHRoZSBvYmplY3QgaXMgYmVpbmcgcHJvY2Vzc2VkXG4gICAgICogLSBjb21wbGV0ZWQ6IHRoZSBvYmplY3Qgd2FzIHByb2Nlc3NlZCBhbmQgaXMgcmVhZHkgdG8gdXNlXG4gICAgICogLSBmYWlsZWQ6IHRoZSBvYmplY3QgcHJvY2Vzc2luZyBmYWlsZWRcbiAgICAgKiAtIGFyY2hpdmVkOiB0aGUgb2JqZWN0IHdhcyBhcmNoaXZlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHN0YXR1czogQ29udGVudE9iamVjdFN0YXR1cztcblxuICAgIC8qKlxuICAgICAqIE9iamVjdCB0eXBlIGlkLlxuICAgICAqL1xuICAgIHR5cGU/OiBDb250ZW50T2JqZWN0VHlwZVJlZjtcblxuICAgIC8qKlxuICAgICAqIENvbnRlbnQgc291cmNlIGluZm9ybWF0aW9uLCB0eXBpY2FsbHkgYSBsaW5rIHRvIGFuIG9iamVjdCBzdG9yZVxuICAgICAqL1xuICAgIGNvbnRlbnQ6IENvbnRlbnRTb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBFeHRlcm5hbCBpZGVudGlmaWVyIGZvciBpbnRlZ3JhdGlvbiB3aXRoIG90aGVyIHN5c3RlbXNcbiAgICAgKi9cbiAgICBleHRlcm5hbF9pZD86IHN0cmluZztcblxuICAgIC8qKiBUaGUgb2JqZWN0IHByb3BlcnRpZXMuIFRoaXMgaXMgYSBKU09OIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUgb2JqZWN0LCBtYXRjaGluZyB0aGUgb2JqZWN0IHR5cGUgc2NoZW1hICovXG4gICAgcHJvcGVydGllczogVDsgLy8gYSBKU09OIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUgb2JqZWN0XG5cbiAgICAvKiogVGVjaG5pY2FsIG1ldGFkYXRhIG9mIHRoZSBvYmplY3QgKi9cbiAgICBtZXRhZGF0YT86IFZpZGVvTWV0YWRhdGEgfCBBdWRpb01ldGFkYXRhIHwgSW1hZ2VNZXRhZGF0YSB8IERvY3VtZW50TWV0YWRhdGEgfCBDb250ZW50TWV0YWRhdGE7XG5cbiAgICAvKiogVG9rZW4gaW5mb3JtYXRpb24gICovXG4gICAgdG9rZW5zPzoge1xuICAgICAgICBjb3VudDogbnVtYmVyOyAvLyB0aGUgbnVtYmVyIG9mIHRva2VucyBpbiB0aGUgdGV4dFxuICAgICAgICBlbmNvZGluZzogc3RyaW5nOyAvLyB0aGUgZW5jb2RpbmcgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHRva2Vuc1xuICAgICAgICBldGFnOiBzdHJpbmc7IC8vdGhlIGV0YWcgb2YgdGhlIHRleHQgdXNlZCBmb3IgdGhlIHRva2VuIGNvdW50XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldmlzaW9uIGluZm9ybWF0aW9uLiBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgdGhlIGhpc3Rvcnkgb2YgdGhlIG9iamVjdC5cbiAgICAgKi9cbiAgICByZXZpc2lvbjogUmV2aXNpb25JbmZvOyAvLyB0aGUgcmV2aXNpb24gaW5mbyBvZiB0aGUgb2JqZWN0XG5cbiAgICAvKipcbiAgICAgKiBTb2Z0IGRlbGV0ZSBmbGFnLiBXaGVuIHRydWUsIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVsZXRlZFxuICAgICAqIGJ1dCBpcyBzdGlsbCByZXRhaW5lZCBpbiB0aGUgZGF0YWJhc2UgZm9yIGhpc3RvcmljYWwgcHVycG9zZXMuXG4gICAgICovXG4gICAgaXNfZGVsZXRlZD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTb2Z0IGxvY2sgZmxhZy4gV2hlbiB0cnVlLCB0aGUgb2JqZWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIHJlYWQtb25seVxuICAgICAqIGFuZCBtb2RpZmljYXRpb24gYXR0ZW1wdHMgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqL1xuICAgIGlzX2xvY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogV2hlbiBjcmVhdGluZyBmcm9tIGFuIHVwbG9hZGVkIGZpbGUgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIGFuIFVSTCB0byB0aGUgdXBsb2FkZWQgZmlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNvbnRlbnRPYmplY3RQYXlsb2FkPFQgPSBhbnk+XG4gICAgZXh0ZW5kcyBQYXJ0aWFsPE9taXQ8Q29udGVudE9iamVjdDxUPiwgXCJpZFwiIHwgXCJyb290XCIgfCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJ0eXBlXCIgfCBcIm93bmVyXCI+PiB7XG4gICAgaWQ/OiBzdHJpbmc7IC8vIEFuIG9wdGlvbmFsIGV4aXN0aW5nIG9iamVjdCBJRCB0byBiZSByZXBsYWNlZCBieSB0aGUgbmV3IG9uZVxuICAgIHR5cGU/OiBzdHJpbmc7IC8vIHRoZSBvYmplY3QgdHlwZSBJRFxuICAgIGdlbmVyYXRpb25fcnVuX2luZm8/OiBHZW5lcmF0aW9uUnVuTWV0YWRhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudE9iamVjdFR5cGVSZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhTZWFyY2hQYXlsb2FkIGV4dGVuZHMgT21pdDxTZWFyY2hQYXlsb2FkLCBcInF1ZXJ5XCI+IHtcbiAgICBxdWVyeT86IENvbXBsZXhTZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5MYXlvdXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXRoIG9mIHRoZSBmaWVsZCB0byB1c2UgKGUuZy4gXCJwcm9wZXJ0aWVzLnRpdGxlXCIpXG4gICAgICovXG4gICAgZmllbGQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSB0byBkaXNwbGF5IGluIHRoZSB0YWJsZSBjb2x1bW5cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGZpZWxkIHNwZWNpZmllcyBob3cgdGhlIHJlbmRlcmluZyB3aWxsIGJlIGRvbmUuIElmIG5vdCBzcGVjaWZpZWQgdGhlIHN0cmluZyB0eXBlIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBUaGUgdHlwZSBtYXkgY29udGFpbiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgcHJlcGVuZGVkIHVzaW5nIGEgd2ViLWxpa2UgcXVlcnkgc3RyaW5nIHN5bnRheDogZGF0ZT9MTExcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qXG4gICAgICogYSBmYWxsYmFjayBmaWVsZCB0byB1c2UgaWYgdGhlIGZpZWxkIGlzIG5vdCBwcmVzZW50IGluIHRoZSBvYmplY3RcbiAgICAgKi9cbiAgICBmYWxsYmFjaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCBpZiB0aGUgZmllbGQgaXMgbm90IHByZXNlbnQgaW4gdGhlIG9iamVjdFxuICAgICAqL1xuICAgIGRlZmF1bHQ/OiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRPYmplY3RUeXBlIGV4dGVuZHMgQ29udGVudE9iamVjdFR5cGVJdGVtIHsgfVxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50T2JqZWN0VHlwZUl0ZW0gZXh0ZW5kcyBCYXNlT2JqZWN0IHtcbiAgICBpc19jaHVua2FibGU/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBpbmNsdWRlZCBpbiBDb250ZW50T2JqZWN0VHlwZUl0ZW0gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWRcbiAgICAgKiBJdCBpcyBhbHdheXMgaW5jbHVkZWQgaW4gQ29udGVudE9iamVjdFR5cGVcbiAgICAgKi9cbiAgICB0YWJsZV9sYXlvdXQ/OiBDb2x1bW5MYXlvdXRbXTtcbiAgICAvKipcbiAgICAgKiB0aGlzIGlzIG9ubHkgaW5jbHVkZWQgaW4gQ29udGVudE9iamVjdFR5cGVJdGVtIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkXG4gICAgICogSXQgaXMgYWx3YXlzIGluY2x1ZGVkIGluIENvbnRlbnRPYmplY3RUeXBlXG4gICAgICovXG4gICAgb2JqZWN0X3NjaGVtYT86IFJlY29yZDxzdHJpbmcsIGFueT47IC8vIGFuIG9wdGlvbmFsIEpTT04gc2NoZW1hIGZvciB0aGUgb2JqZWN0IHByb3BlcnRpZXMuXG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb250ZW50IHdpbGwgYmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlIG9iamVjdCBzY2hlbWEgYSBnZW5lcmF0aW9uIHRpbWUgYW5kIHNhdmUvdXBkYXRlIHRpbWUuXG4gICAgICovXG4gICAgc3RyaWN0X21vZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNvbnRlbnRPYmplY3RUeXBlUGF5bG9hZFxuICAgIGV4dGVuZHMgT21pdDxDb250ZW50T2JqZWN0VHlwZSwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBcInVwZGF0ZWRfYXRcIiB8IFwiY3JlYXRlZF9ieVwiIHwgXCJ1cGRhdGVkX2J5XCI+IHsgfVxuXG5leHBvcnQgZW51bSBXb3JrZmxvd1J1bGVJbnB1dFR5cGUge1xuICAgIHNpbmdsZSA9IFwic2luZ2xlXCIsXG4gICAgbXVsdGlwbGUgPSBcIm11bHRpcGxlXCIsXG4gICAgbm9uZSA9IFwibm9uZVwiLFxufVxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1J1bGVJdGVtIGV4dGVuZHMgQmFzZU9iamVjdCB7XG4gICAgLy8gdGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93IGZ1bmN0aW9uXG4gICAgZW5kcG9pbnQ6IHN0cmluZztcbiAgICBpbnB1dF90eXBlOiBXb3JrZmxvd1J1bGVJbnB1dFR5cGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UnVsZSBleHRlbmRzIFdvcmtmbG93UnVsZUl0ZW0ge1xuICAgIC8qXG4gICAgICogbW9uZ28gbWF0Y2hpbmcgcnVsZXMgZm9yIGEgY29udGVudCBldmVudFxuICAgICAqL1xuICAgIG1hdGNoPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0aWVzIGNvbmZpZ3VyYXRpb24gaWYgYW55LlxuICAgICAqL1xuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBEZWJ1ZyBtb2RlIGZvciB0aGUgcnVsZVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgZGVidWc/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tZXIgb3ZlcnJpZGUgZm9yIHRoZSBydWxlXG4gICAgICogV2hlbiBzZXQgdG8gdHJ1ZSB0aGUgcnVsZSB3aWxsIG5vdCBiZSB1cGRhdGVkIGJ5IHRoZSBzeXN0ZW1cbiAgICAgKi9cbiAgICBjdXN0b21lcl9vdmVycmlkZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV29ya2Zsb3dSdWxlUGF5bG9hZCBleHRlbmRzIFVwbG9hZFdvcmtmbG93UnVsZVBheWxvYWQge1xuICAgIG5hbWU6IHN0cmluZzsgLy8gcmVxdWlyZWRcbiAgICBlbmRwb2ludDogc3RyaW5nOyAvLyByZXF1aXJlZFxufVxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRXb3JrZmxvd1J1bGVQYXlsb2FkXG4gICAgZXh0ZW5kcyBQYXJ0aWFsPE9taXQ8V29ya2Zsb3dSdWxlLCBcImlkXCIgfCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJvd25lclwiPj4geyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVuZGl0aW9uUmVzcG9uc2Uge1xuICAgIHN0YXR1czogXCJmb3VuZFwiIHwgXCJnZW5lcmF0aW5nXCIgfCBcImZhaWxlZFwiO1xuICAgIHJlbmRpdGlvbj86IENvbnRlbnRPYmplY3Q8UmVuZGl0aW9uUHJvcGVydGllcz47IC8vVE9ETyBhZGQgPFJlbmRpdGlvbj5cbiAgICB3b3JrZmxvd19ydW5faWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VXBsb2FkVXJsUGF5bG9hZCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG1pbWVfdHlwZT86IHN0cmluZztcbiAgICB0dGw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZVVybFBheWxvYWQge1xuICAgIGZpbGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRGaWxlVXJsUmVzcG9uc2Uge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWltZV90eXBlOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xufVxuIiwiLyoqXG4gKiBDb3BpZWQgZnJvbSB0ZW1wb3JhbGlvXG4gKiBUaGUgdGVtcG9yYWxpbyBQYXJlbnRDbG9zZVBvbGljeVxuICovXG5leHBvcnQgdHlwZSBQYXJlbnRDbG9zZVBvbGljeVR5cGUgPSBcIlRFUk1JTkFURVwiIHwgXCJBQkFORE9OXCIgfCBcIlJFUVVFU1RfQ0FOQ0VMXCIgfCB1bmRlZmluZWQ7XG5pbnRlcmZhY2UgUGFyZW50Q2xvc2VQb2xpY3lJIHtcbiAgICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCIsXG4gICAgQUJBTkRPTjogXCJBQkFORE9OXCIsXG4gICAgUkVRVUVTVF9DQU5DRUw6IFwiUkVRVUVTVF9DQU5DRUxcIixcbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG4gICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU6IFwiVEVSTUlOQVRFXCIsXG4gICAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiBcIkFCQU5ET05cIixcbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiBcIlJFUVVFU1RfQ0FOQ0VMXCJcbn1cbmV4cG9ydCBjb25zdCBQYXJlbnRDbG9zZVBvbGljeSA9IHtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0XG4gICAgICovXG4gICAgVEVSTUlOQVRFOiBcIlRFUk1JTkFURVwiLFxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAgICovXG4gICAgQUJBTkRPTjogXCJBQkFORE9OXCIsXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICAgKi9cbiAgICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiLFxuICAgIC8qKlxuICAgICAqIElmIGEgYFBhcmVudENsb3NlUG9saWN5YCBpcyBzZXQgdG8gdGhpcywgb3IgaXMgbm90IHNldCBhdCBhbGwsIHRoZSBzZXJ2ZXIgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHNldCBhbiBleHBsaWNpdCBwb2xpY3kgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIFRlcm1pbmF0ZWQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURX0gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURTogXCJURVJNSU5BVEVcIixcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCBub3RoaW5nIGlzIGRvbmUgdG8gdGhlIENoaWxkLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTjogXCJBQkFORE9OXCIsXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAgICovXG4gICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiXG59IGFzIFBhcmVudENsb3NlUG9saWN5STtcbiIsImV4cG9ydCBlbnVtIENvbnRlbnRFdmVudE5hbWUge1xuICAgIGNyZWF0ZSA9IFwiY3JlYXRlXCIsXG4gICAgY2hhbmdlX3R5cGUgPSBcImNoYW5nZV90eXBlXCIsXG4gICAgdXBkYXRlID0gXCJ1cGRhdGVcIixcbiAgICByZXZpc2lvbl9jcmVhdGVkID0gXCJyZXZpc2lvbl9jcmVhdGVkXCIsXG4gICAgZGVsZXRlID0gXCJkZWxldGVcIixcbiAgICB3b3JrZmxvd19maW5pc2hlZCA9IFwid29ya2Zsb3dfZmluaXNoZWRcIixcbiAgICB3b3JrZmxvd19leGVjdXRpb25fcmVxdWVzdCA9IFwid29ya2Zsb3dfZXhlY3V0aW9uX3JlcXVlc3RcIixcbiAgICBhcGlfcmVxdWVzdCA9IFwiYXBpX3JlcXVlc3RcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGlvbkJhc2VQYXJhbXM8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVmIG9mIHRoZSB1c2VyIHdobyBpbml0aWF0ZWQgdGhlIHdvcmtmbG93LlxuICAgICAqL1xuICAgIGluaXRpYXRlZF9ieT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBhY3Rpdml0eS5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBzZWxlY3QgdGhlIHJpZ2h0IGRhdGFiYXNlIHRvIHdvcmsgb24uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByb2plY3QgSUQgb2YgdGhlIGFjY291bnQgd2hvIGNyZWF0ZWQgdGhlIGFjdGl2aXR5LlxuICAgICAqL1xuICAgIHByb2plY3RfaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YXJzIGZpZWxkIGlzIG1haW5seSB1c2VkIHRvIHBhc3MgdGhlIHVzZXIgaW5wdXQgdG8gdGhlIHdvcmtmbG93LlxuICAgICAqIFRoZSB1c2VyIGlucHV0IGFyIGN1c3RvbSB1c2VyIG9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHdvcmtmbG93LlxuICAgICAqIFlvdSBjYW4gc2VlIHRoZSB1c2VyIGlucHV0IGFzIHRoZSBhcmd1bWVudHMgZm9yIGEgY29tbWFuZCBsaW5lIGFwcC5cbiAgICAgKlxuICAgICAqIEluIHRoZSBjYXNlIG9mIHdvcmtmbG93cyBzdGFydGVkIGJ5IGV2ZW50cyAoZS5nLiB1c2luZyBhIGEgd29ya2Zsb3cgcnVsZSkgdGhlIHVzZXIgaW5wdXQgdmFycyB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIHdvcmtmbG93IHJ1bGUgY29uZmlndXJhdGlvbiBmaWVsZC5cbiAgICAgKlxuICAgICAqIEluIGNhc2Ugb2YgZHNsIHdvcmtmbG93cyB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHBheWxvYWQgdmFycyB3aWxsIGJlIGFwcGxpZWQgb3ZlciB0aGUgZGVmYXVsdCB2YXJzIHZhbHVlcyBzdG9yZWQgaW4gdGhlIERTTCB2YXJzIGZpZWxkLlxuICAgICAqL1xuICAgIHZhcnM6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBBdXRoIFRva2VuIHRvIGFjY2VzcyBaZW5vIGFuZCBDb21wb3NhYmxlIGZyb20gdGhlIHdvcmtlcnNcbiAgICAgKi9cbiAgICBhdXRoX3Rva2VuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAgICovXG4gICAgY29uZmlnPzoge1xuICAgICAgICBzdHVkaW9fdXJsOiBzdHJpbmc7XG4gICAgICAgIHN0b3JlX3VybDogc3RyaW5nO1xuICAgICAgICBzbGFja19hcHBfdXJsPzogc3RyaW5nO1xuICAgICAgICBlbmFibGVkX2ludGVncmF0aW9ucz86IHN0cmluZ1tdOyAvL2xpc3Qgb2YgZW5hYmxlZCBpbnRlZ3JhdGlvbnNcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgZW5kcG9pbnRzIHRvIG5vdGlmeSB3aGVuIHRoZSB3b3JrZmxvdyBmaW5pc2hlcy5cbiAgICAgKiBJdCBpcyBoYW5kbGVkIGJ5IGEgc3ViLXdvcmtmbG93IGV4ZWN1dGlvbiwgc28gdGhlIG1haW4gd29ya2Zsb3cgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBzZW50LlxuICAgICAqL1xuICAgIG5vdGlmeV9lbmRwb2ludHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKiBJZiB0aGlzIGlzIGEgY2hpbGQgd29ya2Zsb3csIHBhcmVudCBjb250YWlucyBwYXJlbnQncyBpZHMgICovXG4gICAgcGFyZW50Pzoge1xuICAgICAgICBydW5faWQ6IHN0cmluZztcbiAgICAgICAgd29ya2Zsb3dfaWQ6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZDxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4gZXh0ZW5kcyBXb3JrZmxvd0V4ZWN1dGlvbkJhc2VQYXJhbXM8VD4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB3aGljaCBzdGFydGVkIHRoZSB3b3JrZmxvdyB3aG8gY3JlYXRlZCB0aGUgYWN0aXZpdHkuXG4gICAgICovXG4gICAgZXZlbnQ6IENvbnRlbnRFdmVudE5hbWU7XG5cbiAgICAvKlxuICAgICAqIFRoZSBXb3JrZmxvdyBSdWxlIElEIGlmIGFueS4gSWYgdGhlIHdvcmtmbG93IHdhcyBzdGFydGVkIGJ5IGEgcnVsZSB0aGlzIGZpZWxkIHdpbGwgY29udGFpbiB0aGUgcnVsZSBJRFxuICAgICAqIG90aGVyd2lzZSBpZiB0aGUgd29ya2Zsb3cgd2FzIHN0YXJ0ZWQgb24gZGVtYW5kIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICB3Zl9ydWxlX25hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRhcmdldCBvYmplY3RzIHByb2Nlc3NlZCBieSB0aGUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgb2JqZWN0SWRzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEF1dGggVG9rZW4gdG8gYWNjZXNzIFplbm8gYW5kIENvbXBvc2FibGUgZnJvbSB0aGUgd29ya2Vyc1xuICAgICAqL1xuICAgIGF1dGhfdG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERvY3VtZW50SWRzKHBheWxvYWQ6IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoXCJvYmplY3RJZHNcIiBpbiBwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiBwYXlsb2FkLm9iamVjdElkcztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVXb3JrZmxvd1BheWxvYWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXNrIHF1ZXVlIHRvIGFzc2lnbiB0aGUgd29ya2Zsb3cgdG8uIERlcHJlY2F0ZWQsIHF1ZXVlcyBhcmUgY2hvb3NlbmQgc2VydmVyIHNpZGVcbiAgICAgKi9cbiAgICAvL0BkZXByZWNhdGVkXG4gICAgdGFza19xdWV1ZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERvY3V1bWVudCBJRHMgcG9uIHdoaWNoIHRoZSB3b3JrZmxvdyB3aWxsIGJlIGV4ZWN1dGVkLCBkZXByZWNhdGVkLCByZXBsYWNlZCBwYXJhbXMgaW4gdmFyc1xuICAgICAqL1xuICAgIC8vQGRlcHJlY2F0ZWRcbiAgICBvYmplY3RJZHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3dcbiAgICAgKi9cbiAgICB2YXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqIE1ha2UgdGhlIHdvcmtmbG93IElEIHVuaXF1ZSBieSBhbHdheXMgYWRkaW5nIGEgcmFuZG9tIHRva2VuIHRvIHRoZSBJRC5cbiAgICAgKi9cbiAgICB1bmlxdWU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQSBjdXN0b20gSUQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGlkIGluc3RlYWQgb2YgdGhlIGdlbmVyYXRlZCBvbmUuXG4gICAgICovXG4gICAgY3VzdG9tX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGltZW91dCBmb3IgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiB0byBjb21wbGV0ZSwgaW4gc2Vjb25kcy5cbiAgICAgKi9cbiAgICB0aW1lb3V0PzogbnVtYmVyOyAvL3RpbWVvdXQgaW4gc2Vjb25kc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RXb3JrZmxvd1J1bnNQYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9jdW1lbnQgSUQgcGFzc2VkIHRvIGEgd29ya2Zsb3cgcnVuLlxuICAgICAqL1xuXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgZXZlbnRfbmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB3b3JrZmxvdyBydWxlIElEIHRoYXQgdHJpZ2dlcmVkIHRoZSB3b3JrZmxvdy5cbiAgICAgKi9cbiAgICBydWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IHRpbWUgZm9yIGZpbHRlcmluZyB3b3JrZmxvdyBydW5zLlxuICAgICAqL1xuICAgIHN0YXJ0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVuZCB0aW1lIGZvciBmaWx0ZXJpbmcgd29ya2Zsb3cgcnVucy5cbiAgICAgKi9cbiAgICBlbmQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogc2VhcmNoIHRlcm0gdG8gZmlsdGVyIG9uIHdvcmtmbG93IGlkIGFuZCBydW4gaWRcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIG9yIHNlcnZpY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgd29ya2Zsb3cgcnVuLlxuICAgICAqL1xuICAgIGluaXRpYXRlZF9ieT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEx1Y2VuZSBxdWVyeSBzdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgd29ya2Zsb3cgcnVucy5cbiAgICAgKiBUaGlzIGlzIGEgZnVsbCB0ZXh0IHNlYXJjaCBvbiB0aGUgd29ya2Zsb3cgcnVuIGhpc3RvcnkuXG4gICAgICovXG4gICAgcXVlcnk/OiBzdHJpbmc7XG5cbiAgICB0eXBlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV29ya2Zsb3dSdW5FdmVudCB7XG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICBldmVudF90aW1lOiBudW1iZXI7XG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIHRhc2tfaWQ6IHN0cmluZztcbiAgICBhdHRlbXB0OiBudW1iZXI7XG5cbiAgICBhY3Rpdml0eT86IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBpbnB1dD86IGFueTtcbiAgICB9O1xuXG4gICAgZXJyb3I/OiB7XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgc291cmNlOiBzdHJpbmc7XG4gICAgICAgIHN0YWNrdHJhY2U6IHN0cmluZztcbiAgICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9O1xuXG4gICAgcmVzdWx0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UnVuIHtcbiAgICBzdGF0dXM/OiBXb3JrZmxvd0V4ZWN1dGlvblN0YXR1cyB8IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIHN0YXJ0ZWRfYXQ/OiBudW1iZXI7XG4gICAgY2xvc2VkX2F0PzogbnVtYmVyO1xuICAgIGV4ZWN1dGlvbl9kdXJhdGlvbj86IG51bWJlcjtcbiAgICBydW5faWQ/OiBzdHJpbmc7XG4gICAgd29ya2Zsb3dfaWQ/OiBzdHJpbmc7XG4gICAgaW5pdGlhdGVkX2J5Pzogc3RyaW5nO1xuICAgIHJlc3VsdD86IGFueTtcbiAgICByYXc/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dSdW5XaXRoRGV0YWlscyBleHRlbmRzIFdvcmtmbG93UnVuIHtcbiAgICBoaXN0b3J5PzogV29ya2Zsb3dSdW5FdmVudFtdO1xuICAgIG1lbW8/OiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9IHwgbnVsbDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFdvcmtmbG93UnVuc1Jlc3BvbnNlIHtcbiAgICBydW5zOiBXb3JrZmxvd1J1bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRzSW50ZXJhY3Rpb25QYXJhbXMgZXh0ZW5kcyBPbWl0PFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCwgXCJjb25maWdcIj4ge1xuICAgIGNvbmZpZzoge1xuICAgICAgICBpbnRlcmFjdGlvbk5hbWU6IHN0cmluZztcbiAgICAgICAgYWN0aW9uOiBEb2N1bWVudEFjdGlvbkNvbmZpZztcbiAgICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QWN0aW9uQ29uZmlnIHtcbiAgICBjb250ZW50VHlwZU5hbWU/OiBzdHJpbmc7IC8vY29udGVudCB0eXBlIHRvIHVzZVxuICAgIHNldEFzUHJvcGVydGllczogYm9vbGVhbjsgLy9zZXQgcmVzdWx0IGFzIHByb3BlcnRpZXNcbiAgICBzZXRBc1RleHQ6IHN0cmluZzsgLy9zZXQgcmVzdWx0IGFzIHRleHQsIGlmIHJlc3VsdCBzZXQgdGhlIHdob2xlIHJlc3VsdCBhcyB0ZXh0XG4gICAgc2V0TmFtZUZyb206IHN0cmluZzsgLy9yZXN1bHQgcHJvcGVydHkgdG8gdXNlIGFzIG5hbWVcbiAgICB1cHNlcnQ6IGJvb2xlYW47IC8vd2V0aGVyIHRvIHVwc2VydCBvciB1cGRhdGUgb25seVxuICAgIGRvY3VtZW50SWQ/OiBzdHJpbmc7IC8vZG9jIElkIHRvIHVwZGF0ZVxuICAgIHBhcmVudElkPzogc3RyaW5nOyAvL3BhcmVudElkIGZvciB0aGUgY3JlYXRlZCBkb2Ncbn1cblxuZXhwb3J0IGVudW0gV29ya2Zsb3dFeGVjdXRpb25TdGF0dXMge1xuICAgIFVOS05PV04gPSAwLFxuICAgIFJVTk5JTkcgPSAxLFxuICAgIENPTVBMRVRFRCA9IDIsXG4gICAgRkFJTEVEID0gMyxcbiAgICBDQU5DRUxFRCA9IDQsXG4gICAgVEVSTUlOQVRFRCA9IDUsXG4gICAgQ09OVElOVUVEX0FTX05FVyA9IDYsXG4gICAgVElNRURfT1VUID0gNyxcbn1cblxuLyoqXG4gKiBCYXNpYyByZXNwb25zZSBmb3IgYW55dGhpbmcgcnVuIHdpdGggYW4gYXN5bmMgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1J1blN0YXR1cyB7XG4gICAgd29ya2Zsb3dfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgd29ya2Zsb3dfcnVuX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIHN0YXR1czogV29ya2Zsb3dFeGVjdXRpb25TdGF0dXM7XG59XG5cbi8qKlxuICogV29ya2Zsb3cgVXBkYXRlIE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudE1lc3NhZ2Uge1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgIHdvcmtmbG93X3J1bl9pZDogc3RyaW5nO1xuICAgIHR5cGU6IEFnZW50TWVzc2FnZVR5cGU7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRldGFpbHM/OiBhbnk7XG4gICAgd29ya3N0cmVhbV9pZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQWdlbnRNZXNzYWdlVHlwZSB7XG4gICAgU1lTVEVNID0gXCJzeXN0ZW1cIixcbiAgICBUSE9VR0hUID0gXCJ0aG91Z2h0XCIsXG4gICAgUExBTiA9IFwicGxhblwiLFxuICAgIFVQREFURSA9IFwidXBkYXRlXCIsXG4gICAgQ09NUExFVEUgPSBcImNvbXBsZXRlXCIsXG4gICAgV0FSTklORyA9IFwid2FybmluZ1wiLFxuICAgIEVSUk9SID0gXCJlcnJvclwiLFxuICAgIEFOU1dFUiA9IFwiYW5zd2VyXCIsXG4gICAgUVVFU1RJT04gPSBcInF1ZXN0aW9uXCIsXG4gICAgUkVRVUVTVF9JTlBVVCA9IFwicmVxdWVzdF9pbnB1dFwiLFxuICAgIElETEUgPSBcImlkbGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFuVGFzayB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBnb2FsOiBzdHJpbmc7XG4gICAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmdbXTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIHN0YXR1cz86IFwicGVuZGluZ1wiIHwgXCJpbl9wcm9ncmVzc1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwic2tpcHBlZFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYW4ge1xuICAgIHBsYW46IFBsYW5UYXNrW107XG4gICAgY29tbWVudD86IHN0cmluZztcbn1cbiIsIi8qKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBvbmx5IG9uIHRoZSBjbGllbnQgc2lkZSBhbmQgaXMgc2hhcmVkIGJldHdlZW4gQHZlcnRlc2lhL3VpL3Nlc3Npb24gYW5kIHRoZSBtYWluIGFwcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVSVJlc29sdmVkVGVuYW50IHtcbiAgICBmaXJlYmFzZVRlbmFudElkOiBzdHJpbmc7XG4gICAgbGFiZWw/OiBzdHJpbmc7XG4gICAgbG9nbz86IHN0cmluZztcbiAgICBwcm92aWRlcj86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBUcmFpbmluZ0pvYiB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB7IEV4ZWN1dGlvbkVudmlyb25tZW50UmVmIH0gZnJvbSBcIi4vZW52aXJvbm1lbnQuanNcIjtcblxuZXhwb3J0IGVudW0gVHJhaW5pbmdTZXNzaW9uU3RhdHVzIHtcbiAgICAnY3JlYXRlZCcgPSAnY3JlYXRlZCcsXG4gICAgJ2J1aWxkaW5nJyA9ICdidWlsZGluZycsXG4gICAgJ3ByZXBhcmVkJyA9ICdwcmVwYXJlZCcsXG4gICAgJ3Byb2Nlc3NpbmcnID0gJ3Byb2Nlc3NpbmcnLFxuICAgICdjb21wbGV0ZWQnID0gJ2NvbXBsZXRlZCcsXG4gICAgJ2NhbmNlbGxlZCcgPSAnY2FuY2VsbGVkJyxcbiAgICAnZmFpbGVkJyA9ICdmYWlsZWQnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaW5pbmdTZXNzaW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHByb2plY3Q6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBlbnY6IEV4ZWN1dGlvbkVudmlyb25tZW50UmVmLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBUcmFpbmluZ1Nlc3Npb25TdGF0dXMsXG4gICAgcnVuczogc3RyaW5nW10sXG4gICAgZGF0YXNldDogc3RyaW5nLCAvL3RoZSBuYW1lIG9mIHRoZSBmaWxlIGRhdGFzZXQgd2hpY2ggd2FzIGdlbmVyYXRlZCBpbiBHQ1NcbiAgICBqb2I6IFRyYWluaW5nSm9iLFxuICAgIGNyZWF0ZWRfYnk6IHN0cmluZyxcbiAgICB1cGRhdGVkX2J5OiBzdHJpbmcsXG4gICAgY3JlYXRlZF9hdDogRGF0ZSxcbiAgICB1cGRhdGVkX2F0OiBEYXRlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nU2Vzc2lvblJlZiBleHRlbmRzIE9taXQ8VHJhaW5pbmdTZXNzaW9uLCAncnVucyc+IHtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nU2Vzc2lvbkNyZWF0ZVBheWxvYWQge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGVudjogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFRyYWluaW5nU2Vzc2lvbnNRdWVyeSB7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIHN0YXR1cz86IFRyYWluaW5nU2Vzc2lvblN0YXR1cztcbn0iLCJpbXBvcnQgeyBQcm9qZWN0Um9sZXMgfSBmcm9tIFwiLi9wcm9qZWN0LmpzXCI7XG5pbXBvcnQgeyBBY2NvdW50UmVmIH0gZnJvbSBcIi4vdXNlci5qc1wiO1xuXG5cbmV4cG9ydCBlbnVtIFRyYW5zaWVudFRva2VuVHlwZSB7XG4gICAgdXNlckludml0ZSA9ICd1c2VyLWludml0ZScsXG4gICAgbWlncmF0aW9uID0gJ21pZ3JhdGlvbicsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpZW50VG9rZW48VD4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogVHJhbnNpZW50VG9rZW5UeXBlO1xuICAgIGRhdGE6IFQ7XG4gICAgZXhwaXJlczogRGF0ZTtcbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9yVXBkYXRlVHJhbnNpZW50VG9rZW5QYXlsb2FkPFQ+IGV4dGVuZHMgUGFydGlhbDxUcmFuc2llbnRUb2tlbjxUPj4ge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJbnZpdGVUb2tlbkRhdGEge1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcm9sZTogUHJvamVjdFJvbGVzO1xuICAgIGFjY291bnQ6IEFjY291bnRSZWY7XG4gICAgcHJvamVjdHM/OiBzdHJpbmdbXTtcbiAgICBpbnZpdGVkQnk6IHsgbmFtZTogc3RyaW5nLCBlbWFpbDogc3RyaW5nOyB9O1xufSIsImltcG9ydCB7IEFwaUtleSB9IGZyb20gXCIuL2FwaWtleS5qc1wiO1xuaW1wb3J0IHsgUHJvamVjdFJvbGVzIH0gZnJvbSBcIi4vcHJvamVjdC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJXaXRoQWNjb3VudHMgZXh0ZW5kcyBVc2VyIHtcbiAgICBhY2NvdW50czogQWNjb3VudFJlZltdO1xufVxuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwaWN0dXJlPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIHBob25lPzogc3RyaW5nO1xuICAgIHNpZ25faW5fcHJvdmlkZXI/OiBzdHJpbmc7XG4gICAgbGFzdF9zZWxlY3RlZF9hY2NvdW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJSZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcGljdHVyZT86IHN0cmluZztcbn1cbmV4cG9ydCBjb25zdCBVc2VyUmVmUG9wdWxhdGUgPSBcImlkIG5hbWUgZW1haWwgcGljdHVyZVwiO1xuXG5leHBvcnQgZW51bSBEYXRhY2VudGVycyB7XG4gICAgYXdzID0gJ2F3cycsXG4gICAgZ2NwID0gJ2djcCcsXG4gICAgYXp1cmUgPSAnYXp1cmUnXG59XG5cbmV4cG9ydCBlbnVtIEJpbGxpbmdNZXRob2Qge1xuICAgIHN0cmlwZSA9ICdzdHJpcGUnLFxuICAgIGludm9pY2UgPSdpbnZvaWNlJ1xufVxuXG5cbmludGVyZmFjZSBBY2NvdW50QmlsbGluZyB7XG4gICAgbWV0aG9kOiBCaWxsaW5nTWV0aG9kO1xuICAgIHN0cmlwZV9jdXN0b21lcl9pZD86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICBlbWFpbF9kb21haW5zOiBzdHJpbmdbXTtcbiAgICBtZW1iZXJzOiB7XG4gICAgICAgIHJvbGU6IFByb2plY3RSb2xlcztcbiAgICAgICAgdXNlcjogVXNlclJlZjtcbiAgICAgICAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgfVtdO1xuXG4gICAgb25ib2FyZGluZzoge1xuICAgICAgICBjb21wbGV0ZWQ6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBsZXRlZF9hdDogRGF0ZSxcbiAgICB9O1xuXG4gICAgZGF0YWNlbnRlcjogc3RyaW5nO1xuXG4gICAgYmlsbGluZzogQWNjb3VudEJpbGxpbmc7XG5cbiAgICBjcmVhdGVkX2J5OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9ieTogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQWNjb3VudFBheWxvYWQge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZW1haWxfZG9tYWlucz86IHN0cmluZ1tdO1xuICAgIGJpbGxpbmc/OiBBY2NvdW50QmlsbGluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbn1cbmV4cG9ydCBjb25zdCBBY2NvdW50UmVmUG9wdWxhdGUgPSBcImlkIG5hbWVcIjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIEludml0ZVVzZXJSZXF1ZXN0UGF5bG9hZCB7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICByb2xlOiBQcm9qZWN0Um9sZXM7XG4gICAgcHJvamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZpdGVVc2VyUmVzcG9uc2VQYXlsb2FkIHtcbiAgICBhY3Rpb246ICdpbnZpdGVkJyB8ICdhZGRlZCc7XG59XG5cblxudHlwZSBVc2VyT3JBcGlLZXk8VCBleHRlbmRzIFVzZXIgfCBBcGlLZXk+ID0gVCBleHRlbmRzIFVzZXIgPyBVc2VyIDogQXBpS2V5O1xudHlwZSBTZXNzaW9uVHlwZTxUIGV4dGVuZHMgVXNlciB8IEFwaUtleT4gPSBUIGV4dGVuZHMgVXNlciA/IFwidXNlclwiIDogXCJhcGlrZXlcIjtcbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkluZm88VCBleHRlbmRzIFVzZXIgfCBBcGlLZXk+IHtcbiAgICBpc05ldz86IGJvb2xlYW47XG4gICAgdHlwZTogU2Vzc2lvblR5cGU8VD47XG4gICAgc3ViamVjdDogVXNlck9yQXBpS2V5PFQ+O1xuICAgIC8vVXNlciB8IEFwaUtleTsgLy8gbm8gdXNlciBpZiB1c2luZyBhbiBhcGlrZXlcbiAgICBjdXJyZW50X2FjY291bnQ6IEFjY291bnQ7XG4gICAgLy9yb2xlOiBzdHJpbmc7IC8vIFRPRE8gdGhlIHJvbGUgb24gdGhlIHNlbGVjdGVkIGFjY291bnRcbiAgICBhY2NvdW50czogQWNjb3VudFJlZltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTZXNzaW9uSW5mbyBleHRlbmRzIFNlc3Npb25JbmZvPFVzZXI+IHsgfVxuZXhwb3J0IGludGVyZmFjZSBBcGlLZXlTZXNzaW9uSW5mbyBleHRlbmRzIFNlc3Npb25JbmZvPEFwaUtleT4geyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25ib2FyZGluZ1Byb2dyZXNzIHtcbiAgICBpbnRlcmFjdGlvbnM6IGJvb2xlYW4sXG4gICAgcHJvbXB0czogYm9vbGVhbixcbiAgICBlbnZpcm9ubWVudHM6IGJvb2xlYW4sXG4gICAgZGVmYXVsdF9lbnZpcm9ubWVudF9kZWZpbmVkOiBib29sZWFuXG59XG5cblxuLyoqXG4gKiBEYXRhIGNvbGxlY3RlZCBhdCBzaWdudXBcbiAqIHVzZWQgZm9yIG9uYm9hcmRpbmcgYW5kIHNlZ21lbnRzXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ251cERhdGEge1xuICAgIGFjY291bnRUeXBlOiBzdHJpbmc7XG4gICAgY29tcGFueU5hbWU/OiBzdHJpbmc7XG4gICAgY29tcGFueVNpemU/OiBudW1iZXI7XG4gICAgY29tcGFueVdlYnNpdGU/OiBzdHJpbmc7XG4gICAgbWF0dXJpdHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2lnbnVwIFBheWxvYWQ6IHVzZWQgdG8gY3JlYXRlIGEgbmV3IHVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWdudXBQYXlsb2FkIHtcbiAgICBmaXJlYmFzZVRva2VuOiBzdHJpbmc7XG4gICAgc2lnbnVwRGF0YTogU2lnbnVwRGF0YTtcbn0iLCJpbXBvcnQgeyBQcm9qZWN0UmVmIH0gZnJvbSBcIi4uL3Byb2plY3QuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbmFudElkKGFjY291bnRJZDogc3RyaW5nLCBwcm9qZWN0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy91c2UgdGhlIGxhc3QgNiBjaGFyYWN0ZXJzIG9mIHRoZSBhY2NvdW50SWQgYXMgdGhlIGRiIG5hbWVcbiAgICAvL2FzIGluIG1vbmdvIHRoZSBsYXN0IDYgY2hhciBhcmUgYW4gaW5jcmVtZW50aW5nIGNvdW50ZXJcbiAgICBjb25zdCBhY2NvdW50TGFzdDYgPSBhY2NvdW50SWQuc2xpY2UoLTYpO1xuICAgIGNvbnN0IHByb2plY3RMYXN0NiA9IHByb2plY3RJZC5zbGljZSgtNik7XG4gICAgcmV0dXJuIGFjY291bnRMYXN0NiArICdfJyArIHByb2plY3RMYXN0Njtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5hbnRJZEZyb21Qcm9qZWN0KHByb2plY3Q6IFByb2plY3RSZWYpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRUZW5hbnRJZChwcm9qZWN0LmFjY291bnQsIHByb2plY3QuaWQpO1xufVxuIiwiaW1wb3J0IHsgUHJvbXB0Um9sZSB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYSB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTQgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcbmltcG9ydCB7IEludGVyYWN0aW9uUmVmV2l0aFNjaGVtYSwgUG9wdWxhdGVkSW50ZXJhY3Rpb24gfSBmcm9tIFwiLi4vaW50ZXJhY3Rpb24uanNcIjtcbmltcG9ydCB7IFBvcHVsYXRlZFByb21wdFNlZ21lbnREZWYsIFByb21wdFNlZ21lbnREZWYsIFByb21wdFNlZ21lbnREZWZUeXBlLCBQcm9tcHRUZW1wbGF0ZVJlZldpdGhTY2hlbWEgfSBmcm9tIFwiLi4vcHJvbXB0LmpzXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSlNPTlNjaGVtYXMoc2NoZW1hczogSlNPTlNjaGVtYVtdKSB7XG4gICAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIEpTT05TY2hlbWE0PiA9IHt9O1xuICAgIGxldCByZXF1aXJlZDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzY2hlbWEucmVxdWlyZWQgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlZC5pbmNsdWRlcyhwcm9wKSkgcmVxdWlyZWQucHVzaChwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BzLCBzY2hlbWEucHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gT2JqZWN0LmtleXMocHJvcHMpLmxlbmd0aCA+IDAgPyB7IHByb3BlcnRpZXM6IHByb3BzLCByZXF1aXJlZCwgdHlwZTogJ29iamVjdCcgfSBhcyBKU09OU2NoZW1hIDogbnVsbDtcbiAgICByZXR1cm4gc2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX21lcmdlUHJvbXB0c1NjaGVtYShwcm9tcHRzOiBQcm9tcHRTZWdtZW50RGVmPFByb21wdFRlbXBsYXRlUmVmV2l0aFNjaGVtYT5bXSB8IFBvcHVsYXRlZFByb21wdFNlZ21lbnREZWZbXSkge1xuICAgIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBKU09OU2NoZW1hND4gPSB7fTtcbiAgICBsZXQgcmVxdWlyZWQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwcm9tcHQgb2YgcHJvbXB0cykge1xuICAgICAgICBpZiAocHJvbXB0LnRlbXBsYXRlPy5pbnB1dFNjaGVtYT8ucHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gcHJvbXB0LnRlbXBsYXRlPy5pbnB1dFNjaGVtYTtcbiAgICAgICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZWQuaW5jbHVkZXMocHJvcCkpIHJlcXVpcmVkLnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wcywgc2NoZW1hLnByb3BlcnRpZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb21wdC50eXBlID09PSBQcm9tcHRTZWdtZW50RGVmVHlwZS5jaGF0KSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BzLCB7XG4gICAgICAgICAgICAgICAgY2hhdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bTogW1Byb21wdFJvbGUuYXNzaXN0YW50LCBQcm9tcHRSb2xlLnVzZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IFsncm9sZScsICdjb250ZW50J11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVxdWlyZWQucHVzaCgnY2hhdCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykubGVuZ3RoID4gMCA/IHsgcHJvcGVydGllczogcHJvcHMsIHJlcXVpcmVkIH0gYXMgSlNPTlNjaGVtYTQgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcm9tcHRzU2NoZW1hKGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblJlZldpdGhTY2hlbWEgfCBQb3B1bGF0ZWRJbnRlcmFjdGlvbikge1xuICAgIGlmICghaW50ZXJhY3Rpb24ucHJvbXB0cykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIF9tZXJnZVByb21wdHNTY2hlbWEoaW50ZXJhY3Rpb24ucHJvbXB0cyk7XG59XG4iLCJpbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuZnVuY3Rpb24gJGV4aXN0cyh2YWx1ZTogYW55LCBhcmc6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKHZhbHVlICE9PSB1bmRlZmluZWQpID09PSBhcmc7XG59XG5mdW5jdGlvbiAkbnVsbCh2YWx1ZTogYW55LCBhcmc6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID09PSBhcmc7XG59XG5cbmZ1bmN0aW9uICRlcSh2YWx1ZTogYW55LCBhcmc6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGVxdWFsKHZhbHVlLCBhcmcpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGVxdWFsKHZhbHVlLCBhcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gYXJnO1xuICAgIH1cbn1cbmZ1bmN0aW9uICRuZSh2YWx1ZTogYW55LCBhcmc6IGFueSkge1xuICAgIHJldHVybiAhJGVxKHZhbHVlLCBhcmcpO1xufVxuZnVuY3Rpb24gJG9yKHZhbHVlOiBhbnksIGFyZzogYW55W10pIHtcbiAgICByZXR1cm4gYXJnLnNvbWUoYyA9PiBtYXRjaENvbmRpdGlvbih2YWx1ZSwgYykpO1xufVxuZnVuY3Rpb24gJGluKHZhbHVlOiBhbnksIGFyZzogYW55W10pIHtcbiAgICByZXR1cm4gYXJnLmluY2x1ZGVzKHZhbHVlKTtcbn1cbmZ1bmN0aW9uICRuaW4odmFsdWU6IGFueSwgYXJnOiBhbnlbXSkge1xuICAgIHJldHVybiAhJGluKHZhbHVlLCBhcmcpO1xufVxuZnVuY3Rpb24gJHJlZ2V4cCh2YWx1ZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGFyZykudGVzdCh2YWx1ZSk7XG59XG5mdW5jdGlvbiAkZW5kc1dpdGgodmFsdWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdmFsdWUuZW5kc1dpdGgoYXJnKTtcbn1cbmZ1bmN0aW9uICRzdGFydHNXaXRoKHZhbHVlOiBzdHJpbmcsIGFyZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN0YXJ0c1dpdGgoYXJnKTtcbn1cbmZ1bmN0aW9uICRjb250YWlucyh2YWx1ZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xuICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhhcmcpO1xufVxuZnVuY3Rpb24gJGx0KHZhbHVlOiBudW1iZXIsIGFyZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlIDwgYXJnO1xufVxuZnVuY3Rpb24gJGd0KHZhbHVlOiBudW1iZXIsIGFyZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlID4gYXJnO1xufVxuZnVuY3Rpb24gJGx0ZSh2YWx1ZTogbnVtYmVyLCBhcmc6IG51bWJlcikge1xuICAgIHJldHVybiB2YWx1ZSA8PSBhcmc7XG59XG5mdW5jdGlvbiAkZ3RlKHZhbHVlOiBudW1iZXIsIGFyZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IGFyZztcbn1cblxuY29uc3QgY29uZGl0aW9uRm5zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICRleGlzdHMsICRudWxsLFxuICAgICRlcSwgJG5lLFxuICAgICRpbiwgJG5pbixcbiAgICAkcmVnZXhwLCAkc3RhcnRzV2l0aCwgJGVuZHNXaXRoLCAkY29udGFpbnMsXG4gICAgJGx0LCAkZ3QsICRsdGUsICRndGUsXG4gICAgJG9yLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hDb25kaXRpb24odmFsdWU6IGFueSwgY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmRpdGlvbnMpKSB7XG4gICAgICAgIGNvbnN0IGNvbmQgPSBjb25kaXRpb25GbnNba2V5XTtcbiAgICAgICAgaWYgKCFjb25kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29uZGl0aW9uOiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmQodmFsdWUsIGNvbmRpdGlvbnNba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQge1xuICAgIEFjdGl2aXR5SW50ZXJmYWNlRm9yLFxuICAgIEFjdGl2aXR5T3B0aW9ucyxcbiAgICBDYW5jZWxsYXRpb25TY29wZSxcbiAgICBleGVjdXRlQ2hpbGQsXG4gICAgaXNDYW5jZWxsYXRpb24sXG4gICAgbG9nLFxuICAgIHBhdGNoZWQsXG4gICAgcHJveHlBY3Rpdml0aWVzLFxuICAgIHN0YXJ0Q2hpbGQsXG4gICAgVW50eXBlZEFjdGl2aXRpZXMsXG59IGZyb20gXCJAdGVtcG9yYWxpby93b3JrZmxvd1wiO1xuaW1wb3J0IHtcbiAgICBEU0xBY3Rpdml0eUV4ZWN1dGlvblBheWxvYWQsXG4gICAgRFNMQWN0aXZpdHlPcHRpb25zLFxuICAgIERTTEFjdGl2aXR5U3BlYyxcbiAgICBEU0xDaGlsZFdvcmtmbG93U3RlcCxcbiAgICBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsXG4gICAgRFNMV29ya2Zsb3dTcGVjLFxuICAgIGdldERvY3VtZW50SWRzLFxuICAgIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZFxufSBmcm9tIFwiQHZlcnRlc2lhL2NvbW1vblwiO1xuaW1wb3J0IG1zLCB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IHsgQWN0aXZpdHlQYXJhbUludmFsaWQsIEFjdGl2aXR5UGFyYW1Ob3RGb3VuZCwgTm9Eb2N1bWVudEZvdW5kLCBXb3JrZmxvd1BhcmFtTm90Rm91bmQgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBWYXJzIH0gZnJvbSBcIi4vdmFycy5qc1wiO1xuaW1wb3J0IHsgSGFuZGxlRHNsRXJyb3JQYXJhbXMgfSBmcm9tIFwiLi4vYWN0aXZpdGllcy9oYW5kbGVFcnJvci5qc1wiO1xuaW1wb3J0ICogYXMgYWN0aXZpdGllcyBmcm9tIFwiLi4vYWN0aXZpdGllcy9pbmRleC5qc1wiO1xuXG5pbnRlcmZhY2UgQmFzZUFjdGl2aXR5UGF5bG9hZCBleHRlbmRzIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB7XG4gICAgd29ya2Zsb3dfbmFtZTogc3RyaW5nO1xuICAgIGRlYnVnX21vZGU/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBkc2xBY3Rpdml0eVBheWxvYWQ8UGFyYW1zVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KGJhc2VQYXlsb2FkOiBCYXNlQWN0aXZpdHlQYXlsb2FkLCBhY3Rpdml0eTogRFNMQWN0aXZpdHlTcGVjLCBwYXJhbXM6IFBhcmFtc1QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlUGF5bG9hZCxcbiAgICAgICAgYWN0aXZpdHksXG4gICAgICAgIHBhcmFtczogcGFyYW1zIHx8IHt9LFxuICAgIH0gYXMgRFNMQWN0aXZpdHlFeGVjdXRpb25QYXlsb2FkPFBhcmFtc1Q+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkc2xXb3JrZmxvdyhwYXlsb2FkOiBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQpIHtcblxuICAgIGNvbnN0IGRlZmluaXRpb24gPSBwYXlsb2FkLndvcmtmbG93O1xuICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dQYXJhbU5vdEZvdW5kKFwid29ya2Zsb3dcIik7XG4gICAgfVxuICAgIC8vIHRoZSBiYXNlIHBheWxvYWQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWN0aXZpdGllcyBwYXlsb2FkXG4gICAgY29uc3QgYmFzZVBheWxvYWQ6IEJhc2VBY3Rpdml0eVBheWxvYWQgPSB7XG4gICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgIHdvcmtmbG93X25hbWU6IGRlZmluaXRpb24ubmFtZSxcbiAgICAgICAgZGVidWdfbW9kZTogISFkZWZpbml0aW9uLmRlYnVnX21vZGUsXG4gICAgfVxuICAgIGRlbGV0ZSAoYmFzZVBheWxvYWQgYXMgYW55KS53b3JrZmxvdztcblxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmNvbnZlcnREU0xBY3Rpdml0eU9wdGlvbnMoZGVmaW5pdGlvbi5vcHRpb25zKSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogXCI1IG1pbnV0ZVwiLFxuICAgICAgICByZXRyeToge1xuICAgICAgICAgICAgaW5pdGlhbEludGVydmFsOiAnMTBzJyxcbiAgICAgICAgICAgIGJhY2tvZmZDb2VmZmljaWVudDogMixcbiAgICAgICAgICAgIG1heGltdW1BdHRlbXB0czogMTAsXG4gICAgICAgICAgICBtYXhpbXVtSW50ZXJ2YWw6IDEwMCAqIDMwICogMTAwMCwgLy9tc1xuICAgICAgICAgICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogW1xuICAgICAgICAgICAgICAgIE5vRG9jdW1lbnRGb3VuZC5uYW1lLFxuICAgICAgICAgICAgICAgIEFjdGl2aXR5UGFyYW1Ob3RGb3VuZC5uYW1lLFxuICAgICAgICAgICAgICAgIFdvcmtmbG93UGFyYW1Ob3RGb3VuZC5uYW1lLFxuICAgICAgICAgICAgICAgIEFjdGl2aXR5UGFyYW1JbnZhbGlkLm5hbWUsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgbG9nLmRlYnVnKFwiR2xvYmFsIGFjdGl2aXR5IG9wdGlvbnNcIiwge1xuICAgICAgICBhY3Rpdml0eU9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IGRlZmF1bHRQcm94eSA9IHByb3h5QWN0aXZpdGllcyhkZWZhdWx0T3B0aW9ucyk7XG4gICAgbG9nLmRlYnVnKFwiRGVmYXVsdCBhY3Rpdml0eSBwcm94eSBpcyByZWFkeVwiKTtcbiAgICAvLyBtZXJnZSBkZWZhdWx0IHZhcnMgd2l0aCB0aGUgcGF5bG9hZCB2YXJzIGFuZCBhZGQgb2JqZWN0SWRzIGFuZCBvYmplY3RJZFxuICAgIGNvbnN0IHZhcnMgPSBuZXcgVmFycyh7XG4gICAgICAgIC4uLmRlZmluaXRpb24udmFycyxcbiAgICAgICAgLi4ucGF5bG9hZC52YXJzLFxuICAgICAgICBvYmplY3RJZHM6IHBheWxvYWQub2JqZWN0SWRzIHx8IFtdLFxuICAgICAgICBvYmplY3RJZDogcGF5bG9hZC5vYmplY3RJZHMgPyBwYXlsb2FkLm9iamVjdElkc1swXSA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgbG9nLmluZm8oXCJFeGVjdXRpbmcgd29ya2Zsb3dcIiwgeyBwYXlsb2FkIH0pO1xuXG4gICAgLy8gVE9ETyhtaHVhbmcpOiByZW1vdmUgcGF0Y2ggd2hlbiBhbGwgd29ya2Zsb3dzIGFyZSBtaWdyYXRlZCB0byB2MlxuICAgIC8vICAgSXQgYXZvaWRzIGJyZWFraW5nIHRoZSBvbmdvaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiBydW5uaW5nIGluIHYxIGFuZCBhbHNvIGFsbG93cyB1cyB0b1xuICAgIC8vICAgZGVwbG95IHRoZSBuZXcgZXJyb3IgaGFuZGxlciBpbiBwcm9kdWN0aW9uLlxuICAgIC8vICAgU2VlIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kZXZlbG9wL3R5cGVzY3JpcHQvdmVyc2lvbmluZ1xuICAgIGlmIChwYXRjaGVkKCdkc2wtd29ya2Zsb3ctZXJyb3ItaGFuZGxpbmcnKSkge1xuICAgICAgICAvLyB2MjogbmV3IHZlcnNpb24gd2l0aCBlcnJvciBoYW5kbGVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBleGVjdXRlU3RlcHMoZGVmaW5pdGlvbiwgcGF5bG9hZCwgYmFzZVBheWxvYWQsIHZhcnMsIGRlZmF1bHRQcm94eSwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVFcnJvcihlLCBiYXNlUGF5bG9hZCwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdjE6IG9sZCB2ZXJzaW9uIHdpdGhvdXQgZXJyb3IgaGFuZGxlciwgZGVwcmVjYXRlZCBzaW5jZSB2MC41Mi4wXG4gICAgICAgIGF3YWl0IGV4ZWN1dGVTdGVwcyhkZWZpbml0aW9uLCBwYXlsb2FkLCBiYXNlUGF5bG9hZCwgdmFycywgZGVmYXVsdFByb3h5LCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhcnMuZ2V0VmFsdWUoZGVmaW5pdGlvbi5yZXN1bHQgfHwgJ3Jlc3VsdCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlU3RlcHMoZGVmaW5pdGlvbjogRFNMV29ya2Zsb3dTcGVjLCBwYXlsb2FkOiBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsIGJhc2VQYXlsb2FkOiBCYXNlQWN0aXZpdHlQYXlsb2FkLCB2YXJzOiBWYXJzLCBkZWZhdWx0UHJveHk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPFVudHlwZWRBY3Rpdml0aWVzPiwgZGVmYXVsdE9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucykge1xuICAgIGlmIChkZWZpbml0aW9uLnN0ZXBzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBkZWZpbml0aW9uLnN0ZXBzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwVHlwZSA9IHN0ZXAudHlwZTtcbiAgICAgICAgICAgIGlmIChzdGVwVHlwZSA9PT0gJ3dvcmtmbG93Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkV29ya2Zsb3dTdGVwID0gc3RlcCBhcyBEU0xDaGlsZFdvcmtmbG93U3RlcDtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRXb3JrZmxvd1N0ZXAuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RhcnRDaGlsZFdvcmtmbG93KGNoaWxkV29ya2Zsb3dTdGVwLCBwYXlsb2FkLCB2YXJzLCBiYXNlUGF5bG9hZC5kZWJ1Z19tb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjdXRlQ2hpbGRXb3JrZmxvdyhjaGlsZFdvcmtmbG93U3RlcCwgcGF5bG9hZCwgdmFycywgYmFzZVBheWxvYWQuZGVidWdfbW9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWN0aXZpdHlcbiAgICAgICAgICAgICAgICBhd2FpdCBydW5BY3Rpdml0eShzdGVwIGFzIERTTEFjdGl2aXR5U3BlYywgYmFzZVBheWxvYWQsIHZhcnMsIGRlZmF1bHRQcm94eSwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChkZWZpbml0aW9uLmFjdGl2aXRpZXMpIHsgLy8gbGVnYWN5IHN1cHBvcnRcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpdml0eSBvZiBkZWZpbml0aW9uLmFjdGl2aXRpZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1bkFjdGl2aXR5KGFjdGl2aXR5LCBiYXNlUGF5bG9hZCwgdmFycywgZGVmYXVsdFByb3h5LCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdGVwcyBvciBhY3Rpdml0aWVzIGZvdW5kIGluIHRoZSB3b3JrZmxvdyBkZWZpbml0aW9uXCIpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXJyb3Iob3JpZ2luYWxFcnJvcjogYW55LCBiYXNlUGF5bG9hZDogQmFzZUFjdGl2aXR5UGF5bG9hZCwgZGVmYXVsdE9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucykge1xuICAgIGNvbnN0IHsgaGFuZGxlRHNsRXJyb3IgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oZGVmYXVsdE9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IGRzbEFjdGl2aXR5UGF5bG9hZChcbiAgICAgICAgYmFzZVBheWxvYWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaGFuZGxlRHNsRXJyb3JcIixcbiAgICAgICAgICAgIHBhcmFtczogeyBlcnJvck1lc3NhZ2U6IG9yaWdpbmFsRXJyb3IubWVzc2FnZSB9LFxuICAgICAgICB9IGFzIERTTEFjdGl2aXR5U3BlYyxcbiAgICAgICAgeyBlcnJvck1lc3NhZ2U6IG9yaWdpbmFsRXJyb3IubWVzc2FnZSB9IHNhdGlzZmllcyBIYW5kbGVEc2xFcnJvclBhcmFtcyxcbiAgICApXG5cbiAgICBpZiAoaXNDYW5jZWxsYXRpb24ob3JpZ2luYWxFcnJvcikpIHtcbiAgICAgICAgbG9nLndhcm4oYFdvcmtmbG93IGV4ZWN1dGlvbiBjYW5jZWxsZWQsIGV4ZWN1dGluZyBlcnJvciBoYW5kbGVyIHRvIHVwZGF0ZSBkb2N1bWVudCBzdGF0dXNgLCB7IGVycm9yOiBvcmlnaW5hbEVycm9yIH0pO1xuICAgICAgICAvLyBDbGVhbnVwIGxvZ2ljIG11c3QgYmUgaW4gYSBub25DYW5jZWxsYWJsZSBzY29wZVxuICAgICAgICAvLyBJZiB3ZSdkIHJ1biBjbGVhbnVwIG91dHNpZGUgb2YgYSBub25DYW5jZWxsYWJsZSBzY29wZSBpdCB3b3VsZCd2ZSBiZWVuIGNhbmNlbGxlZFxuICAgICAgICAvLyBiZWZvcmUgYmVpbmcgc3RhcnRlZCBiZWNhdXNlIHRoZSBXb3JrZmxvdydzIHJvb3Qgc2NvcGUgaXMgY2FuY2VsbGVkLlxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RldmVsb3AvdHlwZXNjcmlwdC9jYW5jZWxsYXRpb25cbiAgICAgICAgYXdhaXQgQ2FuY2VsbGF0aW9uU2NvcGUubm9uQ2FuY2VsbGFibGUoKCkgPT4gaGFuZGxlRHNsRXJyb3IocGF5bG9hZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGBXb3JrZmxvdyBleGVjdXRpb24gZmFpbGVkLCBleGVjdXRpbmcgZXJyb3IgaGFuZGxlciB0byB1cGRhdGUgZG9jdW1lbnQgc3RhdHVzYCwgeyBlcnJvcjogb3JpZ2luYWxFcnJvciB9KTtcbiAgICAgICAgaGFuZGxlRHNsRXJyb3IocGF5bG9hZCk7XG4gICAgfVxuICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGRXb3JrZmxvdyhzdGVwOiBEU0xDaGlsZFdvcmtmbG93U3RlcCwgcGF5bG9hZDogRFNMV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkLCB2YXJzOiBWYXJzLCBkZWJ1Z19tb2RlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc29sdmVkVmFycyA9IHZhcnMucmVzb2x2ZSgpO1xuICAgIGlmIChzdGVwLnZhcnMpIHtcbiAgICAgICAgLy8gY29weSB1c2VyIHZhcnMgKGZyb20gc3RlcCBkZWZpbml0aW9uKSB0byB0aGUgcmVzb2x2ZWQgdmFyc1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkVmFycywgc3RlcC52YXJzKTtcbiAgICB9XG4gICAgaWYgKGRlYnVnX21vZGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZmxvdyB2YXJzIGJlZm9yZSBzdGFydGluZyBjaGlsZCB3b3JrZmxvdyAke3N0ZXAubmFtZX1gLCB7IHZhcnM6IHJlc29sdmVkVmFycyB9KTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlID0gYXdhaXQgc3RhcnRDaGlsZChzdGVwLm5hbWUsIHtcbiAgICAgICAgLi4uc3RlcC5vcHRpb25zLFxuICAgICAgICBhcmdzOiBbe1xuICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgIHdvcmtmbG93OiBzdGVwLnNwZWMsXG4gICAgICAgICAgICB2YXJzOiByZXNvbHZlZFZhcnNcbiAgICAgICAgfV0sXG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIEFjY291bnRJZDogW3BheWxvYWQuYWNjb3VudF9pZF0sXG4gICAgICAgICAgICBEb2N1bWVudElkOiBnZXREb2N1bWVudElkcyhwYXlsb2FkKSxcbiAgICAgICAgICAgIFByb2plY3RJZDogW3BheWxvYWQucHJvamVjdF9pZF0sXG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKHN0ZXAub3V0cHV0KSB7XG4gICAgICAgIHZhcnMuc2V0VmFsdWUoc3RlcC5vdXRwdXQsIGhhbmRsZS53b3JrZmxvd0lkKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZFdvcmtmbG93KHN0ZXA6IERTTENoaWxkV29ya2Zsb3dTdGVwLCBwYXlsb2FkOiBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsIHZhcnM6IFZhcnMsIGRlYnVnX21vZGU/OiBib29sZWFuKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRWYXJzID0gdmFycy5yZXNvbHZlKCk7XG4gICAgaWYgKHN0ZXAudmFycykge1xuICAgICAgICAvLyBjb3B5IHVzZXIgdmFycyAoZnJvbSBzdGVwIGRlZmluaXRpb24pIHRvIHRoZSByZXNvbHZlZCB2YXJzXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWRWYXJzLCBzdGVwLnZhcnMpO1xuICAgIH1cbiAgICBpZiAoZGVidWdfbW9kZSkge1xuICAgICAgICBsb2cuZGVidWcoYFdvcmtmbG93IHZhcnMgYmVmb3JlIGV4ZWN1dGluZyBjaGlsZCB3b3JrZmxvdyAke3N0ZXAubmFtZX1gLCB7IHZhcnM6IHJlc29sdmVkVmFycyB9KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUNoaWxkKHN0ZXAubmFtZSwge1xuICAgICAgICAuLi5zdGVwLm9wdGlvbnMsXG4gICAgICAgIGFyZ3M6IFt7XG4gICAgICAgICAgICAuLi5wYXlsb2FkLFxuICAgICAgICAgICAgd29ya2Zsb3c6IHN0ZXAuc3BlYyxcbiAgICAgICAgICAgIHZhcnM6IHJlc29sdmVkVmFycyxcbiAgICAgICAgfV0sXG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIEFjY291bnRJZDogW3BheWxvYWQuYWNjb3VudF9pZF0sXG4gICAgICAgICAgICBEb2N1bWVudElkOiBnZXREb2N1bWVudElkcyhwYXlsb2FkKSxcbiAgICAgICAgICAgIFByb2plY3RJZDogW3BheWxvYWQucHJvamVjdF9pZF0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoc3RlcC5vdXRwdXQpIHtcbiAgICAgICAgdmFycy5zZXRWYWx1ZShzdGVwLm91dHB1dCwgcmVzdWx0KTtcbiAgICAgICAgaWYgKGRlYnVnX21vZGUpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgV29ya2Zsb3cgdmFycyBhZnRlciBleGVjdXRpbmcgY2hpbGQgd29ya2Zsb3cgJHtzdGVwLm5hbWV9YCwgeyB2YXJzOiB2YXJzLnJlc29sdmUoKSB9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVidWdfbW9kZSkge1xuICAgICAgICBsb2cuZGVidWcoYFdvcmtmbG93IHZhcnMgYWZ0ZXIgZXhlY3V0aW5nIGNoaWxkIHdvcmtmbG93ICR7c3RlcC5uYW1lfWAsIHsgdmFyczogcmVzb2x2ZWRWYXJzIH0pO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQWN0aXZpdHkoYWN0aXZpdHk6IERTTEFjdGl2aXR5U3BlYywgYmFzZVBheWxvYWQ6IEJhc2VBY3Rpdml0eVBheWxvYWQsIHZhcnM6IFZhcnMsIGRlZmF1bHRQcm94eTogQWN0aXZpdHlJbnRlcmZhY2VGb3I8VW50eXBlZEFjdGl2aXRpZXM+LCBkZWZhdWx0T3B0aW9uczogQWN0aXZpdHlPcHRpb25zKSB7XG4gICAgaWYgKGJhc2VQYXlsb2FkLmRlYnVnX21vZGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZmxvdyB2YXJzIGJlZm9yZSBleGVjdXRpbmcgYWN0aXZpdHkgJHthY3Rpdml0eS5uYW1lfWAsIHsgdmFyczogdmFycy5yZXNvbHZlKCkgfSk7XG4gICAgfVxuICAgIGlmIChhY3Rpdml0eS5jb25kaXRpb24gJiYgIXZhcnMubWF0Y2goYWN0aXZpdHkuY29uZGl0aW9uKSkge1xuICAgICAgICBsb2cuaW5mbyhcIkFjdGl2aXR5IHNraXBwZWQ6IGNvbmRpdGlvbiBub3Qgc2F0aXNmaWVkXCIsIGFjdGl2aXR5LmNvbmRpdGlvbik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW1wb3J0UGFyYW1zID0gdmFycy5jcmVhdGVJbXBvcnRWYXJzKGFjdGl2aXR5LmltcG9ydCk7XG4gICAgY29uc3QgZXhlY3V0aW9uUGF5bG9hZCA9IGRzbEFjdGl2aXR5UGF5bG9hZChiYXNlUGF5bG9hZCwgYWN0aXZpdHksIGltcG9ydFBhcmFtcyk7XG4gICAgbG9nLmluZm8oXCJFeGVjdXRpbmcgYWN0aXZpdHk6IFwiICsgYWN0aXZpdHkubmFtZSwgeyBwYXlsb2FkOiBleGVjdXRpb25QYXlsb2FkIH0pO1xuXG4gICAgbGV0IHByb3h5ID0gZGVmYXVsdFByb3h5O1xuICAgIGlmIChhY3Rpdml0eS5vcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb21wdXRlQWN0aXZpdHlPcHRpb25zKGFjdGl2aXR5Lm9wdGlvbnMsIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgICAgbG9nLmRlYnVnKFwiVXNlIGN1c3RvbSBhY3Rpdml0eSBvcHRpb25zXCIsIHtcbiAgICAgICAgICAgIGFjdGl2aXR5TmFtZTogYWN0aXZpdHkubmFtZSxcbiAgICAgICAgICAgIGFjdGl2aXR5T3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb3h5ID0gcHJveHlBY3Rpdml0aWVzKG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmRlYnVnKFwiVXNlIGRlZmF1bHQgYWN0aXZpdHkgb3B0aW9uc1wiLCB7XG4gICAgICAgICAgICBhY3Rpdml0eU5hbWU6IGFjdGl2aXR5Lm5hbWUsXG4gICAgICAgICAgICBhY3Rpdml0eU9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmbiA9IHByb3h5W2FjdGl2aXR5Lm5hbWVdO1xuICAgIGlmIChhY3Rpdml0eS5wYXJhbGxlbCkge1xuICAgICAgICAvL1RPRE8gZXhlY3V0ZSBpbiBwYXJhbGxlbFxuICAgICAgICBsb2cuaW5mbyhcIlBhcmFsbGVsIGV4ZWN1dGlvbiBub3QgeWV0IGltcGxlbWVudGVkXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5pbmZvKFwiRXhlY3V0aW5nIGFjdGl2aXR5OiBcIiArIGFjdGl2aXR5Lm5hbWUsIHsgaW1wb3J0UGFyYW1zIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihleGVjdXRpb25QYXlsb2FkKTtcbiAgICAgICAgaWYgKGFjdGl2aXR5Lm91dHB1dCkge1xuICAgICAgICAgICAgdmFycy5zZXRWYWx1ZShhY3Rpdml0eS5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJhc2VQYXlsb2FkLmRlYnVnX21vZGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZmxvdyB2YXJzIGFmdGVyIGV4ZWN1dGluZyBhY3Rpdml0eSAke2FjdGl2aXR5Lm5hbWV9YCwgeyB2YXJzOiB2YXJzLnJlc29sdmUoKSB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQWN0aXZpdHlPcHRpb25zKGN1c3RvbU9wdGlvbnM6IERTTEFjdGl2aXR5T3B0aW9ucywgZGVmYXVsdE9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5T3B0aW9ucyB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbnZlcnREU0xBY3Rpdml0eU9wdGlvbnMoY3VzdG9tT3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHJldHJ5OiB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0T3B0aW9ucy5yZXRyeSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMucmV0cnksXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnREU0xBY3Rpdml0eU9wdGlvbnMob3B0aW9ucz86IERTTEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5T3B0aW9ucyB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdDogQWN0aXZpdHlPcHRpb25zID0ge307XG4gICAgaWYgKG9wdGlvbnMuc3RhcnRUb0Nsb3NlVGltZW91dCkge1xuICAgICAgICByZXN1bHQuc3RhcnRUb0Nsb3NlVGltZW91dCA9IG1zKG9wdGlvbnMuc3RhcnRUb0Nsb3NlVGltZW91dCBhcyBTdHJpbmdWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpIHtcbiAgICAgICAgcmVzdWx0LnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgPSBtcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgYXMgU3RyaW5nVmFsdWUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSB7XG4gICAgICAgIHJlc3VsdC5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0ID0gbXMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0IGFzIFN0cmluZ1ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucmV0cnkpIHtcbiAgICAgICAgcmVzdWx0LnJldHJ5ID0ge307XG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5LmluaXRpYWxJbnRlcnZhbCkge1xuICAgICAgICAgICAgcmVzdWx0LnJldHJ5LmluaXRpYWxJbnRlcnZhbCA9IG1zKG9wdGlvbnMucmV0cnkuaW5pdGlhbEludGVydmFsIGFzIFN0cmluZ1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeS5tYXhpbXVtSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXRyeS5tYXhpbXVtSW50ZXJ2YWwgPSBtcyhvcHRpb25zLnJldHJ5Lm1heGltdW1JbnRlcnZhbCBhcyBTdHJpbmdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnkubWF4aW11bUF0dGVtcHRzKSB7XG4gICAgICAgICAgICByZXN1bHQucmV0cnkubWF4aW11bUF0dGVtcHRzID0gb3B0aW9ucy5yZXRyeS5tYXhpbXVtQXR0ZW1wdHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnkuYmFja29mZkNvZWZmaWNpZW50KSB7XG4gICAgICAgICAgICByZXN1bHQucmV0cnkuYmFja29mZkNvZWZmaWNpZW50ID0gb3B0aW9ucy5yZXRyeS5iYWNrb2ZmQ29lZmZpY2llbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnkubm9uUmV0cnlhYmxlRXJyb3JUeXBlcykge1xuICAgICAgICAgICAgcmVzdWx0LnJldHJ5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXMgPSBvcHRpb25zLnJldHJ5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsImltcG9ydCB7IEFjdGl2aXR5T3B0aW9ucywgcHJveHlBY3Rpdml0aWVzIH0gZnJvbSBcIkB0ZW1wb3JhbGlvL3dvcmtmbG93XCI7XG5pbXBvcnQgeyBEU0xBY3Rpdml0eUV4ZWN1dGlvblBheWxvYWQsIFdvcmtmbG93RXhlY3V0aW9uQmFzZVBhcmFtcywgV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIH0gZnJvbSBcIkB2ZXJ0ZXNpYS9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBEc2xBY3Rpdml0eUZ1bmN0aW9uPFBhcmFtc1QgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55LCBSZXR1cm5UID0gYW55PiB7XG4gICAgKHBheWxvYWQ6IERTTEFjdGl2aXR5RXhlY3V0aW9uUGF5bG9hZDxQYXJhbXNUPik6IFByb21pc2U8UmV0dXJuVD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHNsU2ltcGxpZmllZEFjdGl2aXR5RnVuY3Rpb248UGFyYW1zVCA9IGFueSwgUmV0dXJuVCA9IGFueT4ge1xuICAgIChwYXlsb2FkOiBXb3JrZmxvd0V4ZWN1dGlvbkJhc2VQYXJhbXMsIHBhcmFtczogUGFyYW1zVCk6IFByb21pc2U8UmV0dXJuVD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkc2xQcm94eUFjdGl2aXRpZXM8XG4gICAgQWN0aXZpdGllc1QgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBEc2xBY3Rpdml0eUZ1bmN0aW9uPGFueSwgYW55Pj5cbj4od29ya2Zsb3dOYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyA9IHt9KSB7XG4gICAgdHlwZSBEc2xBY3Rpdml0aWVzID0ge1xuICAgICAgICBbSyBpbiBrZXlvZiBBY3Rpdml0aWVzVF06IEFjdGl2aXRpZXNUW0tdIGV4dGVuZHMgRHNsQWN0aXZpdHlGdW5jdGlvbjxpbmZlciBQYXJhbXNULCBpbmZlciBSZXR1cm5UPlxuICAgICAgICA/IERzbFNpbXBsaWZpZWRBY3Rpdml0eUZ1bmN0aW9uPFBhcmFtc1QsIFJldHVyblQ+XG4gICAgICAgIDogbmV2ZXI7XG4gICAgfTtcblxuICAgIGNvbnN0IGFjdGl2aXRpZXMgPSBwcm94eUFjdGl2aXRpZXM8QWN0aXZpdGllc1Q+KG9wdGlvbnMpIGFzIEFjdGl2aXRpZXNUO1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSwge1xuICAgICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZpdHlGbiA9IGFjdGl2aXRpZXNbcHJvcCBhcyBrZXlvZiBBY3Rpdml0aWVzVF0gYXMgRHNsQWN0aXZpdHlGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiAocGF5bG9hZDogV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkLCBwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpdml0eUZuKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHByb3AgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd19uYW1lOiB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBEc2xBY3Rpdml0aWVzO1xufVxuIiwiaW1wb3J0IHsgSW1wb3J0U3BlYyB9IGZyb20gXCJAdmVydGVzaWEvY29tbW9uXCI7XG5pbXBvcnQgeyBtYXRjaENvbmRpdGlvbiB9IGZyb20gXCIuL2NvbmRpdGlvbnMuanNcIjtcbmltcG9ydCB7IE9iamVjdEtleSwgT2JqZWN0VmlzaXRvciwgT2JqZWN0V2Fsa2VyIH0gZnJvbSBcIi4vd2Fsay5qc1wiO1xuXG5jb25zdCBGQUxMQkFDS19WQUxVRV9TRVAgPSBcIj8/XCI7XG5cbmZ1bmN0aW9uIGRlY29kZUxpdGVyYWxWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiJ1wiKSkge1xuICAgICAgICB2YWx1ZSA9ICdcIicgKyB2YWx1ZS5zbGljZSgxLCAtMSkucmVwbGFjZSgvKD88IVxcXFwpXCIvZywgJ1xcXFxcIicpICsgJ1wiJ1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFBhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKHBhdGguaW5kZXhPZignWycpID4gLTEpIHsgLy8gc3VwcG9ydCBhcnJheSBsaWtlIHBhdGhzXG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcWyhcXGQrKVxcXS9nLCAnLiQxJyk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJyk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcm9wZXJ0eSBuYW1lZCBieSBcIm5hbWVcIiBvZiB0aGUgZ2l2ZW4gb2JqZWN0XG4gKiBJZiBhbiBhcnJheSBpcyBpbmRleGVkIHVzaW5nIGEgc3RyaW5nIGtleSB0aGVuIGEgbWFwIGlzIGRvbmUgYW5kIGFuIGFycmF5IHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIHByb3BlcnRpZXMgd2l0aCB0aGF0IG5hbWUgYXJlIHJldHVybmVkXG4gKiBFeDogZG9jcy50ZXh0ID0+IHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIHRleHQgcHJvcGVydGllcyBvZiB0aGUgZG9jcyBhcnJheVxuICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWVcbiAqL1xuZnVuY3Rpb24gX3Byb3Aob2JqZWN0OiBhbnksIG5hbWU6IHN0cmluZykge1xuICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBvYmplY3QgPSBfdmFsdWVPZihvYmplY3QpOyAvLyByZXNvbHZlIFZhbHVlIG9iamVjdHNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gK25hbWU7XG4gICAgICAgIGlmIChpc05hTihpbmRleCkpIHtcbiAgICAgICAgICAgIC8vIG1hcCBhcnJheSB0byBwcm9wZXJ0eVxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5tYXAoaXRlbSA9PiBpdGVtW25hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfdmFsdWVPZihvYmplY3RbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfdmFsdWVPZihvYmplY3RbbmFtZV0pO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBfdmFsdWVPZih2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVmFsdWUgPyB2YWx1ZS52YWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUZpZWxkKG9iamVjdDogYW55LCBwYXRoOiBzdHJpbmdbXSkge1xuICAgIGxldCBwID0gb2JqZWN0IGFzIGFueTtcbiAgICBpZiAoIXApIHJldHVybiBwO1xuICAgIGlmICghcGF0aC5sZW5ndGgpIHJldHVybiBfdmFsdWVPZihwKTtcbiAgICBjb25zdCBsYXN0ID0gcGF0aC5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7XG4gICAgICAgIHAgPSBfcHJvcChwLCBwYXRoW2ldKVxuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIF9wcm9wKHAsIHBhdGhbbGFzdF0pO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBWYWx1ZTxUID0gYW55PiB7XG4gICAgYWJzdHJhY3QgdmFsdWU6IFQ7XG4gICAgYWJzdHJhY3Qgc3RyaW5naWZ5KCk6IHN0cmluZztcbn1cbmNsYXNzIExpdGVyYWxWYWx1ZTxUID0gYW55PiBleHRlbmRzIFZhbHVlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IFQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH1cbn1cblxuY2xhc3MgUmVmVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHZhcnM6IFZhcnMsIHB1YmxpYyBwYXRoOiBzdHJpbmdbXSwgcHVibGljIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhcnMuZ2V0VmFsdWVGcm9tUGF0aCh0aGlzLnBhdGgpO1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFycy5wcmVzZXJ2ZVJlZnMgPyB0aGlzLnN0cmluZ2lmeSgpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdHJpbmdpZnkoKSB7XG4gICAgICAgIHJldHVybiBcIiR7XCIgKyB0aGlzLnBhdGguam9pbignLicpICsgXCJ9XCI7XG4gICAgfVxufVxuXG5jbGFzcyBFeHByVmFsdWUgZXh0ZW5kcyBWYWx1ZSB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHZhcnM6IFZhcnMsIHB1YmxpYyBwYXJ0czogVmFsdWVbXSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWcgb2YgdGhpcy5wYXJ0cykge1xuICAgICAgICAgICAgY29uc3QgdiA9IHNlZy52YWx1ZTtcbiAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBvdXQucHVzaChTdHJpbmcoc2VnLnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBzdHJpbmdpZnkoKSB7XG4gICAgICAgIGNvbnN0IG91dCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHNlZyBvZiB0aGlzLnBhcnRzKSB7XG4gICAgICAgICAgICBvdXQucHVzaChzZWcuc3RyaW5naWZ5KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIiR7XCIgKyBvdXQuam9pbignJykgKyBcIn1cIjtcbiAgICB9XG5cbn1cblxuXG5leHBvcnQgY2xhc3MgVmFycyB7XG4gICAgbWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB3aGVuIHJlc29sdmluZyBwYXJhbXMuIEl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIHJlZmVyZW5jZXMgdGhhdCBzaG91bGQgbm90IGJlIHJlc29sdmVkIHRvIHRoZWlyIHZhbHVlXG4gICAgICogYnV0IGluc3RlYWQgdGhleSBuZWVkIHRvIHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9uIHRvIGJlIGFibGUgdG8gcmVnZW5lcmF0ZSBhbm90aGVyIFZhcnMgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBleHByZXNzaW9uXG4gICAgICovXG4gICAgLy9UT0RPIHRoaXMgZmVhdHVyZSBpcyBubyBtb3JlIHVzZWQgLSBpdCB3YXMgcmVwbGFjZWQgYnkgaW1wb3J0VmFycyBzbyB3ZSBjYW4gbm93IGRlbGV0ZSBgcHJlc2VydmVSZWZzYFxuICAgIHByZXNlcnZlUmVmczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YXJzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICB0aGlzLm1hcCA9IHZhcnMgPyB0aGlzLnBhcnNlKHZhcnMpIDoge307XG4gICAgfVxuXG4gICAgcGFyc2UodmFyczogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9iamVjdFdhbGtlcigpLm1hcCh2YXJzLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmFsdWUodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWQodmFyczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHRoaXMucGFyc2UodmFycyk7XG4gICAgICAgIHRoaXMubWFwID0gT2JqZWN0LmFzc2lnbih0aGlzLm1hcCwgdG9BcHBlbmQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgYSBsaXRlcmFsIHZhbHVlIChjYW5ub3Qgc2V0IGEgcmVmKVxuICAgICAqIFRvIGFkZCByZWZzIHVzZSBgYXBwZW5kKClgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKi9cbiAgICBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5tYXBbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZShwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVGaWVsZCh0aGlzLm1hcCwgc3BsaXRQYXRoKHBhdGgpKTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZUZyb21QYXRoKHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlRmllbGQodGhpcy5tYXAsIHBhdGgpO1xuICAgIH1cblxuICAgIGhhcyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwW25hbWVdICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbWF0Y2gobWF0Y2g6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG1hdGNoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaENvbmRpdGlvbih2YWx1ZSwgbWF0Y2hbbmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwcmVzZXJ2ZVJlZnM/OiBTZXQ8c3RyaW5nPikge1xuICAgICAgICB0aGlzLnByZXNlcnZlUmVmcyA9IHByZXNlcnZlUmVmcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0V2Fsa2VyKCkubWFwKHBhcmFtcywgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuY3JlYXRlVmFsdWUodGhpcywgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2IGluc3RhbmNlb2YgVmFsdWUgPyB2LnZhbHVlIDogdjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLnByZXNlcnZlUmVmcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc29sdmUocHJlc2VydmVSZWZzPzogU2V0PHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgZnVuY3Rpb24gbWFwKF9rZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpIHx8IHYuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gYXJyYXkgb3IgcGxhaW4gb2JqZWN0IC0gcmVjdXJzZSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG8gZmluZCBvdGhlciBuZXN0ZWQgUmVmIHZhbHVlcyBpZiBhbnkuLi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0V2Fsa2VyKCkubWFwKHYsIG1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnByZXNlcnZlUmVmcyA9IHByZXNlcnZlUmVmcztcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0V2Fsa2VyKCkubWFwKHRoaXMubWFwLCBtYXApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZVJlZnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVSZWZWYWx1ZShyZWY6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHJlZi5pbmRleE9mKEZBTExCQUNLX1ZBTFVFX1NFUCk7XG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlY29kZUxpdGVyYWxWYWx1ZShyZWYuc3Vic3RyaW5nKGluZGV4ICsgRkFMTEJBQ0tfVkFMVUVfU0VQLmxlbmd0aCkudHJpbSgpKTtcbiAgICAgICAgICAgIHJlZiA9IHJlZi5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmID09PSAnLicgfHwgcmVmLmluZGV4T2YoJy4uJykgPiAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB2YXJpYWJsZSByZWZlcmVuY2U6IFwiICsgcmVmKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmVmFsdWUodGhpcywgc3BsaXRQYXRoKHJlZiksIGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlVmFsdWUodmFyczogVmFycywgb2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAob2JqLmluZGV4T2YoJyR7JykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb2JqLnNwbGl0KC8oXFwke1tefV0rfSkvKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZyA9IHNlZ21lbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWZWYWx1ZShzZWcuc3Vic3RyaW5nKDIsIHNlZy5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzOiBWYWx1ZVtdID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZyA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnLnN0YXJ0c1dpdGgoJyR7JykgJiYgc2VnLmVuZHNXaXRoKCd9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGhpcy5jcmVhdGVSZWZWYWx1ZShzZWcuc3Vic3RyaW5nKDIsIHNlZy5sZW5ndGggLSAxKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChuZXcgTGl0ZXJhbFZhbHVlKHNlZykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwclZhbHVlKHZhcnMsIHBhcnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlSW1wb3J0VmFycyhpbXBvcnRTcGVjOiBJbXBvcnRTcGVjIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghaW1wb3J0U3BlYyB8fCBpbXBvcnRTcGVjLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgaW1wb3J0VmFyIG9mIGltcG9ydFNwZWMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW1wb3J0VmFyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgYWRkSW1wb3J0VmFyKGltcG9ydFZhciwgdW5kZWZpbmVkLCB0aGlzLCByZXN1bHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbXBvcnRWYXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEltcG9ydFZhcihpbXBvcnRWYXJba2V5XSwga2V5LCB0aGlzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGdldFVua25vd25SZWZlcmVuY2VzKG9iajogYW55KSB7XG4gICAgICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgVW5rbm93blJlZmVyZW5jZXNWaXNpdG9yKHRoaXMpO1xuICAgICAgICBuZXcgT2JqZWN0V2Fsa2VyKCkud2FsayhvYmosIHZpc2l0b3IpO1xuICAgICAgICByZXR1cm4gdmlzaXRvci5yZXN1bHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRJbXBvcnRWYXIodmFyUGF0aDogc3RyaW5nLCBhc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFyczogVmFycywgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgbGV0IGlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICBpZiAodmFyUGF0aC5lbmRzV2l0aChcIiFcIikpIHtcbiAgICAgICAgaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIHZhclBhdGggPSB2YXJQYXRoLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gdmFycy5nZXRWYWx1ZSh2YXJQYXRoKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpc1JlcXVpcmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW1wb3J0IHZhcmlhYmxlICR7dmFyUGF0aH0gaXMgcmVxdWlyZWQgYnV0IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXN1bHRbYXNOYW1lIHx8IHZhclBhdGhdID0gdmFsdWU7XG59XG5cblxuY2xhc3MgVW5rbm93blJlZmVyZW5jZXNWaXNpdG9yIGltcGxlbWVudHMgT2JqZWN0VmlzaXRvciB7XG5cbiAgICByZXN1bHQ6IHsgbmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcgfVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFyczogVmFycykge1xuICAgIH1cblxuICAgIG9uVmFsdWUoX2tleTogT2JqZWN0S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHZhcnMgPSB0aGlzLnZhcnM7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB2YXJzLmNyZWF0ZVZhbHVlKHZhcnMsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXhwclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHYucGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBSZWZWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJzLmhhcyhwLnBhdGhbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQucHVzaCh7IG5hbWU6IHAucGF0aC5qb2luKCcuJyksIGV4cHJlc3Npb246IHAuc3RyaW5naWZ5KCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBSZWZWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghdmFycy5oYXModi5wYXRoWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdC5wdXNoKHsgbmFtZTogdi5wYXRoLmpvaW4oJy4nKSwgZXhwcmVzc2lvbjogdi5zdHJpbmdpZnkoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcbmV4cG9ydCB0eXBlIE9iamVjdEtleSA9IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZDtcbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VmlzaXRvciB7XG4gICAgb25TdGFydE9iamVjdD86IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgICBvbkVuZE9iamVjdD86IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgICBvblN0YXJ0SXRlcmF0aW9uPzogKGtleTogT2JqZWN0S2V5LCB2YWx1ZTogSXRlcmFibGU8YW55PikgPT4gdm9pZDtcbiAgICBvbkVuZEl0ZXJhdGlvbj86IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IEl0ZXJhYmxlPGFueT4pID0+IHZvaWQ7XG4gICAgb25WYWx1ZT86IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIE9iamVjdFdhbGtlciB7XG4gICAgc3VwcG9ydEl0ZXJhdG9ycyA9IGZhbHNlOyAvLyBvbmx5IGFycmF5IGFyZSBzdXBwb3J0ZWQgYnkgZGVmYXVsdFxuICAgIGNvbnN0cnVjdG9yKHN1cHBvcnRJdGVyYXRvcnMgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnN1cHBvcnRJdGVyYXRvcnMgPSBzdXBwb3J0SXRlcmF0b3JzO1xuICAgIH1cbiAgICB3YWxrKG9iajogYW55LCB2aXNpdG9yOiBPYmplY3RWaXNpdG9yKSB7XG4gICAgICAgIHRoaXMuX3dhbGsodW5kZWZpbmVkLCBvYmosIHZpc2l0b3IpO1xuICAgIH1cbiAgICBfd2FsayhrZXk6IE9iamVjdEtleSwgb2JqOiBhbnksIHZpc2l0b3I6IE9iamVjdFZpc2l0b3IpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgICAgIGlmICghb2JqIHx8IHR5cGUgIT09ICdvYmplY3QnIHx8IG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHZpc2l0b3Iub25WYWx1ZSAmJiB2aXNpdG9yLm9uVmFsdWUoa2V5LCBvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdGhpcy5fd2Fsa0l0ZXJhYmxlKGtleSwgb2JqLCB2aXNpdG9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN1cHBvcnRJdGVyYXRvcnMgJiYgb2JqW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhbGtJdGVyYWJsZShrZXksIG9iaiwgdmlzaXRvcik7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsgLy8gYSBwbGFpbiBvYmplY3RcbiAgICAgICAgICAgIHRoaXMuX3dhbGtPYmplY3Qoa2V5LCBvYmosIHZpc2l0b3IpO1xuICAgICAgICB9IGVsc2UgeyAvLyBhIHJhbmRvbSBvYmplY3QgLSB3ZSB0cmVhdCBpdCBhcyBhIHZhbHVlXG4gICAgICAgICAgICB2aXNpdG9yLm9uVmFsdWUgJiYgdmlzaXRvci5vblZhbHVlKGtleSwgb2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF93YWxrSXRlcmFibGUoa2V5OiBPYmplY3RLZXksIG9iajogYW55LCB2aXNpdG9yOiBPYmplY3RWaXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3Iub25TdGFydEl0ZXJhdGlvbiAmJiB2aXNpdG9yLm9uU3RhcnRJdGVyYXRpb24oa2V5LCBvYmopO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqKSB7XG4gICAgICAgICAgICB0aGlzLl93YWxrKGkrKywgdmFsdWUsIHZpc2l0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0b3Iub25FbmRJdGVyYXRpb24gJiYgdmlzaXRvci5vbkVuZEl0ZXJhdGlvbihrZXksIG9iaik7XG4gICAgfVxuXG4gICAgX3dhbGtPYmplY3Qoa2V5OiBPYmplY3RLZXksIG9iajogYW55LCB2aXNpdG9yOiBPYmplY3RWaXNpdG9yKSB7XG4gICAgICAgIHZpc2l0b3Iub25TdGFydE9iamVjdCAmJiB2aXNpdG9yLm9uU3RhcnRPYmplY3Qoa2V5LCBvYmopO1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgICAgdGhpcy5fd2FsayhrLCBvYmpba10sIHZpc2l0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHZpc2l0b3Iub25FbmRPYmplY3QgJiYgdmlzaXRvci5vbkVuZE9iamVjdChrZXksIG9iaik7XG4gICAgfVxuXG4gICAgbWFwKG9iajogYW55LCBtYXBGbjogKGtleTogT2JqZWN0S2V5LCB2YWx1ZTogYW55KSA9PiBhbnkpIHtcbiAgICAgICAgY29uc3QgdmlzaXRvciA9IG5ldyBNYXBWaXNpdG9yKG1hcEZuKTtcbiAgICAgICAgdGhpcy53YWxrKG9iaiwgdmlzaXRvcik7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnJlc3VsdDtcbiAgICB9XG59XG5cbmNsYXNzIE1hcFZpc2l0b3IgaW1wbGVtZW50cyBPYmplY3RWaXNpdG9yIHtcbiAgICByZXN1bHQ6IGFueTtcbiAgICBjdXJyZW50OiBhbnk7XG4gICAgc3RhY2s6IGFueVtdID0gW107XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXBGbjogKGtleTogT2JqZWN0S2V5LCB2YWx1ZTogYW55KSA9PiBhbnkpIHsgfVxuXG4gICAgb25TdGFydE9iamVjdChrZXk6IE9iamVjdEtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0ID0ge307XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnQpO1xuICAgICAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRba2V5XSA9IG9iajtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IG9iajtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkVuZE9iamVjdCgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICB9XG5cbiAgICBvblN0YXJ0SXRlcmF0aW9uKGtleTogT2JqZWN0S2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMucmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuY3VycmVudCk7XG4gICAgICAgICAgICBjb25zdCBhcjogYW55W10gPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFtrZXldID0gYXI7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRW5kSXRlcmF0aW9uKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgIH1cblxuICAgIG9uVmFsdWUoa2V5OiBPYmplY3RLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMubWFwRm4oa2V5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSByO1xuICAgICAgICB9IGVsc2UgaWYgKHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50W2tleV0gPSByO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgRFNMQWN0aXZpdHlTcGVjLCBEU0xXb3JrZmxvd1NwZWMgfSBmcm9tIFwiQHZlcnRlc2lhL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTm9Eb2N1bWVudEZvdW5kIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBpZHM/OiBzdHJpbmdbXSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiTm9Eb2N1bWVudEZvdW5kXCI7XG4gICAgICAgIHRoaXMuaWRzID0gaWRzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFjdGl2aXR5UGFyYW1Ob3RGb3VuZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtTmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgYWN0aXZpdHk6IERTTEFjdGl2aXR5U3BlYyxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gbm90IGZvdW5kIGluIGFjdGl2aXR5ICR7YWN0aXZpdHkubmFtZX1gKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBY3Rpdml0eVBhcmFtTm90Rm91bmRcIjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eVBhcmFtSW52YWxpZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtTmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgYWN0aXZpdHk6IERTTEFjdGl2aXR5U3BlYyxcbiAgICAgICAgcmVhc29uPzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBzdXBlcihgJHtwYXJhbU5hbWV9IGluIGFjdGl2aXR5ICR7YWN0aXZpdHkubmFtZX0gaXMgaW52YWxpZCR7cmVhc29uID8gYCAke3JlYXNvbn1gIDogXCJcIn1gKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJBY3Rpdml0eVBhcmFtSW52YWxpZFwiO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93UGFyYW1Ob3RGb3VuZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHBhcmFtTmFtZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgd29ya2Zsb3c/OiBEU0xXb3JrZmxvd1NwZWMsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGBSZXF1aXJlZCBwYXJhbWV0ZXIgJHtwYXJhbU5hbWV9IG5vdCBmb3VuZCBpbiB3b3JrZmxvdyAke3dvcmtmbG93Py5uYW1lfWApO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIldvcmtmbG93UGFyYW1Ob3RGb3VuZFwiO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IFdGX05PTl9SRVRSWUFCTEVfRVJST1JTID0gW1wiTm9Eb2N1bWVudEZvdW5kXCIsIFwiQWN0aXZpdHlQYXJhbU5vdEZvdW5kXCIsIFwiV29ya2Zsb3dQYXJhbU5vdEZvdW5kXCJdO1xuIiwiaW1wb3J0IHsgV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIH0gZnJvbSBcIkB2ZXJ0ZXNpYS9jb21tb25cIjtcblxuaW1wb3J0IHsgbG9nLCBwcm94eUFjdGl2aXRpZXMgfSBmcm9tIFwiQHRlbXBvcmFsaW8vd29ya2Zsb3dcIjtcbmltcG9ydCB7IFdGX05PTl9SRVRSWUFCTEVfRVJST1JTIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0ICogYXMgYWN0aXZpdGllcyBmcm9tIFwiLi9hY3Rpdml0aWVzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBJdGVyYXRpdmVHZW5lcmF0aW9uUGF5bG9hZCwgUGFydEluZGV4LCBTRUNUSU9OX0lEX1BMQUNFSE9MREVSIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuY29uc3Qge1xuICAgIGl0X2dlbl9leHRyYWN0VG9jLFxuICAgIGl0X2dlbl9nZW5lcmF0ZVRvYyxcbiAgICBpdF9nZW5fZ2VuZXJhdGVQYXJ0LFxuICAgIGl0X2dlbl9maW5hbGl6ZU91dHB1dFxufSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IFwiMTUgbWludXRlXCIsXG4gICAgcmV0cnk6IHtcbiAgICAgICAgaW5pdGlhbEludGVydmFsOiAnMzBzJyxcbiAgICAgICAgYmFja29mZkNvZWZmaWNpZW50OiAyLFxuICAgICAgICBtYXhpbXVtQXR0ZW1wdHM6IDIwLFxuICAgICAgICBtYXhpbXVtSW50ZXJ2YWw6IDEwMCAqIDMwICogMTAwMCwgLy9tc1xuICAgICAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpdGVyYXRpdmVHZW5lcmF0aW9uV29ya2Zsb3cocGF5bG9hZDogV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkKSB7XG4gICAgbG9nLmluZm8oYEV4ZWN1dGluZyBJdGVyYXRpdmUgZ2VuZXJhdGlvbiB3b3JrZmxvdy5gKTtcblxuICAgIGNvbnN0IHZhcnMgPSBwYXlsb2FkLnZhcnMgYXMgSXRlcmF0aXZlR2VuZXJhdGlvblBheWxvYWQ7XG4gICAgaWYgKHZhcnMuc2VjdGlvbl9maWxlX3BhdHRlcm4gJiYgIXZhcnMuc2VjdGlvbl9maWxlX3BhdHRlcm4uaW5jbHVkZXMoU0VDVElPTl9JRF9QTEFDRUhPTERFUikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlY3Rpb25fZmlsZV9wYXR0ZXJuOiAke3ZhcnMuc2VjdGlvbl9maWxlX3BhdHRlcm59LiBJdCBtdXN0IGluY2x1ZGUgdGhlICR7U0VDVElPTl9JRF9QTEFDRUhPTERFUn0gcGxhY2Vob2xkZXIuYCk7XG4gICAgfVxuXG4gICAgLy8gZXh0cmFjdFRvYyB0cmllcyB0byBleHRyYWN0IHRoZSB0b2MgZnJvbSB0aGUgaW5wdXQgbWVtb3J5IHBhY2sgKHRvYy5qc29uIG9yIHRvYy55YW1sKVxuICAgIC8vIHRoZSBnZW5lcmF0ZVRvYyBhY3Rpdml0eSBpcyByZXR1cm5pbmcgdGhlIHRvYyBoaWVyYXJjaHkuXG4gICAgLy8gSXQgZG9lc24ndCBpbmNsdWRlIGV4dHJhIFRPQyBkZXRhaWxzIGxpa2UgZGVzY3JpcHRpb24gZXRjLlxuICAgIC8vIFRvIG1pbmltaXplIHRoZSBwYXlsb2FkIHNpemUgb25seSB0aGUgaGllcmFyY2h5IGFuZCB0aGUgc2VjdGlvbi9wYXJ0IG5hbWVzIGFyZSByZXR1cm5lZFxuICAgIGxldCB0b2MgPSBhd2FpdCBpdF9nZW5fZXh0cmFjdFRvYyhwYXlsb2FkKTtcbiAgICBpZiAoIXRvYykge1xuICAgICAgICBsb2cuaW5mbyhgTm8gVE9DIHdhcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IG1lbW9yeSBwYWNrLiBHZW5lcmF0aW5nIG9uZS5gKTtcbiAgICAgICAgdG9jID0gYXdhaXQgaXRfZ2VuX2dlbmVyYXRlVG9jKHBheWxvYWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5pbmZvKGBVc2luZyB0aGUgVE9DIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgbWVtb3J5IHBhY2suYCk7XG4gICAgfVxuXG4gICAgaWYgKHRvYy5zZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy9UT0RPIGhvdyB0byBoYW5kbGUgdGhpcyBjYXNlP1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3RoaW5nIHRvIGdlbmVyYXRlOiBUT0MgaXMgZW1wdHlcIik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHRvYy5zZWN0aW9ucykge1xuICAgICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBzZWN0aW9uOiAke2Zvcm1hdFBhdGgoc2VjdGlvbil9YCk7XG4gICAgICAgIGF3YWl0IGl0X2dlbl9nZW5lcmF0ZVBhcnQocGF5bG9hZCwgc2VjdGlvbi5wYXRoKTtcblxuICAgICAgICBpZiAoc2VjdGlvbi5wYXJ0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHNlY3Rpb24ucGFydHMpIHtcbiAgICAgICAgICAgICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBwYXJ0OiAke2Zvcm1hdFBhdGgocGFydCl9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaXRfZ2VuX2dlbmVyYXRlUGFydChwYXlsb2FkLCBwYXJ0LnBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9nLmluZm8oYFBvc3QtcHJvY2Vzc2luZyBvdXRwdXQgbWVtb3J5IHBhY2tgKTtcbiAgICBhd2FpdCBpdF9nZW5fZmluYWxpemVPdXRwdXQocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhdGgobm9kZTogUGFydEluZGV4KSB7XG4gICAgLy8gd2UgcHJpbnQgMSBiYXNlZCBpbmRleGVzXG4gICAgcmV0dXJuIG5vZGUucGF0aC5tYXAoaSA9PiBpICsgMSkuam9pbignLicpICsgJyAnICsgbm9kZS5uYW1lO1xufSIsIlxuZXhwb3J0IGNvbnN0IFNFQ1RJT05fSURfUExBQ0VIT0xERVIgPSAnJWlkJztcblxuLyoqXG4gKiBBbiBpdGVyYXRpdmUgZ2VuZXJhdGlvbiB3b3JrZmxvdyB1c2VzIDIgbWVtb3J5IHBhY2tzIG9uZSBmb3IgaW5wdXQgYW5kIHRoZSBvdGhlciBmb3Igb3V0cHV0LlxuICogVGhlIGlucHV0IG1lbW9yeSBwYWNrcyBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgcHJvamVjdCBibG9icyBidWNrZXQgYXQgYCR7dGVuYW50X2lkL21lbW9yaWVzLyR7bWVtb3J5X25hbWV9L2lucHV0LnRhci5nemAuXG4gKiBUaGUgb3V0cHV0IG1lbW9yeSBwYWNrIHdpbGwgYmUgZ2VuZXJhdGVkIGF0IGAke3RlbmFudF9pZC9tZW1vcmllcy8ke21lbW9yeV9uYW1lfS9vdXRwdXQudGFyLmd6YC5cbiAqIEVhY2ggaXRlcmF0aW9uIGlzIG92ZXJ3cml0aW5nIHRoZSBvdXRwdXQgbWVtb3J5IHBhY2sgd2l0aCB0aGUgbmV3IGdlbmVyYXRlZCBjb250ZW50LlxuICogVGhlIGNvbXBsZXRlIG5hbWUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbWVtb3J5IHBhY2tzIGFyZTogXCIke25hbWV9L2lucHV0XCIgYW5kIFwiJHtuYW1lfS9vdXRwdXRcIiB3aGVyZSBuYW1lIGlzIHRoZSBiYXNlIG1lbW9yeSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZXJhdGl2ZUdlbmVyYXRpb25QYXlsb2FkIHtcbiAgICAvLyB0aGUgbWFpbiBpbnRlcmFjdGlvbiB0byBleGVjdXRlLiBJZiBpdGVyYXRpdmVfZ2VuZXJhdGlvbiBpcyBkZWZpbmVkXG4gICAgLy8gdGhlIG1haW4gaW50ZXJhY3Rpb24gd2lsbCBvbmx5IGJlIHVzZWQgdG8gcHJlcGFyZSB0aGUgaXRlcmF0aW9uICh0byBnZW5lcmF0ZSB0aGUgVE9DKVxuICAgIC8vIG90aGVyd2lzZSBpdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBpdGVyYXRpdmUgZ2VuZXJhdGlvbiB0b28uXG4gICAgaW50ZXJhY3Rpb246IHN0cmluZztcbiAgICAvLyBpZiBkZWZpbmVkIHRoaXMgd2lsbCBiZSB1c2VkIGZvciB0aGUgaXRlcmF0aXZlIGludGVyYWN0aW9uIHdoaWNoIHdpbGwgZ2VuZXJhdGUgcGFydHMuXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBtYWluIGludGVyYWN0aW9uIHdpbGwgYmUgdXNlZCBmb3IgaXRlcmF0aXZlIGdlbmVyYXRpb24uXG4gICAgaXRlcmF0aXZlX2ludGVyYWN0aW9uPzogc3RyaW5nO1xuICAgIC8vIHRoZSBlbnZpcm9ubWVudCB0byB1c2VcbiAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICAvLyB0aGUgbW9kZWwgdG8gdXNlXG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgLy8gQSBjdXN0b20gbWF4IHRva2Vuc1xuICAgIG1heF90b2tlbnM/OiBudW1iZXI7XG4gICAgLy8gQSBjdXN0b20gdGVtcGVyYXR1cmVcbiAgICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgICAvLyB0aGUgbWVtb3J5IHBhY2sgZ3JvdXAgbmFtZVxuICAgIG1lbW9yeTogc3RyaW5nO1xuICAgIC8vIHRoZSBpbnB1dCBtZW1vcnkgcGFjayBtYXBwaW5nXG4gICAgaW5wdXRfbWFwcGluZz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgLy8gY3VzdG9tIHRvYyBzY2hlbWEgaWYgYW55IFRPRE8gcmVtb3ZlIHRoaXNcbiAgICB0b2Nfc2NoZW1hPzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIC8qKlxuICAgICAqIElmIG5vdCBzZXQgdG8gXCJub25lXCIgdGhlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGNvbnRlbnQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGl0ZXJhdGlvbi5cbiAgICAgKiBJZiBub3Qgc2V0IGF0IGFsbCBkZWZhdWx0cyB0byBcInNlY3Rpb25cIi5cbiAgICAgKiBJZiBcInNlY3Rpb25cIiBpcyB1c2VkIG9ubHkgdGhlIHNlY3Rpb24gY29udGVudCBwcmV2aW91c2x5IGdlbmVyYXRlZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbmV4dCBpdGVyYXRpb24uXG4gICAgICogSWYgXCJkb2N1bWVudFwiIGlzIHVzZWQgdGhlIHdob2xlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGRvY3VtZW50IGNvbnRlbnQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgaXRlcmF0aW9uLlxuICAgICAqIERlZmF1bHRzIHRvIHNlY3Rpb24uXG4gICAgICovXG4gICAgcmVtZW1icmFuY2Vfc3RyYXRlZ3k/OiBcImRvY3VtZW50XCIgfCBcInNlY3Rpb25cIiB8IFwibm9uZVwiO1xuICAgIC8qKlxuICAgICAqIElmIHByZXNlbnQgd2lsbCBzYXZlIHNlY3Rpb25zIGluIGZpbGVzIHVzaW5nIHRoZSBwYXR0ZXJuXG4gICAgICogVGhlIHBhdHRlcm4gbXVzdCBpbmNsdWRlIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBzZWN0aW9uIGlkOiAlaWQuXG4gICAgICogRXhhbXBsZXM6IGBzZWN0aW9ucy8laWQubWRgLCBgJWlkL3BhZ2UubWR4YCBldGMuXG4gICAgICogQHNlZSBTRUNUSU9OX0lEX1BMQUNFSE9MREVSXG4gICAgICovXG4gICAgc2VjdGlvbl9maWxlX3BhdHRlcm4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgaGVhZGVyIHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gZmlsZXMuXG4gICAgICogVGhlIGhlYWRlciBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczpcbiAgICAgKiAtICR7c2VjdGlvbn0gLSB0aGUgc2VjdGlvbiBvYmplY3RcbiAgICAgKiAtICR7ZGF0ZX0gLSB0aGUgZGF0ZSB3aGVuIHRoZSBmaWxlIHdhcyBnZW5lcmF0ZWRcbiAgICAgKi9cbiAgICBzZWN0aW9uX2ZpbGVfaGVhZGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvY1BhcnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGluc3RydWN0aW9ucz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2NTZWN0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gICAgcGFydHM/OiBUb2NQYXJ0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9jIHtcbiAgICBzZWN0aW9uczogVG9jU2VjdGlvbltdO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdGlvbkluZGV4IGV4dGVuZHMgUGFydEluZGV4IHtcbiAgICBwYXJ0cz86IFBhcnRJbmRleFtdO1xufVxuZXhwb3J0IGludGVyZmFjZSBQYXJ0SW5kZXgge1xuICAgIHBhdGg6IG51bWJlcltdO1xuICAgIG5hbWU6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVG9jSW5kZXgge1xuICAgIHNlY3Rpb25zOiBTZWN0aW9uSW5kZXhbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPdXRwdXRNZW1vcnlNZXRhIHtcbiAgICB0b2M6IFRvYztcbiAgICBwcmV2aW91c2x5R2VuZXJhdGVkOiBzdHJpbmc7XG4gICAgbGFzdFByb2Nlc3NlZFBhcnQ/OiBudW1iZXJbXSB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWN0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBjb250ZW50OiBzdHJpbmc7XG59XG4iLCJcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAdGVtcG9yYWxpby93b3JrZmxvd1wiO1xuaW1wb3J0IHsgQ29udGVudEV2ZW50TmFtZSwgV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIH0gZnJvbSBcIkB2ZXJ0ZXNpYS9jb21tb25cIjtcbmltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSBcIi4uL2FjdGl2aXRpZXMvbm90aWZ5V2ViaG9vay5qc1wiO1xuaW1wb3J0IHsgZHNsUHJveHlBY3Rpdml0aWVzIH0gZnJvbSBcIi4uL2RzbC9kc2xQcm94eUFjdGl2aXRpZXMuanNcIjtcbmltcG9ydCB7IFdGX05PTl9SRVRSWUFCTEVfRVJST1JTIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuXG5jb25zdCB7XG4gICAgbm90aWZ5V2ViaG9va1xufSA9IGRzbFByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oXCJub3RpZnlXZWJob29rV29ya2Zsb3dcIiwge1xuICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IFwiNSBtaW51dGVcIixcbiAgICByZXRyeToge1xuICAgICAgICBpbml0aWFsSW50ZXJ2YWw6ICc1cycsXG4gICAgICAgIGJhY2tvZmZDb2VmZmljaWVudDogMixcbiAgICAgICAgbWF4aW11bUF0dGVtcHRzOiA1LFxuICAgICAgICBtYXhpbXVtSW50ZXJ2YWw6IDEwMCAqIDMwICogMTAwMCwgLy9tc1xuICAgICAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyxcbiAgICB9LFxufSk7XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vdGlmeVdlYmhvb2tXb3JrZmxvdyhwYXlsb2FkOiBXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgY29uc3QgeyBvYmplY3RJZHMsIHZhcnMgfSA9IHBheWxvYWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9ucyA9IFtdO1xuICAgIGNvbnN0IGVuZHBvaW50cyA9IHZhcnM/LndlYmhvb2tzIHx8IFtdO1xuICAgIGNvbnN0IGV2ZW50TmFtZSA9IHZhcnMuZXZlbnQgfHwgQ29udGVudEV2ZW50TmFtZS53b3JrZmxvd19maW5pc2hlZDtcblxuICAgIGlmICghZW5kcG9pbnRzLmxlbmd0aCkge1xuICAgICAgICBsb2cuaW5mbyhgTm8gd2ViaG9va3MgdG8gbm90aWZ5YCk7XG4gICAgICAgIHJldHVybiB7IG5vdGlmaWNhdGlvbnM6IFtdLCBtZXNzYWdlOiBcIk5vIHdlYmhvb2tzIHRvIG5vdGlmeVwiIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlcCBvZiBlbmRwb2ludHMpIHtcbiAgICAgICAgY29uc3QgbiA9IG5vdGlmeVdlYmhvb2socGF5bG9hZCwge1xuICAgICAgICAgICAgdGFyZ2V0X3VybDogZXAsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBvYmplY3RfaWRzOiBvYmplY3RJZHMsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB2YXJzLndlYmhvb2tfZGF0YSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdmFyc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBsb2cuaW5mbyhgV2ViaG9vayBub3RpZmllZCBhdCAke2VwfSB3aXRoIHJlc3BvbnNlIGNvZGU6ICR7cmVzLnN0YXR1c31gLCB7IHJlcyB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgICAgICBub3RpZmljYXRpb25zLnB1c2gobik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwobm90aWZpY2F0aW9ucyk7XG4gICAgbG9nLmluZm8oYFdlYmhvb2tzIG5vdGlmaWVkYCk7XG5cbiAgICByZXR1cm4geyBub3RpZmljYXRpb25zOiByZXMsIG1lc3NhZ2U6IFwiV2ViaG9va3Mgbm90aWZpZWRcIiB9O1xuXG59XG4iLCJcbmltcG9ydCB7IFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzLCBXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQgfSBmcm9tIFwiQHZlcnRlc2lhL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgYWN0aXZpdGllcyBmcm9tIFwiLi4vYWN0aXZpdGllcy9pbmRleC1kc2wuanNcIjtcbmltcG9ydCB7IGRzbFByb3h5QWN0aXZpdGllcyB9IGZyb20gXCIuLi9kc2wvZHNsUHJveHlBY3Rpdml0aWVzLmpzXCI7XG5pbXBvcnQgeyBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuY29uc3Qge1xuICAgIGdlbmVyYXRlRW1iZWRkaW5ncyxcbn0gPSBkc2xQcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KFwicmVjYWxjdWxhdGVFbWJlZGRpbmdzV29ya2Zsb3dcIiwge1xuICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IFwiNSBtaW51dGVcIixcbiAgICByZXRyeToge1xuICAgICAgICBpbml0aWFsSW50ZXJ2YWw6ICcxMHMnLFxuICAgICAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IDIsXG4gICAgICAgIG1heGltdW1BdHRlbXB0czogMTAsXG4gICAgICAgIG1heGltdW1JbnRlcnZhbDogMTAwICogMzAgKiAxMDAwLCAvL21zXG4gICAgICAgIG5vblJldHJ5YWJsZUVycm9yVHlwZXM6IFdGX05PTl9SRVRSWUFCTEVfRVJST1JTLFxuICAgIH0sXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY2FsY3VsYXRlRW1iZWRkaW5nc1dvcmtmbG93KHBheWxvYWQ6IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCkge1xuXG4gICAgY29uc3QgZW1iZWRkaW5ncyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIE9iamVjdC52YWx1ZXMoU3VwcG9ydGVkRW1iZWRkaW5nVHlwZXMpKSB7XG4gICAgICAgIGVtYmVkZGluZ3MucHVzaChnZW5lcmF0ZUVtYmVkZGluZ3MocGF5bG9hZCwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgIH0pKVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKGVtYmVkZGluZ3MpO1xuXG4gICAgcmV0dXJuIHJlcztcblxufSIsIi8qKlxuICogRXhwb3J0IHdvcmtmbG93cyB0byBiZSByZWdpc3RlcmVkIG9uIHRlbXBvcmFsIHdvcmtlcnNcbiAqL1xuZXhwb3J0IHsgZHNsV29ya2Zsb3cgfSBmcm9tIFwiLi9kc2wvZHNsLXdvcmtmbG93LmpzXCI7XG5leHBvcnQgeyBpdGVyYXRpdmVHZW5lcmF0aW9uV29ya2Zsb3cgfSBmcm9tIFwiLi9pdGVyYXRpdmUtZ2VuZXJhdGlvbi9pdGVyYXRpdmVHZW5lcmF0aW9uV29ya2Zsb3cuanNcIjtcbmV4cG9ydCB7IG5vdGlmeVdlYmhvb2tXb3JrZmxvdyB9IGZyb20gXCIuL3N5c3RlbS9ub3RpZnlXZWJob29rV29ya2Zsb3cuanNcIjtcbmV4cG9ydCB7IHJlY2FsY3VsYXRlRW1iZWRkaW5nc1dvcmtmbG93IH0gZnJvbSBcIi4vc3lzdGVtL3JlY2FsY3VsYXRlRW1iZWRkaW5nc1dvcmtmbG93LmpzXCI7XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIlxuY29uc3QgYXBpID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL3dvcmtlci1pbnRlcmZhY2UuanMnKTtcbmV4cG9ydHMuYXBpID0gYXBpO1xuXG5jb25zdCB7IG92ZXJyaWRlR2xvYmFscyB9ID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL2dsb2JhbC1vdmVycmlkZXMuanMnKTtcbm92ZXJyaWRlR2xvYmFscygpO1xuXG5leHBvcnRzLmltcG9ydFdvcmtmbG93cyA9IGZ1bmN0aW9uIGltcG9ydFdvcmtmbG93cygpIHtcbiAgcmV0dXJuIHJlcXVpcmUoLyogd2VicGFja01vZGU6IFwiZWFnZXJcIiAqLyBcIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L2xpYi9lc20vd29ya2Zsb3dzLmpzXCIpO1xufVxuXG5leHBvcnRzLmltcG9ydEludGVyY2VwdG9ycyA9IGZ1bmN0aW9uIGltcG9ydEludGVyY2VwdG9ycygpIHtcbiAgcmV0dXJuIFtcbiAgICBcbiAgXTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
|
11428
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctYnVuZGxlLThjZTEyZTQ2NGQyYWNmYzUyNTdhLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTJCO0FBRVU7QUFDQztBQUNKO0FBQ0U7QUFDRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ053RDtBQUMxQztBQTRDN0MsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsTUFBcUI7SUFDbEUsZ0JBQWdCO0lBQ2hCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQzthQUNJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksTUFBTSxJQUFLLE1BQStCLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQzVELE9BQU8sTUFBTSxDQUFDO1lBQ2xCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQzthQUNJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7YUFDSSxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFDRCxnQkFBZ0I7U0FDWCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMs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QUFFO1lBQ3hDLEtBQUssRUFBRSxJQUFJO1lBQ1gsSUFBSTtTQUNQLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFMUMsT0FBTyxHQUFHLENBQUM7QUFFZixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xDRDs7R0FFRztBQUNpRDtBQUNnRDtBQUMxQjtBQUNnQjs7Ozs7Ozs7Ozs7QUNOMUY7Ozs7Ozs7Ozs7QUNBQTs7Ozs7O1VDQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7OztBQ0xBLFlBQVksbUJBQU8sQ0FBQyxvS0FBOEM7QUFDbEUsV0FBVzs7QUFFWCxRQUFRLGtCQUFrQixFQUFFLG1CQUFPLENBQUMsb0tBQThDO0FBQ2xGOztBQUVBLHVCQUF1QjtBQUN2QixTQUFTLG1CQUFPLDRCQUE0QixzREFBK0U7QUFDM0g7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9sbHVtaXZlcnNlL2NvbW1vbi9zcmMvaW5kZXgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9sbHVtaXZlcnNlL2NvbW1vbi9zcmMvb3B0aW9ucy9iZWRyb2NrLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL29wdGlvbnMvZmFsbGJhY2sudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9sbHVtaXZlcnNlL2NvbW1vbi9zcmMvb3B0aW9ucy9ncm9xLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL29wdGlvbnMvb3BlbmFpLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbGx1bWl2ZXJzZS9jb21tb24vc3JjL29wdGlvbnMvdmVydGV4YWkudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9sbHVtaXZlcnNlL2NvbW1vbi9zcmMvdHlwZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1vcHRpb25zLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2RhdGEtY29udmVydGVyLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL3BheWxvYWQtY29kZWMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXIudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvdHlwZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9kZXByZWNhdGVkLXRpbWUudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9lbmNvZGluZy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2Vycm9ycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ZhaWx1cmUudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbmRleC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyY2VwdG9ycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyZmFjZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcm5hbC13b3JrZmxvdy9lbnVtcy1oZWxwZXJzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvaW5kZXgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9sb2dnZXIudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9yZXRyeS1wb2xpY3kudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90aW1lLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdHlwZS1oZWxwZXJzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdmVyc2lvbmluZy1pbnRlbnQtZW51bS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbytjb21tb25AMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctaGFuZGxlLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctb3B0aW9ucy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9hbGVhLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2NhbmNlbGxhdGlvbi1zY29wZS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9lcnJvcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZmxhZ3MudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLWF0dHJpYnV0ZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLW92ZXJyaWRlcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbmRleC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcmNlcHRvcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJmYWNlcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9pbnRlcm5hbHMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvbG9ncy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9wa2cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc2lua3MudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc3RhY2staGVscGVycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy90cmlnZ2VyLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3VwZGF0ZS1zY29wZS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZXItaW50ZXJmYWNlLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTEuNy9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL3dvcmtmbG93LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL2Zhc3QtZGVlcC1lcXVhbEAzLjEuMy9ub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsL2luZGV4LmpzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL2xvbmdANS4zLjEvbm9kZV9tb2R1bGVzL2xvbmcvdW1kL2luZGV4LmpzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvbm9kZV9tb2R1bGVzLy5wbnBtL21zQDMuMC4wLWNhbmFyeS4xL25vZGVfbW9kdWxlcy9tcy9kaXN0L2luZGV4LmNqcyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9tc0AzLjAuMC1jYW5hcnkuMS9ub2RlX21vZHVsZXMvbXMvZGlzdC9pbmRleC5tanMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL1Byb2dyZXNzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9hY2Nlc3MtY29udHJvbC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvYW5hbHl0aWNzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9hcGlrZXkudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2NvbW1vbi50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvZW52aXJvbm1lbnQudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2ZhY2V0cy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvaW5kZXgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2ludGVncmF0aW9ucy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvaW50ZXJhY3Rpb24udHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL2pzb24tc2NoZW1hLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9tZXRlcnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3BheWxvYWQudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3BsdWdpbi50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvcHJvamVjdC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvcHJvbXB0LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9xdWVyeS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvcmVmcy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvcnVucy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvYWN0aXZpdHktY2F0YWxvZy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvYWdlbnQudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL2NvbGxlY3Rpb25zLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9zdG9yZS9jb21tb24udHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3N0b3JlL2RvYy1hbmFseXplci50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvZHNsLXdvcmtmbG93LnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9zdG9yZS9pbmRleC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvb2JqZWN0LXR5cGVzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9zdG9yZS9zaWduYWxzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvY29tbW9uL3NyYy9zdG9yZS9zdG9yZS50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvdGVtcG9yYWxpby50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvc3RvcmUvd29ya2Zsb3cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3RlbmFudC50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL2NvbW1vbi9zcmMvdHJhaW5pbmcudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3RyYW5zaWVudC10b2tlbnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3VzZXIudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2F1dGgudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL3NjaGVtYXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvZHNsL2NvbmRpdGlvbnMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvZHNsL2RzbC13b3JrZmxvdy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L3NyYy9kc2wvZHNsUHJveHlBY3Rpdml0aWVzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL2RzbC92YXJzLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL2RzbC93YWxrLnRzIiwiL1VzZXJzL2JvZ2Rhbi93b3JrL3N0dWRpby9jb21wb3NhYmxlYWkvcGFja2FnZXMvd29ya2Zsb3cvc3JjL2Vycm9ycy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L3NyYy9pdGVyYXRpdmUtZ2VuZXJhdGlvbi9pdGVyYXRpdmVHZW5lcmF0aW9uV29ya2Zsb3cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvaXRlcmF0aXZlLWdlbmVyYXRpb24vdHlwZXMudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvc3lzdGVtL25vdGlmeVdlYmhvb2tXb3JrZmxvdy50cyIsIi9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL3BhY2thZ2VzL3dvcmtmbG93L3NyYy9zeXN0ZW0vcmVjYWxjdWxhdGVFbWJlZGRpbmdzV29ya2Zsb3cudHMiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9zcmMvd29ya2Zsb3dzLnRzIiwiaWdub3JlZHwvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9ub2RlX21vZHVsZXMvLnBucG0vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xMS43L25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9saWJ8X190ZW1wb3JhbF9jdXN0b21fZmFpbHVyZV9jb252ZXJ0ZXIiLCJpZ25vcmVkfC9Vc2Vycy9ib2dkYW4vd29yay9zdHVkaW8vY29tcG9zYWJsZWFpL25vZGVfbW9kdWxlcy8ucG5wbS9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjExLjcvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYnxfX3RlbXBvcmFsX2N1c3RvbV9wYXlsb2FkX2NvbnZlcnRlciIsIndlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9saWIvZXNtL3dvcmtmbG93cy1hdXRvZ2VuZXJhdGVkLWVudHJ5cG9pbnQuY2pzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL29wdGlvbnMvYmVkcm9jay5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3B0aW9ucy9mYWxsYmFjay5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3B0aW9ucy9ncm9xLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vcHRpb25zL29wZW5haS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3B0aW9ucy92ZXJ0ZXhhaS5qc1wiO1xuIiwiaW1wb3J0IHsgTW9kZWxPcHRpb25zSW5mbywgTW9kZWxPcHRpb25zLCBPcHRpb25UeXBlLCBNb2RlbE9wdGlvbkluZm9JdGVtIH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyB0ZXh0T3B0aW9uc0ZhbGxiYWNrIH0gZnJvbSBcIi4vZmFsbGJhY2suanNcIjtcblxuLy8gVW5pb24gdHlwZSBvZiBhbGwgQmVkcm9jayBvcHRpb25zXG5leHBvcnQgdHlwZSBCZWRyb2NrT3B0aW9ucyA9IE5vdmFDYW52YXNPcHRpb25zIHwgQmFzZUNvbnZlcnNlT3B0aW9ucyB8IEJlZHJvY2tDbGF1ZGVPcHRpb25zIHwgQmVkcm9ja1BhbG15cmFPcHRpb25zO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5vdmFDYW52YXNPcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stbm92YS1jYW52YXNcIlxuICAgIHRhc2tUeXBlOiBcIlRFWFRfSU1BR0VcIiB8IFwiVEVYVF9JTUFHRV9XSVRIX0lNQUdFX0NPTkRJVElPTklOR1wiIHwgXCJDT0xPUl9HVUlERURfR0VORVJBVElPTlwiIHwgXCJJTUFHRV9WQVJJQVRJT05cIiB8IFwiSU5QQUlOVElOR1wiIHwgXCJPVVRQQUlOVElOR1wiIHwgXCJCQUNLR1JPVU5EX1JFTU9WQUxcIjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgcXVhbGl0eT86IFwic3RhbmRhcmRcIiB8IFwicHJlbWl1bVwiO1xuICAgIGNmZ1NjYWxlPzogbnVtYmVyO1xuICAgIHNlZWQ/OiBudW1iZXI7XG4gICAgbnVtYmVyT2ZJbWFnZXM/OiBudW1iZXI7XG4gICAgY29udHJvbE1vZGU/OiBcIkNBTk5ZX0VER0VcIiB8IFwiU0VHTUVOVEFUSU9OXCI7XG4gICAgY29udHJvbFN0cmVuZ3RoPzogbnVtYmVyO1xuICAgIGNvbG9ycz86IHN0cmluZ1tdO1xuICAgIHNpbWlsYXJpdHlTdHJlbmd0aD86IG51bWJlcjtcbiAgICBvdXRQYWludGluZ01vZGU/OiBcIkRFRkFVTFRcIiB8IFwiUFJFQ0lTRVwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VDb252ZXJzZU9wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1jb252ZXJzZVwiIHwgXCJiZWRyb2NrLWNsYXVkZVwiIHwgXCJiZWRyb2NrLW5vdmFcIiB8IFwiYmVkcm9jay1taXN0cmFsXCIgfCBcImJlZHJvY2stYWkyMVwiIHwgXCJiZWRyb2NrLWNvaGVyZS1jb21tYW5kXCIgfCBcImJlZHJvY2stcGFsbXlyYVwiO1xuICAgIG1heF90b2tlbnM/OiBudW1iZXI7XG4gICAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gICAgdG9wX3A/OiBudW1iZXI7XG4gICAgc3RvcF9zZXF1ZW5jZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJlZHJvY2tDbGF1ZGVPcHRpb25zIGV4dGVuZHMgQmFzZUNvbnZlcnNlT3B0aW9ucyB7XG4gICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLWNsYXVkZVwiO1xuICAgIHRvcF9rPzogbnVtYmVyO1xuICAgIHRoaW5raW5nX21vZGU/OiBib29sZWFuO1xuICAgIHRoaW5raW5nX2J1ZGdldF90b2tlbnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmVkcm9ja1BhbG15cmFPcHRpb25zIGV4dGVuZHMgQmFzZUNvbnZlcnNlT3B0aW9ucyB7XG4gICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLXBhbG15cmFcIjtcbiAgICBtaW5fdG9rZW5zPzogbnVtYmVyO1xuICAgIHNlZWQ/OiBudW1iZXI7XG4gICAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXI7XG4gICAgcHJlc2VuY2VfcGVuYWx0eT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFRva2Vuc0xpbWl0KG1vZGVsOiBzdHJpbmcsIG9wdGlvbj86IE1vZGVsT3B0aW9ucyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2xhdWRlIG1vZGVsc1xuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImNsYXVkZVwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCItNC1cIikpIHtcbiAgICAgICAgICAgIGlmKG1vZGVsLmluY2x1ZGVzKFwib3B1cy1cIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMzI3Njg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gNjU1MzY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCItMy03LVwiKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbiAmJiAob3B0aW9uIGFzIEJlZHJvY2tDbGF1ZGVPcHRpb25zKT8udGhpbmtpbmdfbW9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxMzEwNzI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiA4MTkyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiLTMtNS1cIikpIHtcbiAgICAgICAgICAgIHJldHVybiA4MTkyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDQwOTY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQW1hem9uIG1vZGVsc1xuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiYW1hem9uXCIpKSB7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcInRpdGFuXCIpKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJsaXRlXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQwOTY7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiZXhwcmVzc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA4MTkyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcInByZW1pZXJcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMzA3MjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwibm92YVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIDEwMDAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1pc3RyYWwgbW9kZWxzXG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJtaXN0cmFsXCIpKSB7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcIjh4N2JcIikpIHtcbiAgICAgICAgICAgIHJldHVybiA0MDk2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcInBpeHRyYWwtbGFyZ2VcIikpIHtcbiAgICAgICAgICAgIHJldHVybiAxMzEwNzI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDgxOTI7XG4gICAgfVxuICAgIC8vIEFJMjEgbW9kZWxzXG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJhaTIxXCIpKSB7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImoyXCIpKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJsYXJnZVwiKSB8fCBtb2RlbC5pbmNsdWRlcyhcIm1pZFwiKSB8fCBtb2RlbC5pbmNsdWRlcyhcInVsdHJhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDgxOTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMjA0ODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJqYW1iYVwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIDQwOTY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ29oZXJlIG1vZGVsc1xuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiY29oZXJlLmNvbW1hbmRcIikpIHtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiY29tbWFuZC1hXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gODE5MjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gNDA5NjsgICBcbiAgICB9XG4gICAgLy8gTWV0YSBtb2RlbHNcbiAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImxsYW1hXCIpKSB7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcIjMtNzBiXCIpIHx8IG1vZGVsLmluY2x1ZGVzKFwiMy04YlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwNDg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDgxOTI7XG4gICAgfVxuICAgIC8vV3JpdGVyIG1vZGVsc1xuICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwid3JpdGVyXCIpKSB7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcInBhbG15cmEteDVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiA4MTkyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwicGFsbXlyYS14NFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIDgxOTI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGZhbGxiYWNrXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJlZHJvY2tPcHRpb25zKG1vZGVsOiBzdHJpbmcsIG9wdGlvbj86IE1vZGVsT3B0aW9ucyk6IE1vZGVsT3B0aW9uc0luZm8ge1xuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImNhbnZhc1wiKSkge1xuICAgICAgICBjb25zdCB0YXNrVHlwZUxpc3Q6IE1vZGVsT3B0aW9uSW5mb0l0ZW0gPSB7XG4gICAgICAgICAgICBuYW1lOiBcInRhc2tUeXBlXCIsXG4gICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLmVudW0sXG4gICAgICAgICAgICBlbnVtOiB7XG4gICAgICAgICAgICAgICAgXCJUZXh0LVRvLUltYWdlXCI6IFwiVEVYVF9JTUFHRVwiLFxuICAgICAgICAgICAgICAgIFwiVGV4dC1Uby1JbWFnZS13aXRoLUltYWdlLUNvbmRpdGlvbmluZ1wiOiBcIlRFWFRfSU1BR0VfV0lUSF9JTUFHRV9DT05ESVRJT05JTkdcIixcbiAgICAgICAgICAgICAgICBcIkNvbG9yLUd1aWRlZC1HZW5lcmF0aW9uXCI6IFwiQ09MT1JfR1VJREVEX0dFTkVSQVRJT05cIixcbiAgICAgICAgICAgICAgICBcIkltYWdlLVZhcmlhdGlvblwiOiBcIklNQUdFX1ZBUklBVElPTlwiLFxuICAgICAgICAgICAgICAgIFwiSW5wYWludGluZ1wiOiBcIklOUEFJTlRJTkdcIixcbiAgICAgICAgICAgICAgICBcIk91dHBhaW50aW5nXCI6IFwiT1VUUEFJTlRJTkdcIixcbiAgICAgICAgICAgICAgICBcIkJhY2tncm91bmQtUmVtb3ZhbFwiOiBcIkJBQ0tHUk9VTkRfUkVNT1ZBTFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IFwiVEVYVF9JTUFHRVwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHR5cGUgb2YgdGFzayB0byBwZXJmb3JtXCIsXG4gICAgICAgICAgICByZWZyZXNoOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBvdGhlck9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogXCJ3aWR0aFwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMzIwLCBtYXg6IDQwOTYsIGRlZmF1bHQ6IDUxMiwgc3RlcDogMTYsIGludGVnZXI6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlRoZSB3aWR0aCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCIgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJoZWlnaHRcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDMyMCwgbWF4OiA0MDk2LCBkZWZhdWx0OiA1MTIsIHN0ZXA6IDE2LCBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgaGVpZ2h0IG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicXVhbGl0eVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUuZW51bSxcbiAgICAgICAgICAgICAgICBlbnVtOiB7IFwic3RhbmRhcmRcIjogXCJzdGFuZGFyZFwiLCBcInByZW1pdW1cIjogXCJwcmVtaXVtXCIgfSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBcInN0YW5kYXJkXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHF1YWxpdHkgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBuYW1lOiBcImNmZ1NjYWxlXCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAxLjEsIG1heDogMTAuMCwgZGVmYXVsdDogNi41LCBzdGVwOiAwLjEsIGludGVnZXI6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJUaGUgc2NhbGUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwic2VlZFwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiA4NTg5OTM0NTksIGRlZmF1bHQ6IDEyLCBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgc2VlZCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCIgfSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJudW1iZXJPZkltYWdlc1wiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiA1LCBkZWZhdWx0OiAxLCBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgbnVtYmVyIG9mIGltYWdlcyB0byBnZW5lcmF0ZVwiIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGRlcGVuZGVudE9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtdO1xuXG4gICAgICAgIHN3aXRjaCAoKG9wdGlvbiBhcyBOb3ZhQ2FudmFzT3B0aW9ucyk/LnRhc2tUeXBlID8/IFwiVEVYVF9JTUFHRVwiKSB7XG4gICAgICAgICAgICBjYXNlIFwiVEVYVF9JTUFHRV9XSVRIX0lNQUdFX0NPTkRJVElPTklOR1wiOlxuICAgICAgICAgICAgICAgIGRlcGVuZGVudE9wdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJjb250cm9sTW9kZVwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJDQU5OWV9FREdFXCI6IFwiQ0FOTllfRURHRVwiLCBcIlNFR01FTlRBVElPTlwiOiBcIlNFR01FTlRBVElPTlwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcIkNBTk5ZX0VER0VcIiwgZGVzY3JpcHRpb246IFwiVGhlIGNvbnRyb2wgbW9kZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiBcImNvbnRyb2xTdHJlbmd0aFwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiAxLCBkZWZhdWx0OiAwLjcsIGRlc2NyaXB0aW9uOiBcIlRoZSBjb250cm9sIHN0cmVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIiB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiQ09MT1JfR1VJREVEX0dFTkVSQVRJT05cIjpcbiAgICAgICAgICAgICAgICBkZXBlbmRlbnRPcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogXCJjb2xvcnNcIiwgdHlwZTogT3B0aW9uVHlwZS5zdHJpbmdfbGlzdCwgdmFsdWU6IFtdLCBkZXNjcmlwdGlvbjogXCJIZXhhZGVjaW1hbCBjb2xvciB2YWx1ZXMgdG8gZ3VpZGUgZ2VuZXJhdGlvblwiIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIklNQUdFX1ZBUklBVElPTlwiOlxuICAgICAgICAgICAgICAgIGRlcGVuZGVudE9wdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiBcInNpbWlsYXJpdHlTdHJlbmd0aFwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMC4yLCBtYXg6IDEsIGRlZmF1bHQ6IDAuNywgZGVzY3JpcHRpb246IFwiVGhlIHNpbWlsYXJpdHkgc3RyZW5ndGggb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIklOUEFJTlRJTkdcIjpcbiAgICAgICAgICAgICAgICAvL05vIGNoYW5nZXNcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPVVRQQUlOVElOR1wiOlxuICAgICAgICAgICAgICAgIGRlcGVuZGVudE9wdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJvdXRQYWludGluZ01vZGVcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiREVGQVVMVFwiOiBcIkRFRkFVTFRcIiwgXCJQUkVDSVNFXCI6IFwiUFJFQ0lTRVwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIiwgZGVzY3JpcHRpb246IFwiVGhlIG91dHBhaW50aW5nIG1vZGUgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkJBQ0tHUk9VTkRfUkVNT1ZBTFwiOlxuICAgICAgICAgICAgICAgIGRlcGVuZGVudE9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBvdGhlck9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stbm92YS1jYW52YXNcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICB0YXNrVHlwZUxpc3QsXG4gICAgICAgICAgICAgICAgLi4ub3RoZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIC4uLmRlcGVuZGVudE9wdGlvbnMsXG4gICAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWF4X3Rva2Vuc19saW1pdCA9IGdldE1heFRva2Vuc0xpbWl0KG1vZGVsLCBvcHRpb24pO1xuICAgICAgICAvL05vdCBjYW52YXMsIGkuZSBub3JtYWwgQVdTIGJlZHJvY2sgY29udmVyc2VcbiAgICAgICAgY29uc3QgYmFzZUNvbnZlcnNlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwibWF4X3Rva2Vuc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICAgICAgbWF4OiBtYXhfdG9rZW5zX2xpbWl0LFxuICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgc3RlcDogMjAwLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZ2VuZXJhdGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ0ZW1wZXJhdHVyZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICBtaW46IDAuMCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAwLjcsXG4gICAgICAgICAgICAgICAgc3RlcDogMC4xLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIHRlbXBlcmF0dXJlIGJpYXNlcyB0b3dhcmQgbGVzcyBsaWtlbHkgdG9rZW5zLCBtYWtpbmcgdGhlIG1vZGVsIG1vcmUgY3JlYXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInRvcF9wXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgICAgICAgc3RlcDogMC4xLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkxpbWl0cyB0b2tlbiBzYW1wbGluZyB0byB0aGUgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBvZiB0aGUgdG9wIHAgdG9rZW5zXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJzdG9wX3NlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5zdHJpbmdfbGlzdCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogW10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGdlbmVyYXRpb24gd2lsbCBoYWx0IGlmIG9uZSBvZiB0aGUgc3RvcCBzZXF1ZW5jZXMgaXMgb3V0cHV0XCJcbiAgICAgICAgICAgIH1dO1xuXG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImNsYXVkZVwiKSkge1xuICAgICAgICAgICAgY29uc3QgY2xhdWRlQ29udmVyc2VPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRvcF9rXCIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdGVwOiAxLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIHRvcCBrIHRva2Vuc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCItMy03LVwiKSB8fCBtb2RlbC5pbmNsdWRlcyhcIi00LVwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXVkZU1vZGVPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidGhpbmtpbmdfbW9kZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJJZiB0cnVlLCB1c2UgdGhlIGV4dGVuZGVkIHJlYXNvbmluZyBtb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXVkZVRoaW5raW5nT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gKG9wdGlvbiBhcyBCZWRyb2NrQ2xhdWRlT3B0aW9ucyk/LnRoaW5raW5nX21vZGUgPyBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidGhpbmtpbmdfYnVkZ2V0X3Rva2Vuc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAxMDI0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogNDAwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAxMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgdGFyZ2V0IG51bWJlciBvZiB0b2tlbnMgdG8gdXNlIGZvciByZWFzb25pbmcsIG5vdCBhIGhhcmQgbGltaXQuXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdIDogW107XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stY2xhdWRlXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmJhc2VDb252ZXJzZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jbGF1ZGVDb252ZXJzZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jbGF1ZGVNb2RlT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNsYXVkZVRoaW5raW5nT3B0aW9uc11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1jbGF1ZGVcIixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbLi4uYmFzZUNvbnZlcnNlT3B0aW9ucywgLi4uY2xhdWRlQ29udmVyc2VPcHRpb25zXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiYW1hem9uXCIpKSB7XG4gICAgICAgICAgICAvL1RpdGFuIG1vZGVscyBhbHNvIGV4aXN0cyBidXQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgYWRkaXRpb25hbCBvcHRpb25zXG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJub3ZhXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm92YUNvbnZlcnNlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRvcF9rXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkxpbWl0cyB0b2tlbiBzYW1wbGluZyB0byB0aGUgdG9wIGsgdG9rZW5zXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1ub3ZhXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsuLi5iYXNlQ29udmVyc2VPcHRpb25zLCAuLi5ub3ZhQ29udmVyc2VPcHRpb25zXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIm1pc3RyYWxcIikpIHtcbiAgICAgICAgICAgIC8vN2IgYW5kIDh4N2IgaW5zdHJ1Y3RcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcIjdiXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlzdHJhbENvbnZlcnNlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRvcF9rXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkxpbWl0cyB0b2tlbiBzYW1wbGluZyB0byB0aGUgdG9wIGsgdG9rZW5zXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1taXN0cmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsuLi5iYXNlQ29udmVyc2VPcHRpb25zLCAuLi5taXN0cmFsQ29udmVyc2VPcHRpb25zXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vT3RoZXIgbW9kZWxzIHN1Y2ggYXMgTWlzdHJhbCBTbWFsbCwgTGFyZ2UgYW5kIExhcmdlIDJcbiAgICAgICAgICAgIC8vU3VwcG9ydCBubyBhZGRpdGlvbmFsIG9wdGlvbnNcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImFpMjFcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGFpMjFDb252ZXJzZU9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwicHJlc2VuY2VfcGVuYWx0eVwiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogLTIsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMC4xLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBIGhpZ2hlciBwcmVzZW5jZSBwZW5hbHR5IGVuY291cmFnZXMgdGhlIG1vZGVsIHRvIHRhbGsgYWJvdXQgbmV3IHRvcGljc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZnJlcXVlbmN5X3BlbmFsdHlcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgZnJlcXVlbmN5IHBlbmFsdHkgZW5jb3VyYWdlcyB0aGUgbW9kZWwgdG8gdXNlIGxlc3MgY29tbW9uIHdvcmRzXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcImJlZHJvY2stYWkyMVwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsuLi5iYXNlQ29udmVyc2VPcHRpb25zLCAuLi5haTIxQ29udmVyc2VPcHRpb25zXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwiY29oZXJlLmNvbW1hbmRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvaGVyZUNvbW1hbmRPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRvcF9rXCIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzdGVwOiAxLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIHRvcCBrIHRva2Vuc1wiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJjb21tYW5kLXJcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2hlcmVDb21tYW5kUk9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJmcmVxdWVuY3lfcGVuYWx0eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAtMixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAwLjEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBIGhpZ2hlciBmcmVxdWVuY3kgcGVuYWx0eSBlbmNvdXJhZ2VzIHRoZSBtb2RlbCB0byB1c2UgbGVzcyBjb21tb24gd29yZHNcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInByZXNlbmNlX3BlbmFsdHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogLTIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogMC4xLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgcHJlc2VuY2UgcGVuYWx0eSBlbmNvdXJhZ2VzIHRoZSBtb2RlbCB0byB0YWxrIGFib3V0IG5ldyB0b3BpY3NcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLWNvaGVyZS1jb21tYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFsuLi5iYXNlQ29udmVyc2VPcHRpb25zLCAuLi5jb2hlcmVDb21tYW5kT3B0aW9ucywgLi4uY29oZXJlQ29tbWFuZFJPcHRpb25zXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIndyaXRlclwiKSkge1xuICAgICAgICAgICAgY29uc3QgcGFsbXlyYUNvbnZlcnNlT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJtaW5fdG9rZW5zXCIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYyxcbiAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IG1heF90b2tlbnNfbGltaXQsXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdGVwOiAxMDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwic2VlZFwiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlJhbmRvbSBzZWVkIGZvciBnZW5lcmF0aW9uXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJmcmVxdWVuY3lfcGVuYWx0eVwiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogLTIsXG4gICAgICAgICAgICAgICAgICAgIG1heDogMixcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogMCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMC4xLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJBIGhpZ2hlciBmcmVxdWVuY3kgcGVuYWx0eSBlbmNvdXJhZ2VzIHRoZSBtb2RlbCB0byB1c2UgbGVzcyBjb21tb24gd29yZHNcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInByZXNlbmNlX3BlbmFsdHlcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLFxuICAgICAgICAgICAgICAgICAgICBtaW46IC0yLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IDIsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IDAuMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgcHJlc2VuY2UgcGVuYWx0eSBlbmNvdXJhZ2VzIHRoZSBtb2RlbCB0byB0YWxrIGFib3V0IG5ldyB0b3BpY3NcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwiYmVkcm9jay1wYWxteXJhXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogWy4uLmJhc2VDb252ZXJzZU9wdGlvbnMsIC4uLnBhbG15cmFDb252ZXJzZU9wdGlvbnNdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL0ZhbGxiYWNrIHRvIGNvbnZlcnNlIHN0YW5kYXJkLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX29wdGlvbl9pZDogXCJiZWRyb2NrLWNvbnZlcnNlXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBiYXNlQ29udmVyc2VPcHRpb25zXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0ZXh0T3B0aW9uc0ZhbGxiYWNrO1xufSIsImltcG9ydCB7IE1vZGVsT3B0aW9uc0luZm8sIE9wdGlvblR5cGUsIFNoYXJlZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUZXh0RmFsbGJhY2tPcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcInRleHQtZmFsbGJhY2tcIjsgICAgLy9Gb3Igc3BlY2lmaWMgbW9kZWxzIHNob3VsZCBiZSBmb3JtYXQgYXMgXCJwcm92aWRlci1tb2RlbFwiXG4gICAgbWF4X3Rva2Vucz86IG51bWJlcjtcbiAgICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbiAgICB0b3BfcD86IG51bWJlcjtcbiAgICB0b3Bfaz86IG51bWJlcjtcbiAgICBwcmVzZW5jZV9wZW5hbHR5PzogbnVtYmVyO1xuICAgIGZyZXF1ZW5jeV9wZW5hbHR5PzogbnVtYmVyO1xuICAgIHN0b3Bfc2VxdWVuY2U/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRleHRPcHRpb25zRmFsbGJhY2s6IE1vZGVsT3B0aW9uc0luZm8gPSB7XG4gICAgX29wdGlvbl9pZDogXCJ0ZXh0LWZhbGxiYWNrXCIsXG4gICAgb3B0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLm1heF90b2tlbnMsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAxLFxuICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgc3RlcDogMjAwLCBkZXNjcmlwdGlvbjogXCJUaGUgbWF4aW11bSBudW1iZXIgb2YgdG9rZW5zIHRvIGdlbmVyYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy50ZW1wZXJhdHVyZSwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAuMCwgZGVmYXVsdDogMC43LFxuICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgdGVtcGVyYXR1cmUgYmlhc2VzIHRvd2FyZCBsZXNzIGxpa2VseSB0b2tlbnMsIG1ha2luZyB0aGUgbW9kZWwgbW9yZSBjcmVhdGl2ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMudG9wX3AsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLCBtYXg6IDEsXG4gICAgICAgICAgICBpbnRlZ2VyOiBmYWxzZSwgc3RlcDogMC4xLCBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgb2YgdGhlIHRvcCBwIHRva2Vuc1wiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMudG9wX2ssIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAxLFxuICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgc3RlcDogMSwgZGVzY3JpcHRpb246IFwiTGltaXRzIHRva2VuIHNhbXBsaW5nIHRvIHRoZSB0b3AgayB0b2tlbnNcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLnByZXNlbmNlX3BlbmFsdHksIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAtMi4wLCBtYXg6IDIuMCxcbiAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIlBlbmFsaXNlIHRva2VucyBpZiB0aGV5IGFwcGVhciBhdCBsZWFzdCBvbmNlIGluIHRoZSB0ZXh0XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5mcmVxdWVuY3lfcGVuYWx0eSwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IC0yLjAsIG1heDogMi4wLFxuICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiUGVuYWxpc2UgdG9rZW5zIGJhc2VkIG9uIHRoZWlyIGZyZXF1ZW5jeSBpbiB0aGUgdGV4dFwiXG4gICAgICAgIH0sXG4gICAgICAgIHsgbmFtZTogU2hhcmVkT3B0aW9ucy5zdG9wX3NlcXVlbmNlLCB0eXBlOiBPcHRpb25UeXBlLnN0cmluZ19saXN0LCB2YWx1ZTogW10sIGRlc2NyaXB0aW9uOiBcIlRoZSBnZW5lcmF0aW9uIHdpbGwgaGFsdCBpZiBvbmUgb2YgdGhlIHN0b3Agc2VxdWVuY2VzIGlzIG91dHB1dFwiIH0sXG4gICAgXVxufTtcbiIsImltcG9ydCB7IE1vZGVsT3B0aW9uc0luZm8sIE1vZGVsT3B0aW9uSW5mb0l0ZW0sIE1vZGVsT3B0aW9ucywgT3B0aW9uVHlwZSwgU2hhcmVkT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdGV4dE9wdGlvbnNGYWxsYmFjayB9IGZyb20gXCIuL2ZhbGxiYWNrLmpzXCI7XG5cbi8vIFVuaW9uIHR5cGUgb2YgYWxsIEJlZHJvY2sgb3B0aW9uc1xuZXhwb3J0IHR5cGUgR3JvcU9wdGlvbnMgPSBHcm9xRGVlcHNlZWtUaGlua2luZ09wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvcURlZXBzZWVrVGhpbmtpbmdPcHRpb25zIHtcbiAgICBfb3B0aW9uX2lkOiBcImdyb3EtZGVlcHNlZWstdGhpbmtpbmdcIixcbiAgICBtYXhfdG9rZW5zPzogbnVtYmVyLFxuICAgIHRlbXBlcmF0dXJlPzogbnVtYmVyLFxuICAgIHRvcF9wPzogbnVtYmVyLFxuICAgIHN0b3Bfc2VxdWVuY2U/OiBzdHJpbmdbXSxcbiAgICByZWFzb25pbmdfZm9ybWF0OiAncGFyc2VkJyB8ICdyYXcnIHwgJ2hpZGRlbicsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcm9xT3B0aW9ucyhtb2RlbDogc3RyaW5nLCBfb3B0aW9uPzogTW9kZWxPcHRpb25zKTogTW9kZWxPcHRpb25zSW5mbyB7XG4gICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiZGVlcHNlZWtcIikgJiYgbW9kZWwuaW5jbHVkZXMoXCJyMVwiKSkge1xuICAgICAgICBjb25zdCBjb21tb25PcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5tYXhfdG9rZW5zLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiAxMzEwNzIsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIG1heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byBnZW5lcmF0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLnRlbXBlcmF0dXJlLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMC4wLCBkZWZhdWx0OiAwLjcsIG1heDogMi4wLFxuICAgICAgICAgICAgICAgIGludGVnZXI6IGZhbHNlLCBzdGVwOiAwLjEsIGRlc2NyaXB0aW9uOiBcIkEgaGlnaGVyIHRlbXBlcmF0dXJlIGJpYXNlcyB0b3dhcmQgbGVzcyBsaWtlbHkgdG9rZW5zLCBtYWtpbmcgdGhlIG1vZGVsIG1vcmUgY3JlYXRpdmUuIEEgbG93ZXIgdGVtcGVyYXR1cmUgdGhhbiBvdGhlciBtb2RlbHMgaXMgcmVjb21tZW5kZWQgZm9yIGRlZXBzZWVrIFIxLCAwLjMtMC43IGFwcHJveGltYXRlbHkuXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFNoYXJlZE9wdGlvbnMudG9wX3AsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLCBtYXg6IDEsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiTGltaXRzIHRva2VuIHNhbXBsaW5nIHRvIHRoZSBjdW11bGF0aXZlIHByb2JhYmlsaXR5IG9mIHRoZSB0b3AgcCB0b2tlbnNcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5zdG9wX3NlcXVlbmNlLCB0eXBlOiBPcHRpb25UeXBlLnN0cmluZ19saXN0LCB2YWx1ZTogW10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGdlbmVyYXRpb24gd2lsbCBoYWx0IGlmIG9uZSBvZiB0aGUgc3RvcCBzZXF1ZW5jZXMgaXMgb3V0cHV0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicmVhc29uaW5nX2Zvcm1hdFwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJQYXJzZWRcIjogXCJwYXJzZWRcIiwgXCJSYXdcIjogXCJyYXdcIiwgXCJIaWRkZW5cIjogXCJoaWRkZW5cIiB9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwicGFyc2VkXCIsIGRlc2NyaXB0aW9uOiBcIkNvbnRyb2xzIGhvdyB0aGUgcmVhc29uaW5nIGlzIHJldHVybmVkLlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX29wdGlvbl9pZDogXCJncm9xLWRlZXBzZWVrLXRoaW5raW5nXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBjb21tb25PcHRpb25zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE9wdGlvbnNGYWxsYmFjaztcbn0iLCJpbXBvcnQgeyBNb2RlbE9wdGlvbnNJbmZvLCBNb2RlbE9wdGlvbkluZm9JdGVtLCBNb2RlbE9wdGlvbnMsIE9wdGlvblR5cGUsIFNoYXJlZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IHRleHRPcHRpb25zRmFsbGJhY2sgfSBmcm9tIFwiLi9mYWxsYmFjay5qc1wiO1xuXG4vLyBVbmlvbiB0eXBlIG9mIGFsbCBCZWRyb2NrIG9wdGlvbnNcbmV4cG9ydCB0eXBlIE9wZW5BaU9wdGlvbnMgPSBPcGVuQWlUaGlua2luZ09wdGlvbnMgfCBPcGVuQWlUZXh0T3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQWlUaGlua2luZ09wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwib3BlbmFpLXRoaW5raW5nXCIsXG4gICAgbWF4X3Rva2Vucz86IG51bWJlcixcbiAgICBzdG9wX3NlcXVlbmNlPzogc3RyaW5nW10sXG4gICAgcmVhc29uaW5nX2VmZm9ydD86IFwibG93XCIgfCBcIm1lZGl1bVwiIHwgXCJoaWdoXCIsXG4gICAgaW1hZ2VfZGV0YWlsPzogXCJsb3dcIiB8IFwiaGlnaFwiIHwgXCJhdXRvXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFpVGV4dE9wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwib3BlbmFpLXRleHRcIixcbiAgICBtYXhfdG9rZW5zPzogbnVtYmVyLFxuICAgIHRlbXBlcmF0dXJlPzogbnVtYmVyLFxuICAgIHRvcF9wPzogbnVtYmVyLFxuICAgIHByZXNlbmNlX3BlbmFsdHk/OiBudW1iZXIsXG4gICAgZnJlcXVlbmN5X3BlbmFsdHk/OiBudW1iZXIsXG4gICAgc3RvcF9zZXF1ZW5jZT86IHN0cmluZ1tdLFxuICAgIGltYWdlX2RldGFpbD86IFwibG93XCIgfCBcImhpZ2hcIiB8IFwiYXV0b1wiLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3BlbkFpT3B0aW9ucyhtb2RlbDogc3RyaW5nLCBfb3B0aW9uPzogTW9kZWxPcHRpb25zKTogTW9kZWxPcHRpb25zSW5mbyB7XG4gICAgY29uc3QgdmlzaW9uT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gaXNWaXNpb25Nb2RlbChtb2RlbCkgPyBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaW1hZ2VfZGV0YWlsXCIsIHR5cGU6IE9wdGlvblR5cGUuZW51bSwgZW51bTogeyBcIkxvd1wiOiBcImxvd1wiLCBcIkhpZ2hcIjogXCJoaWdoXCIsIFwiQXV0b1wiOiBcImF1dG9cIiB9LFxuICAgICAgICAgICAgZGVmYXVsdDogXCJhdXRvXCIsIGRlc2NyaXB0aW9uOiBcIkNvbnRyb2xzIGhvdyB0aGUgbW9kZWwgcHJvY2Vzc2VzIGFuIGlucHV0IGltYWdlLlwiXG4gICAgICAgIH0sXG4gICAgXSA6IFtdO1xuXG4gICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwibzFcIikgfHwgbW9kZWwuaW5jbHVkZXMoXCJvM1wiKSkge1xuICAgICAgICAvL0lzIHRoaW5raW5nIHRleHQgbW9kZWxcbiAgICAgICAgbGV0IG1heF90b2tlbnNfbGltaXQgPSA0MDk2O1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJvMVwiKSkge1xuICAgICAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwicHJldmlld1wiKSkge1xuICAgICAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSAzMjc2ODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1vZGVsLmluY2x1ZGVzKFwibWluaVwiKSkge1xuICAgICAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSA2NTUzNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSAxMDAwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJvM1wiKSkge1xuICAgICAgICAgICAgbWF4X3Rva2Vuc19saW1pdCA9IDEwMDAwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1vbk9wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLm1heF90b2tlbnMsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAxLCBtYXg6IG1heF90b2tlbnNfbGltaXQsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVGhlIG1heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byBnZW5lcmF0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLnN0b3Bfc2VxdWVuY2UsIHR5cGU6IE9wdGlvblR5cGUuc3RyaW5nX2xpc3QsIHZhbHVlOiBbXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgc3RvcCBzZXF1ZW5jZSBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbmluZ09wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IG1vZGVsLmluY2x1ZGVzKFwibzNcIikgfHwgaXNPMUZ1bGwobW9kZWwpID8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicmVhc29uaW5nX2VmZm9ydFwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJMb3dcIjogXCJsb3dcIiwgXCJNZWRpdW1cIjogXCJtZWRpdW1cIiwgXCJIaWdoXCI6IFwiaGlnaFwiIH0sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogXCJtZWRpdW1cIiwgZGVzY3JpcHRpb246IFwiSG93IG11Y2ggZWZmb3J0IHRoZSBtb2RlbCBzaG91bGQgcHV0IGludG8gcmVhc29uaW5nLCBsb3dlciB2YWx1ZXMgcmVzdWx0IGluIGZhc3RlciByZXNwb25zZXMgYW5kIGxlc3MgdG9rZW5zIHVzZWQuXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0gOiBbXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX29wdGlvbl9pZDogXCJvcGVuYWktdGhpbmtpbmdcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgIC4uLnJlYXNvbmluZ09wdGlvbnMsXG4gICAgICAgICAgICAgICAgLi4udmlzaW9uT3B0aW9ucyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1heF90b2tlbnNfbGltaXQgPSA0MDk2O1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJncHQtNG9cIikpIHtcbiAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSAxNjM4NDtcbiAgICAgICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcImdwdC00by0yMDI0LTA1LTEzXCIpIHx8IG1vZGVsLmluY2x1ZGVzKFwicmVhbHRpbWVcIikpIHtcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gNDA5NjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImdwdC00XCIpKSB7XG4gICAgICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJ0dXJib1wiKSkge1xuICAgICAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSA0MDk2O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zX2xpbWl0ID0gODE5MjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImdwdC0zLTVcIikpIHtcbiAgICAgICAgICAgIG1heF90b2tlbnNfbGltaXQgPSA0MDk2O1xuICAgICAgICB9XG5cbiAgICAgICAgLy9JcyBub24tdGhpbmtpbmcgdGV4dCBtb2RlbFxuICAgICAgICBjb25zdCBjb21tb25PcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5tYXhfdG9rZW5zLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiBtYXhfdG9rZW5zX2xpbWl0LFxuICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsIHN0ZXA6IDIwMCwgZGVzY3JpcHRpb246IFwiVGhlIG1heGltdW0gbnVtYmVyIG9mIHRva2VucyB0byBnZW5lcmF0ZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcInRlbXBlcmF0dXJlXCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLjAsIG1heDogMi4wLCBkZWZhdWx0OiAwLjcsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiQSBoaWdoZXIgdGVtcGVyYXR1cmUgYmlhc2VzIHRvd2FyZCBsZXNzIGxpa2VseSB0b2tlbnMsIG1ha2luZyB0aGUgbW9kZWwgbW9yZSBjcmVhdGl2ZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwidG9wX3BcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAsIG1heDogMSxcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiBmYWxzZSwgc3RlcDogMC4xLCBkZXNjcmlwdGlvbjogXCJMaW1pdHMgdG9rZW4gc2FtcGxpbmcgdG8gdGhlIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgb2YgdGhlIHRvcCBwIHRva2Vuc1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwicHJlc2VuY2VfcGVuYWx0eVwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogLTIuMCwgbWF4OiAyLjAsXG4gICAgICAgICAgICAgICAgaW50ZWdlcjogZmFsc2UsIHN0ZXA6IDAuMSwgZGVzY3JpcHRpb246IFwiUGVuYWxpc2UgdG9rZW5zIGlmIHRoZXkgYXBwZWFyIGF0IGxlYXN0IG9uY2UgaW4gdGhlIHRleHRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImZyZXF1ZW5jeV9wZW5hbHR5XCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAtMi4wLCBtYXg6IDIuMCxcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiBmYWxzZSwgc3RlcDogMC4xLCBkZXNjcmlwdGlvbjogXCJQZW5hbGlzZSB0b2tlbnMgYmFzZWQgb24gdGhlaXIgZnJlcXVlbmN5IGluIHRoZSB0ZXh0XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5zdG9wX3NlcXVlbmNlLCB0eXBlOiBPcHRpb25UeXBlLnN0cmluZ19saXN0LCB2YWx1ZTogW10sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGdlbmVyYXRpb24gd2lsbCBoYWx0IGlmIG9uZSBvZiB0aGUgc3RvcCBzZXF1ZW5jZXMgaXMgb3V0cHV0XCIsXG4gICAgICAgICAgICB9XG4gICAgICAgIF1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgX29wdGlvbl9pZDogXCJvcGVuYWktdGV4dFwiLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgLi4udmlzaW9uT3B0aW9ucyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHRPcHRpb25zRmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGlzTzFGdWxsKG1vZGVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJvMVwiKSkge1xuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJtaW5pXCIpIHx8IG1vZGVsLmluY2x1ZGVzKFwicHJldmlld1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzVmlzaW9uTW9kZWwobW9kZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtb2RlbC5pbmNsdWRlcyhcImdwdC00b1wiKSB8fCBpc08xRnVsbChtb2RlbCkgfHwgbW9kZWwuaW5jbHVkZXMoXCJncHQtNC10dXJib1wiKTtcbn0iLCJpbXBvcnQgeyBNb2RlbE9wdGlvbnNJbmZvLCBNb2RlbE9wdGlvbkluZm9JdGVtLCBPcHRpb25UeXBlLCBTaGFyZWRPcHRpb25zLCBNb2RlbE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMuanNcIjtcbmltcG9ydCB7IHRleHRPcHRpb25zRmFsbGJhY2sgfSBmcm9tIFwiLi9mYWxsYmFjay5qc1wiO1xuXG4vLyBVbmlvbiB0eXBlIG9mIGFsbCBCZWRyb2NrIG9wdGlvbnNcbmV4cG9ydCB0eXBlIFZlcnRleEFJT3B0aW9ucyA9IEltYWdlbk9wdGlvbnMgfCBWZXJ0ZXhBSUNsYXVkZU9wdGlvbnM7XG5cbmV4cG9ydCBlbnVtIEltYWdlblRhc2tUeXBlIHtcbiAgICBURVhUX0lNQUdFID0gXCJURVhUX0lNQUdFXCIsXG4gICAgRURJVF9NT0RFX0lOUEFJTlRfUkVNT1ZBTCA9IFwiRURJVF9NT0RFX0lOUEFJTlRfUkVNT1ZBTFwiLFxuICAgIEVESVRfTU9ERV9JTlBBSU5UX0lOU0VSVElPTiA9IFwiRURJVF9NT0RFX0lOUEFJTlRfSU5TRVJUSU9OXCIsXG4gICAgRURJVF9NT0RFX0JHU1dBUCA9IFwiRURJVF9NT0RFX0JHU1dBUFwiLFxuICAgIEVESVRfTU9ERV9PVVRQQUlOVCA9IFwiRURJVF9NT0RFX09VVFBBSU5UXCIsXG4gICAgQ1VTVE9NSVpBVElPTl9TVUJKRUNUID0gXCJDVVNUT01JWkFUSU9OX1NVQkpFQ1RcIixcbiAgICBDVVNUT01JWkFUSU9OX1NUWUxFID0gXCJDVVNUT01JWkFUSU9OX1NUWUxFXCIsXG4gICAgQ1VTVE9NSVpBVElPTl9DT05UUk9MTEVEID0gXCJDVVNUT01JWkFUSU9OX0NPTlRST0xMRURcIixcbiAgICBDVVNUT01JWkFUSU9OX0lOU1RSVUNUID0gXCJDVVNUT01JWkFUSU9OX0lOU1RSVUNUXCIsXG59XG5cbmV4cG9ydCBlbnVtIEltYWdlbk1hc2tNb2RlIHtcbiAgICBNQVNLX01PREVfVVNFUl9QUk9WSURFRCA9IFwiTUFTS19NT0RFX1VTRVJfUFJPVklERURcIixcbiAgICBNQVNLX01PREVfQkFDS0dST1VORCA9IFwiTUFTS19NT0RFX0JBQ0tHUk9VTkRcIixcbiAgICBNQVNLX01PREVfRk9SRUdST1VORCA9IFwiTUFTS19NT0RFX0ZPUkVHUk9VTkRcIixcbiAgICBNQVNLX01PREVfU0VNQU5USUMgPSBcIk1BU0tfTU9ERV9TRU1BTlRJQ1wiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlbk9wdGlvbnMge1xuICAgIF9vcHRpb25faWQ6IFwidmVydGV4YWktaW1hZ2VuXCJcblxuICAgIC8vR2VuZXJhbCBhbmQgZ2VuZXJhdGUgb3B0aW9uc1xuICAgIG51bWJlcl9vZl9pbWFnZXM/OiBudW1iZXI7XG4gICAgc2VlZD86IG51bWJlcjtcbiAgICBwZXJzb25fZ2VuZXJhdGlvbj86IFwiZG9udF9hbGxvd1wiIHwgXCJhbGxvd19hZHVsdHNcIiB8IFwiYWxsb3dfYWxsXCI7XG4gICAgc2FmZXR5X3NldHRpbmc/OiBcImJsb2NrX25vbmVcIiB8IFwiYmxvY2tfb25seV9oaWdoXCIgfCBcImJsb2NrX21lZGl1bV9hbmRfYWJvdmVcIiB8IFwiYmxvY2tfbG93X2FuZF9hYm92ZVwiOyAvL1RoZSBcIm9mZlwiIG9wdGlvbiBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgZm9yIEltYWdlbiAzLCBtaWdodCBiZSBvbmx5IGZvciB0ZXh0IG1vZGVsc1xuICAgIGltYWdlX2ZpbGVfdHlwZT86IFwiaW1hZ2UvanBlZ1wiIHwgXCJpbWFnZS9wbmdcIjtcbiAgICBqcGVnX2NvbXByZXNzaW9uX3F1YWxpdHk/OiBudW1iZXI7XG4gICAgYXNwZWN0X3JhdGlvPzogXCIxOjFcIiB8IFwiNDozXCIgfCBcIjM6NFwiIHwgXCIxNjo5XCIgfCBcIjk6MTZcIjtcbiAgICBhZGRfd2F0ZXJtYXJrPzogYm9vbGVhbjtcbiAgICBlbmhhbmNlX3Byb21wdD86IGJvb2xlYW47XG5cbiAgICAvL0NhcGFiaWxpdHkgb3B0aW9uc1xuICAgIGVkaXRfbW9kZT86IEltYWdlblRhc2tUeXBlXG4gICAgZ3VpZGFuY2Vfc2NhbGU/OiBudW1iZXI7XG4gICAgZWRpdF9zdGVwcz86IG51bWJlcjtcbiAgICBtYXNrX21vZGU/OiBJbWFnZW5NYXNrTW9kZTtcbiAgICBtYXNrX2RpbGF0aW9uPzogbnVtYmVyO1xuICAgIG1hc2tfY2xhc3M/OiBudW1iZXJbXTtcblxuICAgIC8vQ3VzdG9taXphdGlvbiBvcHRpb25zXG4gICAgY29udHJvbFR5cGU6IFwiQ09OVFJPTF9UWVBFX0ZBQ0VfTUVTSFwiIHwgXCJDT05UUk9MX1RZUEVfQ0FOTllcIiB8IFwiQ09OVFJPTF9UWVBFX1NDUklCQkxFXCI7XG4gICAgY29udHJvbEltYWdlQ29tcHV0YXRpb24/OiBib29sZWFuO1xuICAgIHN1YmplY3RUeXBlOiBcIlNVQkpFQ1RfVFlQRV9QRVJTT05cIiB8IFwiU1VCSkVDVF9UWVBFX0FOSU1BTFwiIHwgXCJTVUJKRUNUX1RZUEVfUFJPRFVDVFwiIHwgXCJTVUJKRUNUX1RZUEVfREVGQVVMVFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcnRleEFJQ2xhdWRlT3B0aW9ucyB7XG4gICAgX29wdGlvbl9pZDogXCJ2ZXJ0ZXhhaS1jbGF1ZGVcIlxuICAgIG1heF90b2tlbnM/OiBudW1iZXI7XG4gICAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gICAgdG9wX3A/OiBudW1iZXI7XG4gICAgdG9wX2s/OiBudW1iZXI7XG4gICAgc3RvcF9zZXF1ZW5jZT86IHN0cmluZ1tdO1xuICAgIHRoaW5raW5nX21vZGU/OiBib29sZWFuO1xuICAgIHRoaW5raW5nX2J1ZGdldF90b2tlbnM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJ0ZXhBaU9wdGlvbnMobW9kZWw6IHN0cmluZywgb3B0aW9uPzogTW9kZWxPcHRpb25zKTogTW9kZWxPcHRpb25zSW5mbyB7XG4gICAgaWYgKG1vZGVsLmluY2x1ZGVzKFwiaW1hZ2VuLTMuMFwiKSkge1xuICAgICAgICBjb25zdCBjb21tb25PcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5udW1iZXJfb2ZfaW1hZ2VzLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMSwgbWF4OiA0LCBkZWZhdWx0OiAxLFxuICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsIGRlc2NyaXB0aW9uOiBcIk51bWJlciBvZiBJbWFnZXMgdG8gZ2VuZXJhdGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogU2hhcmVkT3B0aW9ucy5zZWVkLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiA0Mjk0OTY3Mjk1LCBkZWZhdWx0OiAxMixcbiAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgc2VlZCBvZiB0aGUgZ2VuZXJhdGVkIGltYWdlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJwZXJzb25fZ2VuZXJhdGlvblwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJEaXNhbGxvdyB0aGUgaW5jbHVzaW9uIG9mIHBlb3BsZSBvciBmYWNlcyBpbiBpbWFnZXNcIjogXCJkb250X2FsbG93XCIsIFwiQWxsb3cgZ2VuZXJhdGlvbiBvZiBhZHVsdHMgb25seVwiOiBcImFsbG93X2FkdWx0XCIsIFwiQWxsb3cgZ2VuZXJhdGlvbiBvZiBwZW9wbGUgb2YgYWxsIGFnZXNcIjogXCJhbGxvd19hbGxcIiB9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwiYWxsb3dfYWR1bHRcIiwgZGVzY3JpcHRpb246IFwiVGhlIHNhZmV0eSBzZXR0aW5nIGZvciBhbGxvd2luZyB0aGUgZ2VuZXJhdGlvbiBvZiBwZW9wbGUgaW4gdGhlIGltYWdlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJzYWZldHlfc2V0dGluZ1wiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJCbG9jayB2ZXJ5IGZldyBwcm9ibGVtYXRpYyBwcm9tcHRzIGFuZCByZXNwb25zZXNcIjogXCJibG9ja19ub25lXCIsIFwiQmxvY2sgb25seSBmZXcgcHJvYmxlbWF0aWMgcHJvbXB0cyBhbmQgcmVzcG9uc2VzXCI6IFwiYmxvY2tfb25seV9oaWdoXCIsIFwiQmxvY2sgc29tZSBwcm9ibGVtYXRpYyBwcm9tcHRzIGFuZCByZXNwb25zZXNcIjogXCJibG9ja19tZWRpdW1fYW5kX2Fib3ZlXCIsIFwiU3RyaWN0ZXN0IGZpbHRlcmluZ1wiOiBcImJsb2NrX2xvd19hbmRfYWJvdmVcIiB9LFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwiYmxvY2tfbWVkaXVtX2FuZF9hYm92ZVwiLCBkZXNjcmlwdGlvbjogXCJUaGUgb3ZlcmFsbCBzYWZldHkgc2V0dGluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG5cbiAgICAgICAgY29uc3Qgb3V0cHV0T3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiaW1hZ2VfZmlsZV90eXBlXCIsIHR5cGU6IE9wdGlvblR5cGUuZW51bSwgZW51bTogeyBcIkpQRUdcIjogXCJpbWFnZS9qcGVnXCIsIFwiUE5HXCI6IFwiaW1hZ2UvcG5nXCIgfSxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBcImltYWdlL3BuZ1wiLCBkZXNjcmlwdGlvbjogXCJUaGUgZmlsZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIixcbiAgICAgICAgICAgICAgICByZWZyZXNoOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXVxuXG4gICAgICAgIGNvbnN0IGpwZWdRdWFsaXR5OiBNb2RlbE9wdGlvbkluZm9JdGVtID0ge1xuICAgICAgICAgICAgbmFtZTogXCJqcGVnX2NvbXByZXNzaW9uX3F1YWxpdHlcIiwgdHlwZTogT3B0aW9uVHlwZS5udW1lcmljLCBtaW46IDAsIG1heDogMTAwLCBkZWZhdWx0OiA3NSxcbiAgICAgICAgICAgIGludGVnZXI6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlRoZSBjb21wcmVzc2lvbiBxdWFsaXR5IG9mIHRoZSBKUEVHIGltYWdlXCIsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG9wdGlvbiBhcyBJbWFnZW5PcHRpb25zKT8uaW1hZ2VfZmlsZV90eXBlID09PSBcImltYWdlL2pwZWdcIikge1xuICAgICAgICAgICAgb3V0cHV0T3B0aW9ucy5wdXNoKGpwZWdRdWFsaXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJnZW5lcmF0ZVwiKSkge1xuICAgICAgICAgICAgLy9HZW5lcmF0ZSBtb2RlbHNcbiAgICAgICAgICAgIGNvbnN0IG1vZGVPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW11cbiAgICAgICAgICAgICAgICA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJhc3BlY3RfcmF0aW9cIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLCBlbnVtOiB7IFwiMToxXCI6IFwiMToxXCIsIFwiNDozXCI6IFwiNDozXCIsIFwiMzo0XCI6IFwiMzo0XCIsIFwiMTY6OVwiOiBcIjE2OjlcIiwgXCI5OjE2XCI6IFwiOToxNlwiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcIjE6MVwiLCBkZXNjcmlwdGlvbjogXCJUaGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImFkZF93YXRlcm1hcmtcIiwgdHlwZTogT3B0aW9uVHlwZS5ib29sZWFuLCBkZWZhdWx0OiBmYWxzZSwgZGVzY3JpcHRpb246IFwiQWRkIGFuIGludmlzaWJsZSB3YXRlcm1hcmsgdG8gdGhlIGdlbmVyYXRlZCBpbWFnZSwgdXNlZnVsIGZvciBkZXRlY3Rpb24gb2YgQUkgaW1hZ2VzXCJcbiAgICAgICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGNvbnN0IGVuaGFuY2VPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSAhbW9kZWwuaW5jbHVkZXMoXCJnZW5lcmF0ZS0wMDFcIikgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImVuaGFuY2VfcHJvbXB0XCIsIHR5cGU6IE9wdGlvblR5cGUuYm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSwgZGVzY3JpcHRpb246IFwiVmVydGV4QUkgYXV0b21hdGljYWxseSByZXdyaXRlcyB0aGUgcHJvbXB0IHRvIGJldHRlciByZWZsZWN0IHRoZSBwcm9tcHQncyBpbnRlbnQuXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSA6IFtdO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwidmVydGV4YWktaW1hZ2VuXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5tb2RlT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4ub3V0cHV0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4uZW5oYW5jZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJjYXBhYmlsaXR5XCIpKSB7XG4gICAgICAgICAgICAvL0VkaXQgbW9kZWxzXG4gICAgICAgICAgICBsZXQgZ3VpZGFuY2VTY2FsZURlZmF1bHQgPSA3NTtcbiAgICAgICAgICAgIGlmICgob3B0aW9uIGFzIEltYWdlbk9wdGlvbnMpPy5lZGl0X21vZGUgPT09IEltYWdlblRhc2tUeXBlLkVESVRfTU9ERV9JTlBBSU5UX0lOU0VSVElPTikge1xuICAgICAgICAgICAgICAgIGd1aWRhbmNlU2NhbGVEZWZhdWx0ID0gNjA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1vZGVPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcImVkaXRfbW9kZVwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sXG4gICAgICAgICAgICAgICAgICAgIGVudW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRURJVF9NT0RFX0lOUEFJTlRfUkVNT1ZBTFwiOiBcIkVESVRfTU9ERV9JTlBBSU5UX1JFTU9WQUxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRURJVF9NT0RFX0lOUEFJTlRfSU5TRVJUSU9OXCI6IFwiRURJVF9NT0RFX0lOUEFJTlRfSU5TRVJUSU9OXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVESVRfTU9ERV9CR1NXQVBcIjogXCJFRElUX01PREVfQkdTV0FQXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkVESVRfTU9ERV9PVVRQQUlOVFwiOiBcIkVESVRfTU9ERV9PVVRQQUlOVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDVVNUT01JWkFUSU9OX1NVQkpFQ1RcIjogXCJDVVNUT01JWkFUSU9OX1NVQkpFQ1RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ1VTVE9NSVpBVElPTl9TVFlMRVwiOiBcIkNVU1RPTUlaQVRJT05fU1RZTEVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ1VTVE9NSVpBVElPTl9DT05UUk9MTEVEXCI6IFwiQ1VTVE9NSVpBVElPTl9DT05UUk9MTEVEXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNVU1RPTUlaQVRJT05fSU5TVFJVQ1RcIjogXCJDVVNUT01JWkFUSU9OX0lOU1RSVUNUXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBlZGl0aW5nIG1vZGUuIENVU1RPTUlaQVRJT04gb3B0aW9ucyB1c2UgZmV3LXNob3QgbGVhcm5pbmcgdG8gZ2VuZXJhdGUgaW1hZ2VzIGJhc2VkIG9uIGEgZmV3IGV4YW1wbGVzLlwiXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJndWlkYW5jZV9zY2FsZVwiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIG1pbjogMCwgbWF4OiA1MDAsIGRlZmF1bHQ6IGd1aWRhbmNlU2NhbGVEZWZhdWx0LFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJIb3cgY2xvc2VseSB0aGUgZ2VuZXJhdGlvbiBmb2xsb3dzIHRoZSBwcm9tcHRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGNvbnN0IG1hc2tPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSAoKG9wdGlvbiBhcyBJbWFnZW5PcHRpb25zKT8uZWRpdF9tb2RlPy5pbmNsdWRlcyhcIkVESVRcIikpID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJtYXNrX21vZGVcIiwgdHlwZTogT3B0aW9uVHlwZS5lbnVtLFxuICAgICAgICAgICAgICAgICAgICBlbnVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BU0tfTU9ERV9VU0VSX1BST1ZJREVEXCI6IFwiTUFTS19NT0RFX1VTRVJfUFJPVklERURcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTUFTS19NT0RFX0JBQ0tHUk9VTkRcIjogXCJNQVNLX01PREVfQkFDS0dST1VORFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJNQVNLX01PREVfRk9SRUdST1VORFwiOiBcIk1BU0tfTU9ERV9GT1JFR1JPVU5EXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BU0tfTU9ERV9TRU1BTlRJQ1wiOiBcIk1BU0tfTU9ERV9TRU1BTlRJQ1wiLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcIk1BU0tfTU9ERV9VU0VSX1BST1ZJREVEXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkhvdyBzaG91bGQgdGhlIG1hc2sgZm9yIHRoZSBnZW5lcmF0aW9uIGJlIHByb3ZpZGVkXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJtYXNrX2RpbGF0aW9uXCIsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAwLCBtYXg6IDEsXG4gICAgICAgICAgICAgICAgICAgIGludGVnZXI6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXNrIGRpbGF0aW9uLCBncm93cyB0aGUgbWFzayBieSBhIHBlcmNlbnRhZ2Ugb2YgaW1hZ2Ugd2lkdGggdG8gY29tcGVuc2F0ZSBmb3IgaW1wcmVjaXNlIG1hc2tzLlwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0gOiBbXTtcblxuICAgICAgICAgICAgY29uc3QgbWFza0NsYXNzT3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdID0gKChvcHRpb24gYXMgSW1hZ2VuT3B0aW9ucyk/Lm1hc2tfbW9kZSA9PT0gSW1hZ2VuTWFza01vZGUuTUFTS19NT0RFX1NFTUFOVElDKSA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwibWFza19jbGFzc1wiLCB0eXBlOiBPcHRpb25UeXBlLnN0cmluZ19saXN0LCBkZWZhdWx0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiSW5wdXQgQ2xhc3MgSURzLiBDcmVhdGUgYSBtYXNrIGJhc2VkIG9uIGltYWdlIGNsYXNzLCBiYXNlZCBvbiBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vdmVydGV4LWFpL2dlbmVyYXRpdmUtYWkvZG9jcy9tb2RlbC1yZWZlcmVuY2UvaW1hZ2VuLWFwaS1jdXN0b21pemF0aW9uI3NlZ21lbnQtaWRzXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdIDogW107XG5cbiAgICAgICAgICAgIGNvbnN0IGVkaXRPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSAob3B0aW9uIGFzIEltYWdlbk9wdGlvbnMpPy5lZGl0X21vZGU/LmluY2x1ZGVzKFwiRURJVFwiKSA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiZWRpdF9zdGVwc1wiLCB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsIGRlZmF1bHQ6IDc1LFxuICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBkZXNjcmlwdGlvbjogXCJUaGUgbnVtYmVyIG9mIHN0ZXBzIGZvciB0aGUgYmFzZSBpbWFnZSBnZW5lcmF0aW9uLCBtb3JlIHN0ZXBzIG1lYW5zIG1vcmUgdGltZSBhbmQgYmV0dGVyIHF1YWxpdHlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdIDogW107XG5cbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbWl6YXRpb25PcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSAob3B0aW9uIGFzIEltYWdlbk9wdGlvbnMpPy5lZGl0X21vZGUgPT09IEltYWdlblRhc2tUeXBlLkNVU1RPTUlaQVRJT05fQ09OVFJPTExFRFxuICAgICAgICAgICAgICAgIHx8IChvcHRpb24gYXMgSW1hZ2VuT3B0aW9ucyk/LmVkaXRfbW9kZSA9PT0gSW1hZ2VuVGFza1R5cGUuQ1VTVE9NSVpBVElPTl9TVUJKRUNUID8gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJjb250cm9sVHlwZVwiLCB0eXBlOiBPcHRpb25UeXBlLmVudW0sIGVudW06IHsgXCJGYWNlIE1lc2hcIjogXCJDT05UUk9MX1RZUEVfRkFDRV9NRVNIXCIsIFwiQ2FubnlcIjogXCJDT05UUk9MX1RZUEVfQ0FOTllcIiwgXCJTY3JpYmJsZVwiOiBcIkNPTlRST0xfVFlQRV9TQ1JJQkJMRVwiIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwiQ09OVFJPTF9UWVBFX0NBTk5ZXCIsIGRlc2NyaXB0aW9uOiBcIk1ldGhvZCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb250cm9sIGltYWdlXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJjb250cm9sSW1hZ2VDb21wdXRhdGlvblwiLCB0eXBlOiBPcHRpb25UeXBlLmJvb2xlYW4sIGRlZmF1bHQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcIlNob3VsZCB0aGUgY29udHJvbCBpbWFnZSBiZSBjb21wdXRlZCBmcm9tIHRoZSBpbnB1dCBpbWFnZSwgb3IgaXMgaXQgcHJvdmlkZWRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0gOiBbXTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9uX2lkOiBcInZlcnRleGFpLWltYWdlblwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgLi4ubW9kZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbW1vbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLm1hc2tPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5tYXNrQ2xhc3NPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5lZGl0T3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4uY3VzdG9taXphdGlvbk9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLm91dHB1dE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcImdlbWluaVwiKSkge1xuICAgICAgICBjb25zdCBtYXhfdG9rZW5zX2xpbWl0ID0gZ2V0R2VtaW5pTWF4VG9rZW5zTGltaXQobW9kZWwpO1xuICAgICAgICBjb25zdCBleGNsdWRlT3B0aW9ucyA9IFtcIm1heF90b2tlbnNcIiwgXCJwcmVzZW5jZV9wZW5hbHR5XCJdO1xuICAgICAgICBsZXQgY29tbW9uT3B0aW9ucyA9IHRleHRPcHRpb25zRmFsbGJhY2sub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIWV4Y2x1ZGVPcHRpb25zLmluY2x1ZGVzKG9wdGlvbi5uYW1lKSk7XG4gICAgICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcIjEuNVwiKSkge1xuICAgICAgICAgICAgY29tbW9uT3B0aW9ucyA9IGNvbW1vbk9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5uYW1lICE9PSBcImZyZXF1ZW5jeV9wZW5hbHR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heF90b2tlbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFt7XG4gICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLm1heF90b2tlbnMsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAxLCBtYXg6IG1heF90b2tlbnNfbGltaXQsXG4gICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBzdGVwOiAyMDAsIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZ2VuZXJhdGVcIlxuICAgICAgICB9XTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9vcHRpb25faWQ6IFwidGV4dC1mYWxsYmFja1wiLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIC4uLm1heF90b2tlbnMsXG4gICAgICAgICAgICAgICAgLi4uY29tbW9uT3B0aW9ucyxcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCJjbGF1ZGVcIikpIHtcbiAgICAgICAgY29uc3QgbWF4X3Rva2Vuc19saW1pdCA9IGdldENsYXVkZU1heFRva2Vuc0xpbWl0KG1vZGVsLCBvcHRpb24gYXMgVmVydGV4QUlDbGF1ZGVPcHRpb25zKTtcbiAgICAgICAgY29uc3QgZXhjbHVkZU9wdGlvbnMgPSBbXCJtYXhfdG9rZW5zXCIsIFwicHJlc2VuY2VfcGVuYWx0eVwiLCBcImZyZXF1ZW5jeV9wZW5hbHR5XCJdO1xuICAgICAgICBsZXQgY29tbW9uT3B0aW9ucyA9IHRleHRPcHRpb25zRmFsbGJhY2sub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIWV4Y2x1ZGVPcHRpb25zLmluY2x1ZGVzKG9wdGlvbi5uYW1lKSk7XG4gICAgICAgIGNvbnN0IG1heF90b2tlbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IFt7XG4gICAgICAgICAgICBuYW1lOiBTaGFyZWRPcHRpb25zLm1heF90b2tlbnMsIHR5cGU6IE9wdGlvblR5cGUubnVtZXJpYywgbWluOiAxLCBtYXg6IG1heF90b2tlbnNfbGltaXQsXG4gICAgICAgICAgICBpbnRlZ2VyOiB0cnVlLCBzdGVwOiAyMDAsIGRlc2NyaXB0aW9uOiBcIlRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdG8gZ2VuZXJhdGVcIlxuICAgICAgICB9XTtcblxuICAgICAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCItMy03XCIpIHx8IG1vZGVsLmluY2x1ZGVzKFwiLTRcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsYXVkZU1vZGVPcHRpb25zOiBNb2RlbE9wdGlvbkluZm9JdGVtW10gPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcInRoaW5raW5nX21vZGVcIixcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogT3B0aW9uVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiSWYgdHJ1ZSwgdXNlIHRoZSBleHRlbmRlZCByZWFzb25pbmcgbW9kZVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjb25zdCBjbGF1ZGVUaGlua2luZ09wdGlvbnM6IE1vZGVsT3B0aW9uSW5mb0l0ZW1bXSA9IChvcHRpb24gYXMgVmVydGV4QUlDbGF1ZGVPcHRpb25zKT8udGhpbmtpbmdfbW9kZSA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwidGhpbmtpbmdfYnVkZ2V0X3Rva2Vuc1wiLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogMTAyNCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogNDAwMCxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RlcDogMTAwLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgdGFyZ2V0IG51bWJlciBvZiB0b2tlbnMgdG8gdXNlIGZvciByZWFzb25pbmcsIG5vdCBhIGhhcmQgbGltaXQuXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSA6IFtdO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9vcHRpb25faWQ6IFwidmVydGV4YWktY2xhdWRlXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAuLi5tYXhfdG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5jbGF1ZGVNb2RlT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgLi4uY2xhdWRlVGhpbmtpbmdPcHRpb25zLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9vcHRpb25faWQ6IFwidmVydGV4YWktY2xhdWRlXCIsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgLi4ubWF4X3Rva2VucyxcbiAgICAgICAgICAgICAgICAuLi5jb21tb25PcHRpb25zLFxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGV4dE9wdGlvbnNGYWxsYmFjaztcbn1cbmZ1bmN0aW9uIGdldEdlbWluaU1heFRva2Vuc0xpbWl0KG1vZGVsOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcInRoaW5raW5nXCIpIHx8IG1vZGVsLmluY2x1ZGVzKFwiLTIuNS1cIikpIHtcbiAgICAgICAgcmV0dXJuIDY1NTM2O1xuICAgIH1cbiAgICBpZiAobW9kZWwuaW5jbHVkZXMoXCJ1bHRyYVwiKSB8fCBtb2RlbC5pbmNsdWRlcyhcInZpc2lvblwiKSkge1xuICAgICAgICByZXR1cm4gMjA0ODtcbiAgICB9XG4gICAgcmV0dXJuIDgxOTI7XG59XG5mdW5jdGlvbiBnZXRDbGF1ZGVNYXhUb2tlbnNMaW1pdChtb2RlbDogc3RyaW5nLCBvcHRpb24/OiBWZXJ0ZXhBSUNsYXVkZU9wdGlvbnMpOiBudW1iZXIge1xuICAgIGlmIChtb2RlbC5pbmNsdWRlcyhcIi00LVwiKSkge1xuICAgICAgICBpZihtb2RlbC5pbmNsdWRlcyhcIm9wdXMtXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gMzI3Njg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDY1NTM2O1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcyhcIi0zLTctXCIpKSB7XG4gICAgICAgIGlmIChvcHRpb24gJiYgb3B0aW9uPy50aGlua2luZ19tb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTMxMDcyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDgxOTI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoXCItMy01LVwiKSkge1xuICAgICAgICByZXR1cm4gODE5MjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiA0MDk2O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEdyb3FPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zL2dyb3EuanMnO1xuaW1wb3J0IHsgVGV4dEZhbGxiYWNrT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy9mYWxsYmFjay5qcyc7XG5pbXBvcnQgeyBCZWRyb2NrT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy9iZWRyb2NrLmpzJztcbmltcG9ydCB7IE9wZW5BaU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMvb3BlbmFpLmpzJztcbmltcG9ydCB7IFZlcnRleEFJT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy92ZXJ0ZXhhaS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nc09wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IHRvIGdlbmVyYXRlIHRoZSBlbWJlZGRpbmdzIGZvci4gT25lIG9mIHRleHQgb3IgaW1hZ2UgaXMgcmVxdWlyZWQuXG4gICAgICovXG4gICAgdGV4dD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW1hZ2UgdG8gZ2VuZXJhdGUgZW1iZWRkaW5ncyBmb3JcbiAgICAgKi9cbiAgICBpbWFnZT86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtb2RlbCB0byB1c2UgdG8gZ2VuZXJhdGUgdGhlIGVtYmVkZGluZ3MuIE9wdGlvbmFsLlxuICAgICAqL1xuICAgIG1vZGVsPzogc3RyaW5nO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nc1Jlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGVtYmVkZGluZyB2ZWN0b3JzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdvcmRzIGluIHRoZSBpbnB1dCB0ZXh0LlxuICAgICAqL1xuICAgIHZhbHVlczogbnVtYmVyW107XG4gICAgLyoqXG4gICAgICogVGhlIG1vZGVsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGVtYmVkZGluZ3MuXG4gICAgICovXG4gICAgbW9kZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdG9rZW5zIG9mIHRoZSBpbnB1dCB0ZXh0LlxuICAgICAqL1xuICAgIHRva2VuX2NvdW50PzogbnVtYmVyO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdWx0VmFsaWRhdGlvbkVycm9yIHtcbiAgICBjb2RlOiAndmFsaWRhdGlvbl9lcnJvcicgfCAnanNvbl9lcnJvcicgfCAnY29udGVudF9wb2xpY3lfdmlvbGF0aW9uJztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZGF0YT86IHN0cmluZztcbn1cblxuLy9SZXN1bHRUIHNob3VsZCBiZSBlaXRoZXIgSlNPTk9iamVjdCBvciBzdHJpbmdcbi8vSW50ZXJuYWwgc3RydWN0dXJlIHVzZWQgaW4gZHJpdmVyIGltcGxlbWVudGF0aW9uLlxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0aW9uQ2h1bmtPYmplY3Q8UmVzdWx0VCA9IGFueT4ge1xuICAgIHJlc3VsdDogUmVzdWx0VDtcbiAgICB0b2tlbl91c2FnZT86IEV4ZWN1dGlvblRva2VuVXNhZ2U7XG4gICAgZmluaXNoX3JlYXNvbj86IFwic3RvcFwiIHwgXCJsZW5ndGhcIiB8IHN0cmluZztcbn1cblxuLy9JbnRlcm5hbCBzdHJ1Y3R1cmUgdXNlZCBpbiBkcml2ZXIgaW1wbGVtZW50YXRpb24uXG5leHBvcnQgdHlwZSBDb21wbGV0aW9uQ2h1bmsgPSBDb21wbGV0aW9uQ2h1bmtPYmplY3QgfCBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbERlZmluaXRpb24ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBpbnB1dF9zY2hlbWE6IHtcbiAgICAgICAgdHlwZTogJ29iamVjdCc7XG4gICAgICAgIHByb3BlcnRpZXM/OiB1bmtub3duIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgW2s6IHN0cmluZ106IHVua25vd247XG4gICAgfSxcbn1cbi8qKlxuICogQSB0b29sIHVzZSBpbnN0YW5jZSByZXByZXNlbnRzIGEgY2FsbCB0byBhIHRvb2wuXG4gKiBUaGUgaWQgcHJvcGVydHkgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgdG9vbCBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xVc2U8UGFyYW1zVCA9IEpTT05PYmplY3Q+IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIHRvb2xfbmFtZTogc3RyaW5nLFxuICAgIHRvb2xfaW5wdXQ6IFBhcmFtc1QgfCBudWxsXG59XG5cbi8vUmVzdWx0VCBzaG91bGQgYmUgZWl0aGVyIEpTT05PYmplY3Qgb3Igc3RyaW5nXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb248UmVzdWx0VCA9IGFueT4ge1xuICAgIC8vIHRoZSBkcml2ZXIgaW1wbCBtdXN0IHJldHVybiB0aGUgcmVzdWx0IGFuZCBvcHRpb25hbGx5IHRoZSB0b2tlbl91c2FnZS4gdGhlIGV4ZWN1dGlvbiB0aW1lIGlzIGNvbXB1dGVkIGJ5IHRoZSBleHRlbmRlZCBhYnN0cmFjdCBkcml2ZXJcbiAgICByZXN1bHQ6IFJlc3VsdFQ7XG4gICAgdG9rZW5fdXNhZ2U/OiBFeGVjdXRpb25Ub2tlblVzYWdlO1xuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSB0b29scyBmcm9tIHdoaWNoIHRoZSBtb2RlbCBhd2FpdHMgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgdG9vbF91c2U/OiBUb29sVXNlW107XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmlzaCByZWFzb24gYXMgcmVwb3J0ZWQgYnkgdGhlIG1vZGVsOiBzdG9wIHwgbGVuZ3RoIG9yIG90aGVyIG1vZGVsIHNwZWNpZmljIHZhbHVlc1xuICAgICAqL1xuICAgIGZpbmlzaF9yZWFzb24/OiBcInN0b3BcIiB8IFwibGVuZ3RoXCIgfCBcInRvb2xfdXNlXCIgfCBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgb25seSBpZiBhIHJlc3VsdCB2YWxpZGF0aW9uIGVycm9yIG9jY3VycmVkLCBvdGhlcndpc2UgaWYgdGhlIHJlc3VsdCBpcyB2YWxpZCB0aGUgZXJyb3IgZmllbGQgaXMgdW5kZWZpbmVkXG4gICAgICogVGhpcyBjYW4gb25seSBiZSBzZXQgaWYgdGhlIHJlc3VsdF9zY2hlbWEgaXMgc2V0IGFuZCB0aGUgcmVzdWx0IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgYSBqc29uIG9yIGlmIHRoZSByZXN1bHQgZG9lcyBub3QgbWF0Y2ggdGhlIHNjaGVtYVxuICAgICAqL1xuICAgIGVycm9yPzogUmVzdWx0VmFsaWRhdGlvbkVycm9yO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHJlc3BvbnNlLiBPbmx5IGluY2x1ZGVkIGlmIHRoZSBvcHRpb24gaW5jbHVkZV9vcmlnaW5hbF9yZXNwb25zZSBpcyBzZXQgdG8gdHJ1ZSBhbmQgdGhlIHJlcXVlc3QgaXMgbWFkZSB1c2luZyBleGVjdXRlLiBOb3Qgc3VwcG9ydGVkIHdoZW4gc3RyZWFtaW5nLlxuICAgICAqL1xuICAgIG9yaWdpbmFsX3Jlc3BvbnNlPzogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb252ZXJzYXRpb24gY29udGV4dC4gVGhpcyBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgbmV4dCByZXF1ZXN0IHRvIHJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICovXG4gICAgY29udmVyc2F0aW9uPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbWFnZUdlbmVyYXRpb24ge1xuXG4gICAgaW1hZ2VzPzogc3RyaW5nW107XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25SZXNwb25zZTxQcm9tcHRUID0gYW55PiBleHRlbmRzIENvbXBsZXRpb24ge1xuICAgIHByb21wdDogUHJvbXB0VDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSBpdCB0b29rIHRvIGV4ZWN1dGUgdGhlIHJlcXVlc3QgaW4gc2Vjb25kc1xuICAgICAqL1xuICAgIGV4ZWN1dGlvbl90aW1lPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2h1bmtzIGZvciBzdHJlYW1lZCBleGVjdXRpb25zXG4gICAgICovXG4gICAgY2h1bmtzPzogbnVtYmVyO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvblN0cmVhbTxQcm9tcHRUID0gYW55PiBleHRlbmRzIEFzeW5jSXRlcmFibGU8c3RyaW5nPiB7XG4gICAgY29tcGxldGlvbjogRXhlY3V0aW9uUmVzcG9uc2U8UHJvbXB0VD4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgICBkZWJ1ZzogKC4uLm9iajogYW55W10pID0+IHZvaWQ7XG4gICAgaW5mbzogKC4uLm9iajogYW55W10pID0+IHZvaWQ7XG4gICAgd2FybjogKC4uLm9iajogYW55W10pID0+IHZvaWQ7XG4gICAgZXJyb3I6ICguLi5vYmo6IGFueVtdKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyaXZlck9wdGlvbnMge1xuICAgIGxvZ2dlcj86IExvZ2dlciB8IFwiY29uc29sZVwiO1xufVxuXG5leHBvcnQgdHlwZSBKU09OU2NoZW1hVHlwZU5hbWUgPVxuICAgIHwgXCJzdHJpbmdcIiAvL1xuICAgIHwgXCJudW1iZXJcIlxuICAgIHwgXCJpbnRlZ2VyXCJcbiAgICB8IFwiYm9vbGVhblwiXG4gICAgfCBcIm9iamVjdFwiXG4gICAgfCBcImFycmF5XCJcbiAgICB8IFwibnVsbFwiXG4gICAgfCBcImFueVwiO1xuXG5leHBvcnQgdHlwZSBKU09OU2NoZW1hVHlwZSA9XG4gICAgfCBzdHJpbmcgLy9cbiAgICB8IG51bWJlclxuICAgIHwgYm9vbGVhblxuICAgIHwgSlNPTlNjaGVtYU9iamVjdFxuICAgIHwgSlNPTlNjaGVtYUFycmF5XG4gICAgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFPYmplY3Qge1xuICAgIFtrZXk6IHN0cmluZ106IEpTT05TY2hlbWFUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEpTT05TY2hlbWFBcnJheSBleHRlbmRzIEFycmF5PEpTT05TY2hlbWFUeXBlPiB7IH1cblxuZXhwb3J0IGludGVyZmFjZSBKU09OU2NoZW1hIHtcbiAgICB0eXBlPzogSlNPTlNjaGVtYVR5cGVOYW1lIHwgSlNPTlNjaGVtYVR5cGVOYW1lW107XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIEpTT05TY2hlbWE+O1xuICAgIHJlcXVpcmVkPzogc3RyaW5nW107XG4gICAgW2s6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Rm9ybWF0dGVyPFQgPSBhbnk+ID0gKG1lc3NhZ2VzOiBQcm9tcHRTZWdtZW50W10sIHNjaGVtYT86IEpTT05TY2hlbWEpID0+IFQ7XG5cbi8vT3B0aW9ucyBhcmUgc3BsaXQgaW50byBQcm9tcHRPcHRpb25zLCBNb2RlbE9wdGlvbnMgYW5kIEV4ZWN1dGlvbk9wdGlvbnMuXG4vL0V4ZWN1dGlvbk9wdGlvbnMgYXJlIG1vc3Qgb2Z0ZW4gdXNlZCB3aXRoaW4gbGx1bWl2ZXJzZSBhcyB0aGV5IGFyZSB0aGUgbW9zdCBjb21wbGV0ZS5cbi8vVGhlIGJhc2UgdHlwZXMgYXJlIHVzZWZ1bCBmb3IgZXh0ZXJuYWwgY29kZSB0aGF0IG5lZWRzIHRvIGludGVyYWN0IHdpdGggbGx1bWl2ZXJzZS5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0T3B0aW9ucyB7XG4gICAgbW9kZWw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGN1c3RvbSBmb3JtYXR0ZXIgdG8gdXNlIGZvciBmb3JtYXQgdGhlIGZpbmFsIG1vZGVsIHByb21wdCBmcm9tIHRoZSBpbnB1dCBwcm9tcHQgc2VnbWVudHMuXG4gICAgICogSWYgbm8gb25lIGlzIHNwZWNpZmllZCB0aGUgZHJpdmVyIHdpbGwgY2hvb3NlIGEgZm9ybWF0dGVyIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IG1vZGVsXG4gICAgICovXG4gICAgZm9ybWF0PzogUHJvbXB0Rm9ybWF0dGVyO1xuICAgIHJlc3VsdF9zY2hlbWE/OiBKU09OU2NoZW1hO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbGVzc0V4ZWN1dGlvbk9wdGlvbnMgZXh0ZW5kcyBQcm9tcHRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gdHJ1ZSB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgZnJvbSB0aGUgdGFyZ2V0IExMTSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZSB1bmRlciB0aGUgb3JpZ2luYWxfcmVzcG9uc2UgZmllbGQuXG4gICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZm9yIHNvbWUgYWR2YW5jZWQgdXNlIGNhc2VzLlxuICAgICAqIEl0IGlzIGlnbm9yZWQgb24gc3RyZWFtaW5nIHJlcXVlc3RzXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9yZXNwb25zZT86IGJvb2xlYW47XG4gICAgbW9kZWxfb3B0aW9ucz86IE1vZGVsT3B0aW9ucztcbiAgICBvdXRwdXRfbW9kYWxpdHk6IE1vZGFsaXRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uT3B0aW9ucyBleHRlbmRzIFN0YXRlbGVzc0V4ZWN1dGlvbk9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEF2YWlsYWJsZSB0b29scyBmb3IgdGhlIHJlcXVlc3RcbiAgICAgKi9cbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9uW107XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBvcGFxdWUgc3RydWN0dXJlIHRoYXQgcHJvdmlkZXMgYSBjb252ZXJzYXRpb24gY29udGV4dFxuICAgICAqIEVhY2ggZHJpdmVyIGltcGxlbWVudGF0aW9uIHdpbGwgcmV0dXJuIGEgY29udmVyc2F0aW9uIHByb3BlcnR5IGluIHRoZSBleGVjdXRpb24gcmVzcG9uc2VcbiAgICAgKiB0aGF0IGNhbiBiZSBwYXNzZWQgaGVyZSB0byByZXN0b3JlIHRoZSBjb250ZXh0IHdoZW4gYSBuZXcgcHJvbXB0IGlzIHNlbnQgdG8gdGhlIG1vZGVsLlxuICAgICAqL1xuICAgIGNvbnZlcnNhdGlvbj86IHVua25vd24gfCBudWxsO1xufVxuXG4vL0NvbW1vbiBuYW1lcyB0byBzaGFyZSBiZXR3ZWVuIGRpZmZlcmVudCBtb2RlbHNcbmV4cG9ydCBlbnVtIFNoYXJlZE9wdGlvbnMge1xuICAgIC8vVGV4dFxuICAgIG1heF90b2tlbnMgPSBcIm1heF90b2tlbnNcIixcbiAgICB0ZW1wZXJhdHVyZSA9IFwidGVtcGVyYXR1cmVcIixcbiAgICB0b3BfcCA9IFwidG9wX3BcIixcbiAgICB0b3BfayA9IFwidG9wX2tcIixcbiAgICBwcmVzZW5jZV9wZW5hbHR5ID0gXCJwcmVzZW5jZV9wZW5hbHR5XCIsXG4gICAgZnJlcXVlbmN5X3BlbmFsdHkgPSBcImZyZXF1ZW5jeV9wZW5hbHR5XCIsXG4gICAgc3RvcF9zZXF1ZW5jZSA9IFwic3RvcF9zZXF1ZW5jZVwiLFxuXG4gICAgLy9JbWFnZVxuICAgIHNlZWQgPSBcInNlZWRcIixcbiAgICBudW1iZXJfb2ZfaW1hZ2VzID0gXCJudW1iZXJfb2ZfaW1hZ2VzXCIsXG59XG5cbmV4cG9ydCBlbnVtIE9wdGlvblR5cGUge1xuICAgIG51bWVyaWMgPSBcIm51bWVyaWNcIixcbiAgICBlbnVtID0gXCJlbnVtXCIsXG4gICAgYm9vbGVhbiA9IFwiYm9vbGVhblwiLFxuICAgIHN0cmluZ19saXN0ID0gXCJzdHJpbmdfbGlzdFwiXG59XG5cbi8vID09PT09PT09PT09PT09IE1vZGVsIE9wdGlvbnMgPT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIE1vZGVsT3B0aW9ucyA9IFRleHRGYWxsYmFja09wdGlvbnMgfCBWZXJ0ZXhBSU9wdGlvbnMgfCBCZWRyb2NrT3B0aW9ucyB8IE9wZW5BaU9wdGlvbnMgfCBHcm9xT3B0aW9ucztcblxuLy8gPT09PT09PT09PT09PT0gT3B0aW9uIEluZm8gPT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxPcHRpb25zSW5mbyB7XG4gICAgb3B0aW9uczogTW9kZWxPcHRpb25JbmZvSXRlbVtdO1xuICAgIF9vcHRpb25faWQ6IHN0cmluZzsgLy9TaG91bGQgZm9sbG93IHNhbWUgaWRzIGFzIE1vZGVsT3B0aW9uc1xufVxuXG5leHBvcnQgdHlwZSBNb2RlbE9wdGlvbkluZm9JdGVtID0gTnVtZXJpY09wdGlvbkluZm8gfCBFbnVtT3B0aW9uSW5mbyB8IEJvb2xlYW5PcHRpb25JbmZvIHwgU3RyaW5nTGlzdE9wdGlvbkluZm87XG5pbnRlcmZhY2UgT3B0aW9uSW5mb1Byb3RvdHlwZSB7XG4gICAgdHlwZTogT3B0aW9uVHlwZTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvL0lmIHRoaXMgaXMgdHJ1ZSwgd2hldGhlciBvdGhlciBvcHRpb25zIGFwcGx5IGlzIGRlcGVuZGVudCBvbiB0aGlzIG9wdGlvblxuICAgIC8vVGhlcmVmb3JlLCBpZiB0aGlzIG9wdGlvbiBpcyBjaGFuZ2VkLCB0aGUgc2V0IG9mIGF2YWlsYWJsZSBvcHRpb25zIHNob3VsZCBiZSByZWZyZXNoZWQuXG4gICAgcmVmcmVzaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnVtZXJpY09wdGlvbkluZm8gZXh0ZW5kcyBPcHRpb25JbmZvUHJvdG90eXBlIHtcbiAgICB0eXBlOiBPcHRpb25UeXBlLm51bWVyaWM7XG4gICAgdmFsdWU/OiBudW1iZXI7XG4gICAgbWluPzogbnVtYmVyO1xuICAgIG1heD86IG51bWJlcjtcbiAgICBzdGVwPzogbnVtYmVyO1xuICAgIGludGVnZXI/OiBib29sZWFuO1xuICAgIGRlZmF1bHQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW51bU9wdGlvbkluZm8gZXh0ZW5kcyBPcHRpb25JbmZvUHJvdG90eXBlIHtcbiAgICB0eXBlOiBPcHRpb25UeXBlLmVudW07XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgZW51bTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBkZWZhdWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb2xlYW5PcHRpb25JbmZvIGV4dGVuZHMgT3B0aW9uSW5mb1Byb3RvdHlwZSB7XG4gICAgdHlwZTogT3B0aW9uVHlwZS5ib29sZWFuO1xuICAgIHZhbHVlPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdMaXN0T3B0aW9uSW5mbyBleHRlbmRzIE9wdGlvbkluZm9Qcm90b3R5cGUge1xuICAgIHR5cGU6IE9wdGlvblR5cGUuc3RyaW5nX2xpc3Q7XG4gICAgdmFsdWU/OiBzdHJpbmdbXTtcbiAgICBkZWZhdWx0Pzogc3RyaW5nW107XG59XG5cbi8vID09PT09PT09PT09PT09IFByb21wdHMgPT09PT09PT09PT09PT09XG5leHBvcnQgZW51bSBQcm9tcHRSb2xlIHtcbiAgICBzYWZldHkgPSBcInNhZmV0eVwiLFxuICAgIHN5c3RlbSA9IFwic3lzdGVtXCIsXG4gICAgdXNlciA9IFwidXNlclwiLFxuICAgIGFzc2lzdGFudCA9IFwiYXNzaXN0YW50XCIsXG4gICAgbmVnYXRpdmUgPSBcIm5lZ2F0aXZlXCIsXG4gICAgbWFzayA9IFwibWFza1wiLFxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc2VuZCB0aGUgcmVzcG9uc2Ugb2YgYSB0b29sXG4gICAgICovXG4gICAgdG9vbCA9IFwidG9vbFwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0U2VnbWVudCB7XG4gICAgcm9sZTogUHJvbXB0Um9sZTtcbiAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvb2wgdXNlIGlkIGlmIHRoZSBzZWdtZW50IGlzIGEgdG9vbCByZXNwb25zZVxuICAgICAqL1xuICAgIHRvb2xfdXNlX2lkPzogc3RyaW5nO1xuICAgIGZpbGVzPzogRGF0YVNvdXJjZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uVG9rZW5Vc2FnZSB7XG4gICAgcHJvbXB0PzogbnVtYmVyO1xuICAgIHJlc3VsdD86IG51bWJlcjtcbiAgICB0b3RhbD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGVudW0gTW9kYWxpdGllcyB7XG4gICAgdGV4dCA9IFwidGV4dFwiLFxuICAgIGltYWdlID0gXCJpbWFnZVwiLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG91dHB1dCBhbmQgaW5wdXQgbW9kYWxpdGllcyBhIG1vZGVsIGNhbiBzdXBwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxNb2RhbGl0aWVzIHtcbiAgICB0ZXh0PzogYm9vbGVhbjtcbiAgICBpbWFnZT86IGJvb2xlYW47XG4gICAgdmlkZW8/OiBib29sZWFuO1xuICAgIGF1ZGlvPzogYm9vbGVhbjtcbiAgICBlbWJlZD86IGJvb2xlYW47IC8vT25seSBmb3Igb3V0cHV0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDYXBhYmlsaXRpZXMge1xuICAgIGlucHV0OiBNb2RlbE1vZGFsaXRpZXM7XG4gICAgb3V0cHV0OiBNb2RlbE1vZGFsaXRpZXM7XG4gICAgdG9vbF9zdXBwb3J0PzogYm9vbGVhbjsgLy9pZiB0aGUgbW9kZWwgc3VwcG9ydHMgdG9vbCB1c2VcbiAgICB0b29sX3N1cHBvcnRfc3RyZWFtaW5nPzogYm9vbGVhbjsgLy9pZiB0aGUgbW9kZWwgc3VwcG9ydHMgdG9vbCB1c2Ugd2l0aCBzdHJlYW1pbmdcbn1cblxuLy8gPT09PT09PT09PT09PT0gQUkgTU9ERUwgPT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBSU1vZGVsPFByb3ZpZGVyS2V5cyA9IHN0cmluZz4ge1xuICAgIGlkOiBzdHJpbmc7IC8vaWQgb2YgdGhlIG1vZGVsIGtub3duIGJ5IHRoZSBwcm92aWRlclxuICAgIG5hbWU6IHN0cmluZzsgLy9odW1hbiByZWFkYWJsZSBuYW1lXG4gICAgcHJvdmlkZXI6IFByb3ZpZGVyS2V5czsgLy9wcm92aWRlciBuYW1lXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IHN0cmluZzsgLy9pZiBhbnkgdmVyc2lvbiBpcyBzcGVjaWZpZWRcbiAgICB0eXBlPzogTW9kZWxUeXBlOyAvL3R5cGUgb2YgdGhlIG1vZGVsXG4gICAgdGFncz86IHN0cmluZ1tdOyAvL3RhZ3MgZm9yIHNlYXJjaGluZ1xuICAgIG93bmVyPzogc3RyaW5nOyAvL293bmVyIG9mIHRoZSBtb2RlbFxuICAgIHN0YXR1cz86IEFJTW9kZWxTdGF0dXM7IC8vc3RhdHVzIG9mIHRoZSBtb2RlbFxuICAgIGNhbl9zdHJlYW0/OiBib29sZWFuOyAvL2lmIHRoZSBtb2RlbCdzIHJlc3BvbnNlIGNhbiBiZSBzdHJlYW1lZFxuICAgIGlzX2N1c3RvbT86IGJvb2xlYW47IC8vaWYgdGhlIG1vZGVsIGlzIGEgY3VzdG9tIG1vZGVsIChhIHRyYWluZWQgbW9kZWwpXG4gICAgaXNfbXVsdGltb2RhbD86IGJvb2xlYW4gLy9pZiB0aGUgbW9kZWwgc3VwcG9ydCBmaWxlcyBhbmQgaW1hZ2VzXG4gICAgaW5wdXRfbW9kYWxpdGllcz86IHN0cmluZ1tdOyAvL0lucHV0IG1vZGFsaXRpZXMgc3VwcG9ydGVkIGJ5IHRoZSBtb2RlbCAoZS5nLiB0ZXh0LCBpbWFnZSwgdmlkZW8sIGF1ZGlvKVxuICAgIG91dHB1dF9tb2RhbGl0aWVzPzogc3RyaW5nW107IC8vT3V0cHV0IG1vZGFsaXRpZXMgc3VwcG9ydGVkIGJ5IHRoZSBtb2RlbCAoZS5nLiB0ZXh0LCBpbWFnZSwgdmlkZW8sIGF1ZGlvKVxuICAgIHRvb2xfc3VwcG9ydD86IGJvb2xlYW47IC8vaWYgdGhlIG1vZGVsIHN1cHBvcnRzIHRvb2wgdXNlXG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7IC8vdGhlIGVudmlyb25tZW50IG5hbWVcbn1cblxuZXhwb3J0IGVudW0gQUlNb2RlbFN0YXR1cyB7XG4gICAgQXZhaWxhYmxlID0gXCJhdmFpbGFibGVcIixcbiAgICBQZW5kaW5nID0gXCJwZW5kaW5nXCIsXG4gICAgU3RvcHBlZCA9IFwic3RvcHBlZFwiLFxuICAgIFVuYXZhaWxhYmxlID0gXCJ1bmF2YWlsYWJsZVwiLFxuICAgIFVua25vd24gPSBcInVua25vd25cIixcbiAgICBMZWdhY3kgPSBcImxlZ2FjeVwiLFxufVxuXG4vKipcbiAqIHBheWxvYWQgdG8gbGlzdCBhdmFpbGFibGUgbW9kZWxzIGZvciBhbiBlbnZpcm9ubWVudFxuICogQHBhcmFtIGVudmlyb25tZW50SWQgaWQgb2YgdGhlIGVudmlyb25tZW50XG4gKiBAcGFyYW0gcXVlcnkgdGV4dCB0byBzZWFyY2ggZm9yIGluIG1vZGVsIG5hbWUvZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdGhlIG1vZGVsXG4gKiBAcGFyYW0gdGFncyB0YWdzIGZvciBzZWFyY2hpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbFNlYXJjaFBheWxvYWQge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB0eXBlPzogTW9kZWxUeXBlO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBvd25lcj86IHN0cmluZztcbn1cblxuXG5leHBvcnQgZW51bSBNb2RlbFR5cGUge1xuICAgIENsYXNzaWZpZXIgPSBcImNsYXNzaWZpZXJcIixcbiAgICBSZWdyZXNzb3IgPSBcInJlZ3Jlc3NvclwiLFxuICAgIENsdXN0ZXJpbmcgPSBcImNsdXN0ZXJpbmdcIixcbiAgICBBbm9tYWx5RGV0ZWN0aW9uID0gXCJhbm9tYWx5LWRldGVjdGlvblwiLFxuICAgIFRpbWVTZXJpZXMgPSBcInRpbWUtc2VyaWVzXCIsXG4gICAgVGV4dCA9IFwidGV4dFwiLFxuICAgIEltYWdlID0gXCJpbWFnZVwiLFxuICAgIEF1ZGlvID0gXCJhdWRpb1wiLFxuICAgIFZpZGVvID0gXCJ2aWRlb1wiLFxuICAgIEVtYmVkZGluZyA9IFwiZW1iZWRkaW5nXCIsXG4gICAgQ2hhdCA9IFwiY2hhdFwiLFxuICAgIENvZGUgPSBcImNvZGVcIixcbiAgICBOTFAgPSBcIm5scFwiLFxuICAgIE11bHRpTW9kYWwgPSBcIm11bHRpLW1vZGFsXCIsXG4gICAgVGVzdCA9IFwidGVzdFwiLFxuICAgIE90aGVyID0gXCJvdGhlclwiLFxuICAgIFVua25vd24gPSBcInVua25vd25cIlxufVxuXG5cbi8vID09PT09PT09PT09PT09IHRyYWluaW5nID09PT09PT09PT09PT09PT09PT09PVxuXG5cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbWltZV90eXBlPzogc3RyaW5nO1xuICAgIGdldFN0cmVhbSgpOiBQcm9taXNlPFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXkgfCBzdHJpbmc+PjtcbiAgICBnZXRVUkwoKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nT3B0aW9ucyB7XG4gICAgbmFtZTogc3RyaW5nOyAvLyB0aGUgbmV3IG1vZGVsIG5hbWVcbiAgICBtb2RlbDogc3RyaW5nOyAvLyB0aGUgbW9kZWwgdG8gdHJhaW5cbiAgICBwYXJhbXM/OiBKU09OT2JqZWN0OyAvLyB0aGUgdHJhaW5pbmcgcGFyYW1ldGVyc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nUHJvbXB0T3B0aW9ucyB7XG4gICAgc2VnbWVudHM6IFByb21wdFNlZ21lbnRbXTtcbiAgICBjb21wbGV0aW9uOiBzdHJpbmcgfCBKU09OT2JqZWN0O1xuICAgIG1vZGVsOiBzdHJpbmc7IC8vIHRoZSBtb2RlbCB0byB0cmFpblxuICAgIHNjaGVtYT86IEpTT05TY2hlbWE7IC8vIHRoZSByZXN1bHQgc2NoZW1hIGYgYW55XG59XG5cbmV4cG9ydCBlbnVtIFRyYWluaW5nSm9iU3RhdHVzIHtcbiAgICBydW5uaW5nID0gXCJydW5uaW5nXCIsXG4gICAgc3VjY2VlZGVkID0gXCJzdWNjZWVkZWRcIixcbiAgICBmYWlsZWQgPSBcImZhaWxlZFwiLFxuICAgIGNhbmNlbGxlZCA9IFwiY2FuY2VsbGVkXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaW5pbmdKb2Ige1xuICAgIGlkOiBzdHJpbmc7IC8vIGlkIG9mIHRoZSB0cmFpbmluZyBqb2JcbiAgICBzdGF0dXM6IFRyYWluaW5nSm9iU3RhdHVzOyAvLyBzdGF0dXMgb2YgdGhlIHRyYWluaW5nIGpvYiAtIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uXG4gICAgZGV0YWlscz86IHN0cmluZztcbiAgICBtb2RlbD86IHN0cmluZzsgLy8gdGhlIG5hbWUgb2YgdGhlIGZpbmUgdHVuZWQgbW9kZWwgd2hpY2ggaXMgY3JlYXRlZFxufVxuXG5leHBvcnQgdHlwZSBKU09OUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5leHBvcnQgdHlwZSBKU09OQXJyYXkgPSBKU09OVmFsdWVbXTtcbmV4cG9ydCB0eXBlIEpTT05PYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IEpTT05WYWx1ZSB9O1xuZXhwb3J0IHR5cGUgSlNPTkNvbXBvc2l0ZSA9IEpTT05BcnJheSB8IEpTT05PYmplY3Q7XG5leHBvcnQgdHlwZSBKU09OVmFsdWUgPSBKU09OUHJpbWl0aXZlIHwgSlNPTkNvbXBvc2l0ZTtcbiIsImltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHsgVmVyc2lvbmluZ0ludGVudCB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IGNvbnN0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9IHtcbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlID0gKHR5cGVvZiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUpW2tleW9mIHR5cGVvZiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSwgZGVjb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICBrZXlvZiB0eXBlb2YgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMCxcbiAgICBbQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDEsXG4gICAgW0FjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcmVtb3RlIGFjdGl2aXR5IGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eU9wdGlvbnMge1xuICAvKipcbiAgICogSWRlbnRpZmllciB0byB1c2UgZm9yIHRyYWNraW5nIHRoZSBhY3Rpdml0eSBpbiBXb3JrZmxvdyBoaXN0b3J5LlxuICAgKiBUaGUgYGFjdGl2aXR5SWRgIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgYWN0aXZpdHkgZnVuY3Rpb24uXG4gICAqIERvZXMgbm90IG5lZWQgdG8gYmUgdW5pcXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBhbiBpbmNyZW1lbnRhbCBzZXF1ZW5jZSBudW1iZXJcbiAgICovXG4gIGFjdGl2aXR5SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgY3VycmVudCB3b3JrZXIgdGFzayBxdWV1ZVxuICAgKi9cbiAgdGFza1F1ZXVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIZWFydGJlYXQgaW50ZXJ2YWwuIEFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IGJlZm9yZSB0aGlzIGludGVydmFsIHBhc3NlcyBhZnRlciBhIGxhc3QgaGVhcnRiZWF0IG9yIGFjdGl2aXR5IHN0YXJ0LlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIGhlYXJ0YmVhdFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogUmV0cnlQb2xpY3kgdGhhdCBkZWZpbmUgaG93IGFjdGl2aXR5IGlzIHJldHJpZWQgaW4gY2FzZSBvZiBmYWlsdXJlLiBJZiB0aGlzIGlzIG5vdCBzZXQsIHRoZW4gdGhlIHNlcnZlci1kZWZpbmVkIGRlZmF1bHQgYWN0aXZpdHkgcmV0cnkgcG9saWN5IHdpbGwgYmUgdXNlZC4gVG8gZW5zdXJlIHplcm8gcmV0cmllcywgc2V0IG1heGltdW0gYXR0ZW1wdHMgdG8gMS5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSBvZiBhIHNpbmdsZSBBY3Rpdml0eSBleGVjdXRpb24gYXR0ZW1wdC4gTm90ZSB0aGF0IHRoZSBUZW1wb3JhbCBTZXJ2ZXIgZG9lc24ndCBkZXRlY3QgV29ya2VyIHByb2Nlc3NcbiAgICogZmFpbHVyZXMgZGlyZWN0bHk6IGluc3RlYWQsIGl0IHJlbGllcyBvbiB0aGlzIHRpbWVvdXQgdG8gZGV0ZWN0IHRoYXQgYW4gQWN0aXZpdHkgZGlkbid0IGNvbXBsZXRlIG9uIHRpbWUuIFRoZXJlZm9yZSwgdGhpc1xuICAgKiB0aW1lb3V0IHNob3VsZCBiZSBhcyBzaG9ydCBhcyB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBleGVjdXRpb24gb2YgdGhlIEFjdGl2aXR5IGJvZHkuIFBvdGVudGlhbGx5IGxvbmctcnVubmluZ1xuICAgKiBBY3Rpdml0aWVzIG11c3Qgc3BlY2lmeSB7QGxpbmsgaGVhcnRiZWF0VGltZW91dH0gYW5kIGNhbGwge0BsaW5rIGFjdGl2aXR5LkNvbnRleHQuaGVhcnRiZWF0fSBwZXJpb2RpY2FsbHkgZm9yXG4gICAqIHRpbWVseSBmYWlsdXJlIGRldGVjdGlvbi5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHNjaGVkdWxlVG9DbG9zZVRpbWVvdXRgIG9yIHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGltZSB0aGF0IHRoZSBBY3Rpdml0eSBUYXNrIGNhbiBzdGF5IGluIHRoZSBUYXNrIFF1ZXVlIGJlZm9yZSBpdCBpcyBwaWNrZWQgdXAgYnkgYSBXb3JrZXIuIERvIG5vdCBzcGVjaWZ5IHRoaXMgdGltZW91dCB1bmxlc3MgdXNpbmcgaG9zdC1zcGVjaWZpYyBUYXNrIFF1ZXVlcyBmb3IgQWN0aXZpdHkgVGFza3MgYXJlIGJlaW5nIHVzZWQgZm9yIHJvdXRpbmcuXG4gICAqIGBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0YCBpcyBhbHdheXMgbm9uLXJldHJ5YWJsZS4gUmV0cnlpbmcgYWZ0ZXIgdGhpcyB0aW1lb3V0IGRvZXNuJ3QgbWFrZSBzZW5zZSBhcyBpdCB3b3VsZCBqdXN0IHB1dCB0aGUgQWN0aXZpdHkgVGFzayBiYWNrIGludG8gdGhlIHNhbWUgVGFzayBRdWV1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHNjaGVkdWxlVG9DbG9zZVRpbWVvdXRgIG9yIHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVG90YWwgdGltZSB0aGF0IGEgd29ya2Zsb3cgaXMgd2lsbGluZyB0byB3YWl0IGZvciB0aGUgQWN0aXZpdHkgdG8gY29tcGxldGUuXG4gICAqIGBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0YCBsaW1pdHMgdGhlIHRvdGFsIHRpbWUgb2YgYW4gQWN0aXZpdHkncyBleGVjdXRpb24gaW5jbHVkaW5nIHJldHJpZXMgKHVzZSB7QGxpbmsgc3RhcnRUb0Nsb3NlVGltZW91dH0gdG8gbGltaXQgdGhlIHRpbWUgb2YgYSBzaW5nbGUgYXR0ZW1wdCkuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc3RhcnRUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGF0IHRoZSBTREsgZG9lcyB3aGVuIHRoZSBBY3Rpdml0eSBpcyBjYW5jZWxsZWQuXG4gICAqIC0gYFRSWV9DQU5DRUxgIC0gSW5pdGlhdGUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvbiB0byB0aGUgd29ya2Zsb3cuXG4gICAqIC0gYFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRGAgLSBXYWl0IGZvciBhY3Rpdml0eSBjYW5jZWxsYXRpb24gY29tcGxldGlvbi4gTm90ZSB0aGF0IGFjdGl2aXR5IG11c3QgaGVhcnRiZWF0IHRvIHJlY2VpdmUgYVxuICAgKiAgIGNhbmNlbGxhdGlvbiBub3RpZmljYXRpb24uIFRoaXMgY2FuIGJsb2NrIHRoZSBjYW5jZWxsYXRpb24gZm9yIGEgbG9uZyB0aW1lIGlmIGFjdGl2aXR5IGRvZXNuJ3RcbiAgICogICBoZWFydGJlYXQgb3IgY2hvb3NlcyB0byBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LlxuICAgKiAtIGBBQkFORE9OYCAtIERvIG5vdCByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiB0aGUgYWN0aXZpdHkgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydCBjYW5jZWxsYXRpb24gdG8gdGhlIHdvcmtmbG93LlxuICAgKi9cbiAgY2FuY2VsbGF0aW9uVHlwZT86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogRWFnZXIgZGlzcGF0Y2ggaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaW1wcm92ZXMgdGhlIHRocm91Z2hwdXQgYW5kIGxvYWQgb24gdGhlIHNlcnZlciBmb3Igc2NoZWR1bGluZyBBY3Rpdml0aWVzLlxuICAgKiBXaGVuIHVzZWQsIHRoZSBzZXJ2ZXIgd2lsbCBoYW5kIG91dCBBY3Rpdml0eSB0YXNrcyBiYWNrIHRvIHRoZSBXb3JrZXIgd2hlbiBpdCBjb21wbGV0ZXMgYSBXb3JrZmxvdyB0YXNrLlxuICAgKiBJdCBpcyBhdmFpbGFibGUgZnJvbSBzZXJ2ZXIgdmVyc2lvbiAxLjE3IGJlaGluZCB0aGUgYHN5c3RlbS5lbmFibGVBY3Rpdml0eUVhZ2VyRXhlY3V0aW9uYCBmZWF0dXJlIGZsYWcuXG4gICAqXG4gICAqIEVhZ2VyIGRpc3BhdGNoIHdpbGwgb25seSBiZSB1c2VkIGlmIGBhbGxvd0VhZ2VyRGlzcGF0Y2hgIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSBhbmQge0BsaW5rIHRhc2tRdWV1ZX0gaXMgZWl0aGVyXG4gICAqIG9taXR0ZWQgb3IgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgV29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGFsbG93RWFnZXJEaXNwYXRjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQWN0aXZpdHkgc2hvdWxkIHJ1biBvbiBhXG4gICAqIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2ZXJzaW9uaW5nSW50ZW50PzogVmVyc2lvbmluZ0ludGVudDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBsb2NhbCBhY3Rpdml0eSBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxBY3Rpdml0eU9wdGlvbnMge1xuICAvKipcbiAgICogUmV0cnlQb2xpY3kgdGhhdCBkZWZpbmVzIGhvdyBhbiBhY3Rpdml0eSBpcyByZXRyaWVkIGluIGNhc2Ugb2YgZmFpbHVyZS4gSWYgdGhpcyBpcyBub3Qgc2V0LCB0aGVuIHRoZSBTREstZGVmaW5lZCBkZWZhdWx0IGFjdGl2aXR5IHJldHJ5IHBvbGljeSB3aWxsIGJlIHVzZWQuXG4gICAqIE5vdGUgdGhhdCBsb2NhbCBhY3Rpdml0aWVzIGFyZSBhbHdheXMgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSwgZXZlbiBpZiBtYXhpbXVtIGF0dGVtcHRzIGlzIHNldCB0byAxIGR1ZSB0byBXb3JrZmxvdyB0YXNrIHJldHJpZXMuXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgdGhlIGxvY2FsIGFjdGl2aXR5IGlzIGFsbG93ZWQgdG8gZXhlY3V0ZSBhZnRlciB0aGUgdGFzayBpcyBkaXNwYXRjaGVkLiBUaGlzXG4gICAqIHRpbWVvdXQgaXMgYWx3YXlzIHJldHJ5YWJsZS5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICogSWYgc2V0LCB0aGlzIG11c3QgYmUgPD0ge0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9LCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgY2xhbXBlZCBkb3duLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHN0YXJ0VG9DbG9zZVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTGltaXRzIHRpbWUgdGhlIGxvY2FsIGFjdGl2aXR5IGNhbiBpZGxlIGludGVybmFsbHkgYmVmb3JlIGJlaW5nIGV4ZWN1dGVkLiBUaGF0IGNhbiBoYXBwZW4gaWZcbiAgICogdGhlIHdvcmtlciBpcyBjdXJyZW50bHkgYXQgbWF4IGNvbmN1cnJlbnQgbG9jYWwgYWN0aXZpdHkgZXhlY3V0aW9ucy4gVGhpcyB0aW1lb3V0IGlzIGFsd2F5c1xuICAgKiBub24gcmV0cnlhYmxlIGFzIGFsbCBhIHJldHJ5IHdvdWxkIGFjaGlldmUgaXMgdG8gcHV0IGl0IGJhY2sgaW50byB0aGUgc2FtZSBxdWV1ZS4gRGVmYXVsdHNcbiAgICogdG8ge0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9IGlmIG5vdCBzcGVjaWZpZWQgYW5kIHRoYXQgaXMgc2V0LiBNdXN0IGJlIDw9XG4gICAqIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSB3aGVuIHNldCwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaG93IGxvbmcgdGhlIGNhbGxlciBpcyB3aWxsaW5nIHRvIHdhaXQgZm9yIGxvY2FsIGFjdGl2aXR5IGNvbXBsZXRpb24uIExpbWl0cyBob3dcbiAgICogbG9uZyByZXRyaWVzIHdpbGwgYmUgYXR0ZW1wdGVkLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHN0YXJ0VG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmxpbWl0ZWRcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhY3Rpdml0eSBpcyByZXRyeWluZyBhbmQgYmFja29mZiB3b3VsZCBleGNlZWQgdGhpcyB2YWx1ZSwgYSBzZXJ2ZXIgc2lkZSB0aW1lciB3aWxsIGJlIHNjaGVkdWxlZCBmb3IgdGhlIG5leHQgYXR0ZW1wdC5cbiAgICogT3RoZXJ3aXNlLCBiYWNrb2ZmIHdpbGwgaGFwcGVuIGludGVybmFsbHkgaW4gdGhlIFNESy5cbiAgICpcbiAgICogQGRlZmF1bHQgMSBtaW51dGVcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqKi9cbiAgbG9jYWxSZXRyeVRocmVzaG9sZD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoYXQgdGhlIFNESyBkb2VzIHdoZW4gdGhlIEFjdGl2aXR5IGlzIGNhbmNlbGxlZC5cbiAgICogLSBgVFJZX0NBTkNFTGAgLSBJbml0aWF0ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uIHRvIHRoZSB3b3JrZmxvdy5cbiAgICogLSBgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEYCAtIFdhaXQgZm9yIGFjdGl2aXR5IGNhbmNlbGxhdGlvbiBjb21wbGV0aW9uLiBOb3RlIHRoYXQgYWN0aXZpdHkgbXVzdCBoZWFydGJlYXQgdG8gcmVjZWl2ZSBhXG4gICAqICAgY2FuY2VsbGF0aW9uIG5vdGlmaWNhdGlvbi4gVGhpcyBjYW4gYmxvY2sgdGhlIGNhbmNlbGxhdGlvbiBmb3IgYSBsb25nIHRpbWUgaWYgYWN0aXZpdHkgZG9lc24ndFxuICAgKiAgIGhlYXJ0YmVhdCBvciBjaG9vc2VzIHRvIGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QuXG4gICAqIC0gYEFCQU5ET05gIC0gRG8gbm90IHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIHRoZSBhY3Rpdml0eSBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvbiB0byB0aGUgd29ya2Zsb3cuXG4gICAqL1xuICBjYW5jZWxsYXRpb25UeXBlPzogQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlO1xufVxuIiwiaW1wb3J0IHsgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIsIEZhaWx1cmVDb252ZXJ0ZXIgfSBmcm9tICcuL2ZhaWx1cmUtY29udmVydGVyJztcbmltcG9ydCB7IFBheWxvYWRDb2RlYyB9IGZyb20gJy4vcGF5bG9hZC1jb2RlYyc7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciwgUGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQge1xuICBBY3Rpdml0eUZhaWx1cmUsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgQ2FuY2VsbGVkRmFpbHVyZSxcbiAgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsXG4gIGRlY29kZVJldHJ5U3RhdGUsXG4gIGRlY29kZVRpbWVvdXRUeXBlLFxuICBlbmNvZGVSZXRyeVN0YXRlLFxuICBlbmNvZGVUaW1lb3V0VHlwZSxcbiAgRkFJTFVSRV9TT1VSQ0UsXG4gIFByb3RvRmFpbHVyZSxcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJy4uL2ZhaWx1cmUnO1xuaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJy4uL3RpbWUnO1xuaW1wb3J0IHsgYXJyYXlGcm9tUGF5bG9hZHMsIGZyb21QYXlsb2Fkc0F0SW5kZXgsIFBheWxvYWRDb252ZXJ0ZXIsIHRvUGF5bG9hZHMgfSBmcm9tICcuL3BheWxvYWQtY29udmVydGVyJztcblxuZnVuY3Rpb24gY29tYmluZVJlZ0V4cCguLi5yZWdleHBzOiBSZWdFeHBbXSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cHMubWFwKCh4KSA9PiBgKD86JHt4LnNvdXJjZX0pYCkuam9pbignfCcpKTtcbn1cblxuLyoqXG4gKiBTdGFjayB0cmFjZXMgd2lsbCBiZSBjdXRvZmYgd2hlbiBvbiBvZiB0aGVzZSBwYXR0ZXJucyBpcyBtYXRjaGVkXG4gKi9cbmNvbnN0IENVVE9GRl9TVEFDS19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBBY3Rpdml0eSBleGVjdXRpb24gKi9cbiAgL1xccythdCBBY3Rpdml0eVxcLmV4ZWN1dGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIFdvcmtmbG93IGFjdGl2YXRpb24gKi9cbiAgL1xccythdCBBY3RpdmF0b3JcXC5cXFMrTmV4dEhhbmRsZXIgXFwoLipbXFxcXC9dd29ya2Zsb3dbXFxcXC9dKD86c3JjfGxpYilbXFxcXC9daW50ZXJuYWxzXFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIFdvcmtmbG93IHJ1biBhbnl0aGluZyBpbiBjb250ZXh0ICovXG4gIC9cXHMrYXQgU2NyaXB0XFwucnVuSW5Db250ZXh0IFxcKCg/Om5vZGU6dm18dm1cXC5qcyk6XFxkKzpcXGQrXFwpL1xuKTtcblxuLyoqXG4gKiBBbnkgc3RhY2sgdHJhY2UgZnJhbWVzIHRoYXQgbWF0Y2ggYW55IG9mIHRob3NlIHdpbCBiZSBkb3BwZWQuXG4gKiBUaGUgXCJudWxsLlwiIHByZWZpeCBvbiBzb21lIGNhc2VzIGlzIHRvIGF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDI0MTdcbiAqL1xuY29uc3QgRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP25leHQgXFwoLipbXFxcXC9dY29tbW9uW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVyY2VwdG9yc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/ZXhlY3V0ZU5leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQ3V0cyBvdXQgdGhlIGZyYW1ld29yayBwYXJ0IG9mIGEgc3RhY2sgdHJhY2UsIGxlYXZpbmcgb25seSB1c2VyIGNvZGUgZW50cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3V0b2ZmU3RhY2tUcmFjZShzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gKHN0YWNrID8/ICcnKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBhY2MgPSBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChDVVRPRkZfU1RBQ0tfUEFUVEVSTlMudGVzdChsaW5lKSkgYnJlYWs7XG4gICAgaWYgKCFEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUy50ZXN0KGxpbmUpKSBhY2MucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gYWNjLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEEgYEZhaWx1cmVDb252ZXJ0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGZyb20gcHJvdG8gYEZhaWx1cmVgIGluc3RhbmNlcyB0byBKUyBgRXJyb3JzYCBhbmQgYmFjay5cbiAqXG4gKiBXZSByZWNvbW1lbmRlZCB1c2luZyB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpbnN0ZWFkIG9mIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGluIG9yZGVyXG4gKiB0byBtYWludGFpbiBjcm9zcy1sYW5ndWFnZSBGYWlsdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2F1Z2h0IGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlLlxuICAgKi9cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGVycm9yIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYFRlbXBvcmFsRmFpbHVyZWAuXG4gICAqL1xuICBmYWlsdXJlVG9FcnJvcihlcnI6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFRlbXBvcmFsRmFpbHVyZTtcbn1cblxuLyoqXG4gKiBUaGUgXCJzaGFwZVwiIG9mIHRoZSBhdHRyaWJ1dGVzIHNldCBhcyB0aGUge0BsaW5rIFByb3RvRmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlc30gcGF5bG9hZCBpbiBjYXNlXG4gKiB7QGxpbmsgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcy5lbmNvZGVDb21tb25BdHRyaWJ1dGVzfSBpcyBzZXQgdG8gYHRydWVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmF1bHRFbmNvZGVkRmFpbHVyZUF0dHJpYnV0ZXMge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrX3RyYWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHtAbGluayBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5jb2RlIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgKGZvciBlbmNyeXB0aW5nIHRoZXNlIGF0dHJpYnV0ZXMgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30pLlxuICAgKi9cbiAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWZhdWx0LCBjcm9zcy1sYW5ndWFnZS1jb21wYXRpYmxlIEZhaWx1cmUgY29udmVydGVyLlxuICpcbiAqIEJ5IGRlZmF1bHQsIGl0IHdpbGwgbGVhdmUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyBhcyBwbGFpbiB0ZXh0LiBJbiBvcmRlciB0byBlbmNyeXB0IHRoZW0sIHNldFxuICogYGVuY29kZUNvbW1vbkF0dHJpYnV0ZXNgIHRvIGB0cnVlYCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucyBhbmQgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30gdGhhdCBjYW4gZW5jcnlwdCAvXG4gKiBkZWNyeXB0IFBheWxvYWRzIGluIHlvdXIge0BsaW5rIFdvcmtlck9wdGlvbnMuZGF0YUNvbnZlcnRlciB8IFdvcmtlcn0gYW5kXG4gKiB7QGxpbmsgQ2xpZW50T3B0aW9ucy5kYXRhQ29udmVydGVyIHwgQ2xpZW50IG9wdGlvbnN9LlxuICovXG5leHBvcnQgY2xhc3MgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIgaW1wbGVtZW50cyBGYWlsdXJlQ29udmVydGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogUGFydGlhbDxEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnM+KSB7XG4gICAgY29uc3QgeyBlbmNvZGVDb21tb25BdHRyaWJ1dGVzIH0gPSBvcHRpb25zID8/IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGVuY29kZUNvbW1vbkF0dHJpYnV0ZXM6IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgPz8gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogRG9lcyBub3Qgc2V0IGNvbW1vbiBwcm9wZXJ0aWVzLCB0aGF0IGlzIGRvbmUgaW4ge0BsaW5rIGZhaWx1cmVUb0Vycm9yfS5cbiAgICovXG4gIGZhaWx1cmVUb0Vycm9ySW5uZXIoZmFpbHVyZTogUHJvdG9GYWlsdXJlLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogVGVtcG9yYWxGYWlsdXJlIHtcbiAgICBpZiAoZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLnR5cGUsXG4gICAgICAgIEJvb2xlYW4oZmFpbHVyZS5hcHBsaWNhdGlvbkZhaWx1cmVJbmZvLm5vblJldHJ5YWJsZSksXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5kZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBCb29sZWFuKGZhaWx1cmUuc2VydmVyRmFpbHVyZUluZm8ubm9uUmV0cnlhYmxlKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBUaW1lb3V0RmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZnJvbVBheWxvYWRzQXRJbmRleChwYXlsb2FkQ29udmVydGVyLCAwLCBmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mby5sYXN0SGVhcnRiZWF0RGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICBkZWNvZGVUaW1lb3V0VHlwZShmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mby50aW1lb3V0VHlwZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnRlcm1pbmF0ZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtaW5hdGVkRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGVkRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5jYW5jZWxlZEZhaWx1cmVJbmZvLmRldGFpbHM/LnBheWxvYWRzKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnJlc2V0V29ya2Zsb3dGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICdSZXNldFdvcmtmbG93JyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5jaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIGNvbnN0IHsgbmFtZXNwYWNlLCB3b3JrZmxvd1R5cGUsIHdvcmtmbG93RXhlY3V0aW9uLCByZXRyeVN0YXRlIH0gPSBmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbztcbiAgICAgIGlmICghKHdvcmtmbG93VHlwZT8ubmFtZSAmJiB3b3JrZmxvd0V4ZWN1dGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhdHRyaWJ1dGVzIG9uIGNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBDaGlsZFdvcmtmbG93RmFpbHVyZShcbiAgICAgICAgbmFtZXNwYWNlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb24sXG4gICAgICAgIHdvcmtmbG93VHlwZS5uYW1lLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKHJldHJ5U3RhdGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mbykge1xuICAgICAgaWYgKCFmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlUeXBlPy5uYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZpdHlUeXBlPy5uYW1lIG9uIGFjdGl2aXR5RmFpbHVyZUluZm8nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQWN0aXZpdHlGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlUeXBlLm5hbWUsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eUlkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZGVjb2RlUmV0cnlTdGF0ZShmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8ucmV0cnlTdGF0ZSksXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5pZGVudGl0eSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlbXBvcmFsRmFpbHVyZShcbiAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICk7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBUZW1wb3JhbEZhaWx1cmUge1xuICAgIGlmIChmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhdHRycyA9IHBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQ8RGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcz4oZmFpbHVyZS5lbmNvZGVkQXR0cmlidXRlcyk7XG4gICAgICAvLyBEb24ndCBhcHBseSBlbmNvZGVkQXR0cmlidXRlcyB1bmxlc3MgdGhleSBjb25mb3JtIHRvIGFuIGV4cGVjdGVkIHNjaGVtYVxuICAgICAgaWYgKHR5cGVvZiBhdHRycyA9PT0gJ29iamVjdCcgJiYgYXR0cnMgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja190cmFjZSB9ID0gYXR0cnM7XG4gICAgICAgIC8vIEF2b2lkIG11dGF0aW5nIHRoZSBhcmd1bWVudFxuICAgICAgICBmYWlsdXJlID0geyAuLi5mYWlsdXJlIH07XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhY2tfdHJhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZmFpbHVyZS5zdGFja1RyYWNlID0gc3RhY2tfdHJhY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcklubmVyKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIpO1xuICAgIGVyci5zdGFjayA9IGZhaWx1cmUuc3RhY2tUcmFjZSA/PyAnJztcbiAgICBlcnIuZmFpbHVyZSA9IGZhaWx1cmU7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFByb3RvRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IHRoaXMuZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnIsIHBheWxvYWRDb252ZXJ0ZXIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jb2RlQ29tbW9uQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja1RyYWNlIH0gPSBmYWlsdXJlO1xuICAgICAgZmFpbHVyZS5tZXNzYWdlID0gJ0VuY29kZWQgZmFpbHVyZSc7XG4gICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSAnJztcbiAgICAgIGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlOiBzdGFja1RyYWNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlSW5uZXIoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICBpZiAoZXJyLmZhaWx1cmUpIHJldHVybiBlcnIuZmFpbHVyZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICBzdGFja1RyYWNlOiBjdXRvZmZTdGFja1RyYWNlKGVyci5zdGFjayksXG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZShlcnIuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpLFxuICAgICAgICBzb3VyY2U6IEZBSUxVUkVfU09VUkNFLFxuICAgICAgfTtcblxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFjdGl2aXR5RmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgYWN0aXZpdHlGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgLi4uZXJyLFxuICAgICAgICAgICAgcmV0cnlTdGF0ZTogZW5jb2RlUmV0cnlTdGF0ZShlcnIucmV0cnlTdGF0ZSksXG4gICAgICAgICAgICBhY3Rpdml0eVR5cGU6IHsgbmFtZTogZXJyLmFjdGl2aXR5VHlwZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgLi4uZXJyLFxuICAgICAgICAgICAgcmV0cnlTdGF0ZTogZW5jb2RlUmV0cnlTdGF0ZShlcnIucmV0cnlTdGF0ZSksXG4gICAgICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvbjogZXJyLmV4ZWN1dGlvbixcbiAgICAgICAgICAgIHdvcmtmbG93VHlwZTogeyBuYW1lOiBlcnIud29ya2Zsb3dUeXBlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFwcGxpY2F0aW9uRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgICAgbm9uUmV0cnlhYmxlOiBlcnIubm9uUmV0cnlhYmxlLFxuICAgICAgICAgICAgZGV0YWlsczpcbiAgICAgICAgICAgICAgZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB7IHBheWxvYWRzOiB0b1BheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIC4uLmVyci5kZXRhaWxzKSB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBuZXh0UmV0cnlEZWxheTogbXNPcHRpb25hbFRvVHMoZXJyLm5leHRSZXRyeURlbGF5KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIENhbmNlbGxlZEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGNhbmNlbGVkRmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIGRldGFpbHM6XG4gICAgICAgICAgICAgIGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLmxlbmd0aFxuICAgICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCAuLi5lcnIuZGV0YWlscykgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGltZW91dEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRpbWVvdXRGYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgdGltZW91dFR5cGU6IGVuY29kZVRpbWVvdXRUeXBlKGVyci50aW1lb3V0VHlwZSksXG4gICAgICAgICAgICBsYXN0SGVhcnRiZWF0RGV0YWlsczogZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzXG4gICAgICAgICAgICAgID8geyBwYXlsb2FkczogdG9QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBlcnIubGFzdEhlYXJ0YmVhdERldGFpbHMpIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBTZXJ2ZXJGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBzZXJ2ZXJGYWlsdXJlSW5mbzogeyBub25SZXRyeWFibGU6IGVyci5ub25SZXRyeWFibGUgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZXJtaW5hdGVkRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgdGVybWluYXRlZEZhaWx1cmVJbmZvOiB7fSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIEp1c3QgYSBUZW1wb3JhbEZhaWx1cmVcbiAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJhc2UgPSB7XG4gICAgICBzb3VyY2U6IEZBSUxVUkVfU09VUkNFLFxuICAgIH07XG5cbiAgICBpZiAoaXNFcnJvcihlcnIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBtZXNzYWdlOiBTdHJpbmcoZXJyLm1lc3NhZ2UpID8/ICcnLFxuICAgICAgICBzdGFja1RyYWNlOiBjdXRvZmZTdGFja1RyYWNlKGVyci5zdGFjayksXG4gICAgICAgIGNhdXNlOiB0aGlzLm9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZSgoZXJyIGFzIGFueSkuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvbW1lbmRhdGlvbiA9IGAgW0Egbm9uLUVycm9yIHZhbHVlIHdhcyB0aHJvd24gZnJvbSB5b3VyIGNvZGUuIFdlIHJlY29tbWVuZCB0aHJvd2luZyBFcnJvciBvYmplY3RzIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUgYSBzdGFjayB0cmFjZV1gO1xuXG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBtZXNzYWdlOiBlcnIgKyByZWNvbW1lbmRhdGlvbiB9O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgbWVzc2FnZSA9IFN0cmluZyhlcnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogbWVzc2FnZSArIHJlY29tbWVuZGF0aW9uIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogU3RyaW5nKGVycikgKyByZWNvbW1lbmRhdGlvbiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0IGlmIGRlZmluZWQgb3IgcmV0dXJucyB1bmRlZmluZWQuXG4gICAqL1xuICBvcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoXG4gICAgZmFpbHVyZTogUHJvdG9GYWlsdXJlIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyXG4gICk6IFRlbXBvcmFsRmFpbHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZhaWx1cmUgPyB0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIGlmIGRlZmluZWQgb3IgcmV0dXJucyB1bmRlZmluZWRcbiAgICovXG4gIG9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBlcnIgPyB0aGlzLmVycm9yVG9GYWlsdXJlKGVyciwgcGF5bG9hZENvbnZlcnRlcikgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBgUGF5bG9hZENvZGVjYCBpcyBhbiBvcHRpb25hbCBzdGVwIHRoYXQgaGFwcGVucyBiZXR3ZWVuIHRoZSB3aXJlIGFuZCB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIFRlbXBvcmFsIFNlcnZlciA8LS0+IFdpcmUgPC0tPiBgUGF5bG9hZENvZGVjYCA8LS0+IGBQYXlsb2FkQ29udmVydGVyYCA8LS0+IFVzZXIgY29kZVxuICpcbiAqIEltcGxlbWVudCB0aGlzIHRvIHRyYW5zZm9ybSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHRvL2Zyb20gdGhlIGZvcm1hdCBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHN0b3JlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBDb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29kZWMge1xuICAvKipcbiAgICogRW5jb2RlIGFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkfXMgZm9yIHNlbmRpbmcgb3ZlciB0aGUgd2lyZS5cbiAgICogQHBhcmFtIHBheWxvYWRzIE1heSBoYXZlIGxlbmd0aCAwLlxuICAgKi9cbiAgZW5jb2RlKHBheWxvYWRzOiBQYXlsb2FkW10pOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSk6IFByb21pc2U8UGF5bG9hZFtdPjtcbn1cbiIsImltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHsgUGF5bG9hZENvbnZlcnRlckVycm9yLCBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGVuY29kaW5nS2V5cywgZW5jb2RpbmdUeXBlcywgTUVUQURBVEFfRU5DT0RJTkdfS0VZIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBkYXRhIGxpa2UgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGlzIGNhbGxlZCBpbnNpZGUgdGhlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9kZXRlcm1pbmlzbSB8IFdvcmtmbG93IGlzb2xhdGV9LlxuICogVG8gd3JpdGUgYXN5bmMgY29kZSBvciB1c2UgTm9kZSBBUElzIChvciB1c2UgcGFja2FnZXMgdGhhdCB1c2UgTm9kZSBBUElzKSwgdXNlIGEge0BsaW5rIFBheWxvYWRDb2RlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZENvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuIEV4YW1wbGUgdmFsdWVzIGluY2x1ZGUgdGhlIFdvcmtmbG93IGFyZ3Mgc2VudCBmcm9tIHRoZSBDbGllbnQgYW5kIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYSBXb3JrZmxvdyBvciBBY3Rpdml0eS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogU2hvdWxkIHRocm93IHtAbGluayBWYWx1ZUVycm9yfSBpZiB1bmFibGUgdG8gY29udmVydC5cbiAgICovXG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEge0BsaW5rIFBheWxvYWR9IGJhY2sgdG8gYSB2YWx1ZS5cbiAgICovXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgY29udmVyc2lvbiBvZiBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSB2YWx1ZXMgSlMgdmFsdWVzIHRvIGNvbnZlcnQgdG8gUGF5bG9hZHNcbiAqIEByZXR1cm4gbGlzdCBvZiB7QGxpbmsgUGF5bG9hZH1zXG4gKiBAdGhyb3dzIHtAbGluayBWYWx1ZUVycm9yfSBpZiBjb252ZXJzaW9uIG9mIHRoZSB2YWx1ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIGZhaWxlZCBmb3IgYW55XG4gKiAgICAgcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXlsb2Fkcyhjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIC4uLnZhbHVlczogdW5rbm93bltdKTogUGF5bG9hZFtdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlcy5tYXAoKHZhbHVlKSA9PiBjb252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlKSk7XG59XG5cbi8qKlxuICogUnVuIHtAbGluayBQYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZH0gb24gZWFjaCB2YWx1ZSBpbiB0aGUgbWFwLlxuICpcbiAqIEB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgYW55IHZhbHVlIGluIHRoZSBtYXAgZmFpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvUGF5bG9hZHM8SyBleHRlbmRzIHN0cmluZz4oY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBtYXA6IFJlY29yZDxLLCBhbnk+KTogUmVjb3JkPEssIFBheWxvYWQ+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXApLm1hcCgoW2ssIHZdKTogW0ssIFBheWxvYWRdID0+IFtrIGFzIEssIGNvbnZlcnRlci50b1BheWxvYWQodildKVxuICApIGFzIFJlY29yZDxLLCBQYXlsb2FkPjtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGNvbnZlcnNpb24gb2YgYW4gYXJyYXkgb2YgdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlcy4gVXNlZnVsIGZvciBkZXNlcmlhbGl6aW5nXG4gKiBhcmd1bWVudHMgb2YgZnVuY3Rpb24gaW52b2NhdGlvbnMuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlclxuICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSB2YWx1ZSBpbiB0aGUgcGF5bG9hZHNcbiAqIEBwYXJhbSBwYXlsb2FkcyBzZXJpYWxpemVkIHZhbHVlIHRvIGNvbnZlcnQgdG8gSlMgdmFsdWVzLlxuICogQHJldHVybiBjb252ZXJ0ZWQgSlMgdmFsdWVcbiAqIEB0aHJvd3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJFcnJvcn0gaWYgY29udmVyc2lvbiBvZiB0aGUgZGF0YSBwYXNzZWQgYXMgcGFyYW1ldGVyIGZhaWxlZCBmb3IgYW55XG4gKiAgICAgcmVhc29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVBheWxvYWRzQXRJbmRleDxUPihjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIGluZGV4OiBudW1iZXIsIHBheWxvYWRzPzogUGF5bG9hZFtdIHwgbnVsbCk6IFQge1xuICAvLyBUbyBtYWtlIGFkZGluZyBhcmd1bWVudHMgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBjaGFuZ2VcbiAgaWYgKHBheWxvYWRzID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZHMgPT09IG51bGwgfHwgaW5kZXggPj0gcGF5bG9hZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2Fkc1tpbmRleF0pO1xufVxuXG4vKipcbiAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZH0gb24gZWFjaCB2YWx1ZSBpbiB0aGUgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUZyb21QYXlsb2Fkcyhjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsIHBheWxvYWRzPzogUGF5bG9hZFtdIHwgbnVsbCk6IHVua25vd25bXSB7XG4gIGlmICghcGF5bG9hZHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIHBheWxvYWRzLm1hcCgocGF5bG9hZDogUGF5bG9hZCkgPT4gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEZyb21QYXlsb2FkczxLIGV4dGVuZHMgc3RyaW5nPihcbiAgY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICBtYXA/OiBSZWNvcmQ8SywgUGF5bG9hZD4gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8SywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAobWFwID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCBwYXlsb2FkXSk6IFtLLCB1bmtub3duXSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkIGFzIFBheWxvYWQpO1xuICAgICAgcmV0dXJuIFtrIGFzIEssIHZhbHVlXTtcbiAgICB9KVxuICApIGFzIFJlY29yZDxLLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LCBvciBgdW5kZWZpbmVkYCBpZiB1bmFibGUgdG8gY29udmVydC5cbiAgICovXG4gIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEge0BsaW5rIFBheWxvYWR9IGJhY2sgdG8gYSB2YWx1ZS5cbiAgICovXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUO1xuXG4gIHJlYWRvbmx5IGVuY29kaW5nVHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyaWVzIHRvIGNvbnZlcnQgdmFsdWVzIHRvIHtAbGluayBQYXlsb2FkfXMgdXNpbmcgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nfXMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBpbiB0aGUgb3JkZXIgcHJvdmlkZWQuXG4gKlxuICogQ29udmVydHMgUGF5bG9hZHMgdG8gdmFsdWVzIGJhc2VkIG9uIHRoZSBgUGF5bG9hZC5tZXRhZGF0YS5lbmNvZGluZ2AgZmllbGQsIHdoaWNoIG1hdGNoZXMgdGhlIHtAbGluayBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nLmVuY29kaW5nVHlwZX1cbiAqIG9mIHRoZSBjb252ZXJ0ZXIgdGhhdCBjcmVhdGVkIHRoZSBQYXlsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICByZWFkb25seSBjb252ZXJ0ZXJzOiBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nW107XG4gIHJlYWRvbmx5IGNvbnZlcnRlckJ5RW5jb2Rpbmc6IE1hcDxzdHJpbmcsIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmc+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXSkge1xuICAgIGlmIChjb252ZXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFBheWxvYWRDb252ZXJ0ZXJFcnJvcignTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJ0ZXJzID0gY29udmVydGVycztcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlckJ5RW5jb2Rpbmcuc2V0KGNvbnZlcnRlci5lbmNvZGluZ1R5cGUsIGNvbnZlcnRlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJ1biBgLnRvUGF5bG9hZCh2YWx1ZSlgIG9uIGVhY2ggY29udmVydGVyIGluIHRoZSBvcmRlciBwcm92aWRlZCBhdCBjb25zdHJ1Y3Rpb24uXG4gICAqIFJldHVybnMgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0LCB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHRoZXJlIGlzIG5vIGNvbnZlcnRlciB0aGF0IGNhbiBoYW5kbGUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIHRvUGF5bG9hZDxUPih2YWx1ZTogVCk6IFBheWxvYWQge1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIHRoaXMuY29udmVydGVycykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgJHt2YWx1ZX0gdG8gcGF5bG9hZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZy5mcm9tUGF5bG9hZH0gYmFzZWQgb24gdGhlIGBlbmNvZGluZ2AgbWV0YWRhdGEgb2YgdGhlIHtAbGluayBQYXlsb2FkfS5cbiAgICovXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkLm1ldGFkYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuICAgIGNvbnN0IGVuY29kaW5nID0gZGVjb2RlKHBheWxvYWQubWV0YWRhdGFbTUVUQURBVEFfRU5DT0RJTkdfS0VZXSk7XG4gICAgY29uc3QgY29udmVydGVyID0gdGhpcy5jb252ZXJ0ZXJCeUVuY29kaW5nLmdldChlbmNvZGluZyk7XG4gICAgaWYgKGNvbnZlcnRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5rbm93biBlbmNvZGluZzogJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gSlMgdW5kZWZpbmVkIGFuZCBOVUxMIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTDtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihfY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55OyAvLyBKdXN0IHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGJldHdlZW4gYmluYXJ5IGRhdGEgdHlwZXMgYW5kIFJBVyBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW5hcnlQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1JBVztcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19SQVcsXG4gICAgICB9LFxuICAgICAgZGF0YTogdmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIFdyYXAgd2l0aCBVaW50OEFycmF5IGZyb20gdGhpcyBjb250ZXh0IHRvIGVuc3VyZSBgaW5zdGFuY2VvZmAgd29ya3NcbiAgICAgIChcbiAgICAgICAgY29udGVudC5kYXRhID8gbmV3IFVpbnQ4QXJyYXkoY29udGVudC5kYXRhLmJ1ZmZlciwgY29udGVudC5kYXRhLmJ5dGVPZmZzZXQsIGNvbnRlbnQuZGF0YS5sZW5ndGgpIDogY29udGVudC5kYXRhXG4gICAgICApIGFzIGFueVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIG5vbi11bmRlZmluZWQgdmFsdWVzIGFuZCBzZXJpYWxpemVkIEpTT04gUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgSnNvblBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyV2l0aEVuY29kaW5nIHtcbiAgcHVibGljIGVuY29kaW5nVHlwZSA9IGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTjtcblxuICBwdWJsaWMgdG9QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgbGV0IGpzb247XG4gICAgdHJ5IHtcbiAgICAgIGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgW01FVEFEQVRBX0VOQ09ESU5HX0tFWV06IGVuY29kaW5nS2V5cy5NRVRBREFUQV9FTkNPRElOR19KU09OLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IGVuY29kZShqc29uKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KGNvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAoY29udGVudC5kYXRhID09PSB1bmRlZmluZWQgfHwgY29udGVudC5kYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignR290IHBheWxvYWQgd2l0aCBubyBkYXRhJyk7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZShjb250ZW50LmRhdGEpKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIFNlYXJjaCBBdHRyaWJ1dGUgdmFsdWVzIHVzaW5nIEpzb25QYXlsb2FkQ29udmVydGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKTtcbiAgdmFsaWROb25EYXRlVHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuXG4gIHB1YmxpYyB0b1BheWxvYWQodmFsdWVzOiB1bmtub3duKTogUGF5bG9hZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBTZWFyY2hBdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHR5cGVvZiBmaXJzdFZhbHVlO1xuICAgICAgaWYgKGZpcnN0VHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBbaWR4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgU2VhcmNoQXR0cmlidXRlIHZhbHVlcyBtdXN0IGFycmF5cyBvZiBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb3IgRGF0ZXMuIFRoZSB2YWx1ZSAke3ZhbHVlfSBhdCBpbmRleCAke2lkeH0gaXMgb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkTm9uRGF0ZVR5cGVzLmluY2x1ZGVzKGZpcnN0VHlwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgU2VhcmNoQXR0cmlidXRlIGFycmF5IHZhbHVlcyBtdXN0IGJlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBbaWR4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IGZpcnN0VHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBBbGwgU2VhcmNoQXR0cmlidXRlIGFycmF5IHZhbHVlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBmaXJzdCB2YWx1ZSAke2ZpcnN0VmFsdWV9IG9mIHR5cGUgJHtmaXJzdFR5cGV9IGRvZXNuJ3QgbWF0Y2ggdmFsdWUgJHt2YWx1ZX0gb2YgdHlwZSAke3R5cGVvZiB2YWx1ZX0gYXQgaW5kZXggJHtpZHh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKU09OLnN0cmluZ2lmeSB0YWtlcyBjYXJlIG9mIGNvbnZlcnRpbmcgRGF0ZXMgdG8gSVNPIHN0cmluZ3NcbiAgICBjb25zdCByZXQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKHZhbHVlcyk7XG4gICAgaWYgKHJldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgc2VhcmNoIGF0dHJpYnV0ZXMgdG8gcGF5bG9hZHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRldGltZSBTZWFyY2ggQXR0cmlidXRlIHZhbHVlcyBhcmUgY29udmVydGVkIHRvIGBEYXRlYHNcbiAgICovXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihwYXlsb2FkOiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKHBheWxvYWQubWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBwYXlsb2FkLm1ldGFkYXRhID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmpzb25Db252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gICAgbGV0IGFycmF5V3JhcHBlZFZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBjb25zdCBzZWFyY2hBdHRyaWJ1dGVUeXBlID0gZGVjb2RlKHBheWxvYWQubWV0YWRhdGEudHlwZSk7XG4gICAgaWYgKHNlYXJjaEF0dHJpYnV0ZVR5cGUgPT09ICdEYXRldGltZScpIHtcbiAgICAgIGFycmF5V3JhcHBlZFZhbHVlID0gYXJyYXlXcmFwcGVkVmFsdWUubWFwKChkYXRlU3RyaW5nKSA9PiBuZXcgRGF0ZShkYXRlU3RyaW5nKSk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVdyYXBwZWRWYWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcigpO1xuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgZXh0ZW5kcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIHtcbiAgLy8gTWF0Y2ggdGhlIG9yZGVyIHVzZWQgaW4gb3RoZXIgU0RLcywgYnV0IGV4Y2x1ZGUgUHJvdG9idWYgY29udmVydGVycyBzbyB0aGF0IHRoZSBjb2RlLCBpbmNsdWRpbmdcbiAgLy8gYHByb3RvMy1qc29uLXNlcmlhbGl6ZXJgLCBkb2Vzbid0IHRha2Ugc3BhY2UgaW4gV29ya2Zsb3cgYnVuZGxlcyB0aGF0IGRvbid0IHVzZSBQcm90b2J1ZnMuIFRvIHVzZSBQcm90b2J1ZnMsIHVzZVxuICAvLyB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJXaXRoUHJvdG9idWZzfS5cbiAgLy9cbiAgLy8gR28gU0RLOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVtcG9yYWxpby9zZGstZ28vYmxvYi81ZTU2NDVmMGM1NTBkY2Y3MTdjMDk1YWUzMmM3NmE3MDg3ZDJlOTg1L2NvbnZlcnRlci9kZWZhdWx0X2RhdGFfY29udmVydGVyLmdvI0wyOFxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihuZXcgVW5kZWZpbmVkUGF5bG9hZENvbnZlcnRlcigpLCBuZXcgQmluYXJ5UGF5bG9hZENvbnZlcnRlcigpLCBuZXcgSnNvblBheWxvYWRDb252ZXJ0ZXIoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0gdXNlZCBieSB0aGUgU0RLLiBTdXBwb3J0cyBgVWludDhBcnJheWAgYW5kIEpTT04gc2VyaWFsaXphYmxlcyAoc28gaWZcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9KU09OL3N0cmluZ2lmeSNkZXNjcmlwdGlvbiB8IGBKU09OLnN0cmluZ2lmeSh5b3VyQXJnT3JSZXR2YWwpYH1cbiAqIHdvcmtzLCB0aGUgZGVmYXVsdCBwYXlsb2FkIGNvbnZlcnRlciB3aWxsIHdvcmspLlxuICpcbiAqIFRvIGFsc28gc3VwcG9ydCBQcm90b2J1ZnMsIGNyZWF0ZSBhIGN1c3RvbSBwYXlsb2FkIGNvbnZlcnRlciB3aXRoIHtAbGluayBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcn06XG4gKlxuICogYGNvbnN0IG15Q29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKHsgcHJvdG9idWZSb290IH0pYFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIoKTtcbiIsImltcG9ydCB7IGVuY29kZSB9IGZyb20gJy4uL2VuY29kaW5nJztcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX0VOQ09ESU5HX0tFWSA9ICdlbmNvZGluZyc7XG5leHBvcnQgY29uc3QgZW5jb2RpbmdUeXBlcyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogJ2JpbmFyeS9udWxsJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiAnYmluYXJ5L3BsYWluJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogJ2pzb24vcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRl9KU09OOiAnanNvbi9wcm90b2J1ZicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiAnYmluYXJ5L3Byb3RvYnVmJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBFbmNvZGluZ1R5cGUgPSAodHlwZW9mIGVuY29kaW5nVHlwZXMpW2tleW9mIHR5cGVvZiBlbmNvZGluZ1R5cGVzXTtcblxuZXhwb3J0IGNvbnN0IGVuY29kaW5nS2V5cyA9IHtcbiAgTUVUQURBVEFfRU5DT0RJTkdfTlVMTDogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfTlVMTCksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1JBVzogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046IGVuY29kZShlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT04pLFxuICBNRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUYpLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX01FU1NBR0VfVFlQRV9LRVkgPSAnbWVzc2FnZVR5cGUnO1xuIiwiaW1wb3J0ICogYXMgdGltZSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHsgdHlwZSBUaW1lc3RhbXAsIER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5vcHRpb25hbFRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gdGltZS50c1RvTXModHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc051bWJlclRvVHMobWlsbGlzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc1RvVHMoc3RyKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUubXNPcHRpb25hbFRvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lLm1zVG9OdW1iZXIodmFsKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gdGltZS50c1RvRGF0ZSh0cyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvRGF0ZSh0cyk7XG59XG4iLCIvLyBQYXN0ZWQgd2l0aCBtb2RpZmljYXRpb25zIGZyb206IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbm9ueWNvL0Zhc3Rlc3RTbWFsbGVzdFRleHRFbmNvZGVyRGVjb2Rlci9tYXN0ZXIvRW5jb2RlckRlY29kZXJUb2dldGhlci5zcmMuanNcbi8qIGVzbGludCBuby1mYWxsdGhyb3VnaDogMCAqL1xuXG5jb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuY29uc3QgZW5jb2RlclJlZ2V4cCA9IC9bXFx4ODAtXFx1RDdmZlxcdURDMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXT8vZztcbmNvbnN0IHRtcEJ1ZmZlclUxNiA9IG5ldyBVaW50MTZBcnJheSgzMik7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RGVjb2RlciB7XG4gIGRlY29kZShpbnB1dEFycmF5T3JCdWZmZXI6IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlciB8IFNoYXJlZEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnB1dEFzOCA9IGlucHV0QXJyYXlPckJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBpbnB1dEFycmF5T3JCdWZmZXIgOiBuZXcgVWludDhBcnJheShpbnB1dEFycmF5T3JCdWZmZXIpO1xuXG4gICAgbGV0IHJlc3VsdGluZ1N0cmluZyA9ICcnLFxuICAgICAgdG1wU3RyID0gJycsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBuZXh0RW5kID0gMCxcbiAgICAgIGNwMCA9IDAsXG4gICAgICBjb2RlUG9pbnQgPSAwLFxuICAgICAgbWluQml0cyA9IDAsXG4gICAgICBjcDEgPSAwLFxuICAgICAgcG9zID0gMCxcbiAgICAgIHRtcCA9IC0xO1xuICAgIGNvbnN0IGxlbiA9IGlucHV0QXM4Lmxlbmd0aCB8IDA7XG4gICAgY29uc3QgbGVuTWludXMzMiA9IChsZW4gLSAzMikgfCAwO1xuICAgIC8vIE5vdGUgdGhhdCB0bXAgcmVwcmVzZW50cyB0aGUgMm5kIGhhbGYgb2YgYSBzdXJyb2dhdGUgcGFpciBpbmNhc2UgYSBzdXJyb2dhdGUgZ2V0cyBkaXZpZGVkIGJldHdlZW4gYmxvY2tzXG4gICAgZm9yICg7IGluZGV4IDwgbGVuOyApIHtcbiAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgIGZvciAoOyBwb3MgPCBuZXh0RW5kOyBpbmRleCA9IChpbmRleCArIDEpIHwgMCwgcG9zID0gKHBvcyArIDEpIHwgMCkge1xuICAgICAgICBjcDAgPSBpbnB1dEFzOFtpbmRleF0gJiAweGZmO1xuICAgICAgICBzd2l0Y2ggKGNwMCA+PiA0KSB7XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGlmIChjcDEgPj4gNiAhPT0gMGIxMCB8fCAwYjExMTEwMTExIDwgY3AwKSB7XG4gICAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IC0gMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvZGVQb2ludCA9ICgoY3AwICYgMGIxMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IDU7IC8vIDIwIGVuc3VyZXMgaXQgbmV2ZXIgcGFzc2VzIC0+IGFsbCBpbnZhbGlkIHJlcGxhY2VtZW50c1xuICAgICAgICAgICAgY3AwID0gMHgxMDA7IC8vICBrZWVwIHRyYWNrIG9mIHRoIGJpdCBzaXplXG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMSkgPDwgNikgfCAoY3AxICYgMGIwMDExMTExMSk7XG4gICAgICAgICAgICBtaW5CaXRzID0gY3AxID4+IDYgPT09IDBiMTAgPyAobWluQml0cyArIDQpIHwgMCA6IDI0OyAvLyAyNCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IChjcDAgKyAweDEwMCkgJiAweDMwMDsgLy8ga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IChtaW5CaXRzICsgNykgfCAwO1xuXG4gICAgICAgICAgICAvLyBOb3csIHByb2Nlc3MgdGhlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbiAmJiBjcDEgPj4gNiA9PT0gMGIxMCAmJiBjb2RlUG9pbnQgPj4gbWluQml0cyAmJiBjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjcDAgPSBjb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IChjb2RlUG9pbnQgLSAweDEwMDAwKSB8IDA7XG4gICAgICAgICAgICAgIGlmICgwIDw9IGNvZGVQb2ludCAvKjB4ZmZmZiA8IGNvZGVQb2ludCovKSB7XG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICAvL25leHRFbmQgPSBuZXh0RW5kIC0gMXwwO1xuXG4gICAgICAgICAgICAgICAgdG1wID0gKChjb2RlUG9pbnQgPj4gMTApICsgMHhkODAwKSB8IDA7IC8vIGhpZ2hTdXJyb2dhdGVcbiAgICAgICAgICAgICAgICBjcDAgPSAoKGNvZGVQb2ludCAmIDB4M2ZmKSArIDB4ZGMwMCkgfCAwOyAvLyBsb3dTdXJyb2dhdGUgKHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIgaW4gdGhlIHN3aXRjaC1zdGF0ZW1lbnQpXG5cbiAgICAgICAgICAgICAgICBpZiAocG9zIDwgMzEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGljZSAzMSBpbnN0ZWFkIG9mIDMyXG4gICAgICAgICAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHBvcyA9IChwb3MgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgICB0bXAgPSAtMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gZWxzZSwgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0QXM4IGFuZCBsZXQgdG1wMCBiZSBmaWxsZWQgaW4gbGF0ZXIgb25cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEUgdGhhdCBjcDEgaXMgYmVpbmcgdXNlZCBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgdGhlIHN3YXBwaW5nIG9mIHRtcCB3aXRoIGNwMFxuICAgICAgICAgICAgICAgICAgY3AxID0gdG1wO1xuICAgICAgICAgICAgICAgICAgdG1wID0gY3AwO1xuICAgICAgICAgICAgICAgICAgY3AwID0gY3AxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIG5leHRFbmQgPSAobmV4dEVuZCArIDEpIHwgMDsgLy8gYmVjYXVzZSB3ZSBhcmUgYWR2YW5jaW5nIGkgd2l0aG91dCBhZHZhbmNpbmcgcG9zXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNvZGUgcG9pbnQgbWVhbnMgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyB3aXRoIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICBjcDAgPj49IDg7XG4gICAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IC0gY3AwIC0gMSkgfCAwOyAvLyByZXNldCBpbmRleCAgYmFjayB0byB3aGF0IGl0IHdhcyBiZWZvcmVcbiAgICAgICAgICAgICAgY3AwID0gMHhmZmZkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5hbGx5LCByZXNldCB0aGUgdmFyaWFibGVzIGZvciB0aGUgbmV4dCBnby1hcm91bmRcbiAgICAgICAgICAgIG1pbkJpdHMgPSAwO1xuICAgICAgICAgICAgY29kZVBvaW50ID0gMDtcbiAgICAgICAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgICAgICAvKmNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNvZGVQb2ludCA/IGNvZGVQb2ludCA9IDAgOiBjcDAgPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IGNwMDtcbiAgICAgICAgICBjb250aW51ZTsqL1xuICAgICAgICAgIGRlZmF1bHQ6IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgfVxuICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IDB4ZmZmZDsgLy8gZmlsbCB3aXRoIGludmFsaWQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICB9XG4gICAgICB0bXBTdHIgKz0gZnJvbUNoYXJDb2RlKFxuICAgICAgICB0bXBCdWZmZXJVMTZbMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls0XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls3XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMV1cbiAgICAgICk7XG4gICAgICBpZiAocG9zIDwgMzIpIHRtcFN0ciA9IHRtcFN0ci5zbGljZSgwLCAocG9zIC0gMzIpIHwgMCk7IC8vLSgzMi1wb3MpKTtcbiAgICAgIGlmIChpbmRleCA8IGxlbikge1xuICAgICAgICAvL2Zyb21DaGFyQ29kZS5hcHBseSgwLCB0bXBCdWZmZXJVMTYgOiBVaW50OEFycmF5ID8gIHRtcEJ1ZmZlclUxNi5zdWJhcnJheSgwLHBvcykgOiB0bXBCdWZmZXJVMTYuc2xpY2UoMCxwb3MpKTtcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdID0gdG1wO1xuICAgICAgICBwb3MgPSB+dG1wID4+PiAzMTsgLy90bXAgIT09IC0xID8gMSA6IDA7XG4gICAgICAgIHRtcCA9IC0xO1xuXG4gICAgICAgIGlmICh0bXBTdHIubGVuZ3RoIDwgcmVzdWx0aW5nU3RyaW5nLmxlbmd0aCkgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRtcCAhPT0gLTEpIHtcbiAgICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZSh0bXApO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRpbmdTdHJpbmcgKz0gdG1wU3RyO1xuICAgICAgdG1wU3RyID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ1N0cmluZztcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gZW5jb2RlclJlcGxhY2VyKG5vbkFzY2lpQ2hhcnM6IHN0cmluZykge1xuICAvLyBtYWtlIHRoZSBVVEYgc3RyaW5nIGludG8gYSBiaW5hcnkgVVRGLTggZW5jb2RlZCBzdHJpbmdcbiAgbGV0IHBvaW50ID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDApIHwgMDtcbiAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgIGNvbnN0IG5leHRjb2RlID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDEpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICBpZiAoMHhkYzAwIDw9IG5leHRjb2RlICYmIG5leHRjb2RlIDw9IDB4ZGZmZikge1xuICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgaWYgKHBvaW50ID4gMHhmZmZmKVxuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCksXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi9cbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfVxuICB9XG4gIC8qaWYgKHBvaW50IDw9IDB4MDA3ZikgcmV0dXJuIG5vbkFzY2lpQ2hhcnM7XG4gIGVsc2UgKi8gaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KSwgKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpKTtcbiAgfSBlbHNlXG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZShcbiAgICAgICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMiksXG4gICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRFbmNvZGVyIHtcbiAgcHVibGljIGVuY29kZShpbnB1dFN0cmluZzogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgLy8gMHhjMCA9PiAwYjExMDAwMDAwOyAweGZmID0+IDBiMTExMTExMTE7IDB4YzAtMHhmZiA9PiAwYjExeHh4eHh4XG4gICAgLy8gMHg4MCA9PiAwYjEwMDAwMDAwOyAweGJmID0+IDBiMTAxMTExMTE7IDB4ODAtMHhiZiA9PiAwYjEweHh4eHh4XG4gICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGlucHV0U3RyaW5nID09PSB2b2lkIDAgPyAnJyA6ICcnICsgaW5wdXRTdHJpbmcsXG4gICAgICBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KCgobGVuIDw8IDEpICsgOCkgfCAwKTtcbiAgICBsZXQgdG1wUmVzdWx0OiBVaW50OEFycmF5O1xuICAgIGxldCBpID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICBwb2ludCA9IDAsXG4gICAgICBuZXh0Y29kZSA9IDA7XG4gICAgbGV0IHVwZ3JhZGVkZWRBcnJheVNpemUgPSAhVWludDhBcnJheTsgLy8gbm9ybWFsIGFycmF5cyBhcmUgYXV0by1leHBhbmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpID0gKGkgKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgIHBvaW50ID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgIGlmIChwb2ludCA8PSAweDAwN2YpIHtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSBwb2ludDtcbiAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHgwN2ZmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIDw8IDYpIHwgKHBvaW50ICYgMHgzZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWRlbkNoZWNrOiB7XG4gICAgICAgICAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgICAgICAgICAgaWYgKHBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgICAgICAgICBuZXh0Y29kZSA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdCgoaSA9IChpICsgMSkgfCAwKSkgfCAwOyAvLyBkZWZhdWx0cyB0byAwIHdoZW4gTmFOLCBjYXVzaW5nIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG5cbiAgICAgICAgICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gKChwb2ludCA8PCAxMCkgKyBuZXh0Y29kZSAtIDB4MzVmZGMwMCkgfCAwO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0W3Bvc10gPSAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDEyKSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWsgd2lkZW5DaGVjaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1cGdyYWRlZGVkQXJyYXlTaXplICYmIGkgPDwgMSA8IHBvcyAmJiBpIDw8IDEgPCAoKHBvcyAtIDcpIHwgMCkpIHtcbiAgICAgICAgICAgIHVwZ3JhZGVkZWRBcnJheVNpemUgPSB0cnVlO1xuICAgICAgICAgICAgdG1wUmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuICogMyk7XG4gICAgICAgICAgICB0bXBSZXN1bHQuc2V0KHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0bXBSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4ZSAvKjBiMTExMCovIDw8IDQpIHwgKHBvaW50ID4+IDEyKTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkgPyByZXN1bHQuc3ViYXJyYXkoMCwgcG9zKSA6IHJlc3VsdC5zbGljZSgwLCBwb3MpO1xuICB9XG5cbiAgcHVibGljIGVuY29kZUludG8oaW5wdXRTdHJpbmc6IHN0cmluZywgdThBcnI6IFVpbnQ4QXJyYXkpOiB7IHdyaXR0ZW46IG51bWJlcjsgcmVhZDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAoJycgKyBpbnB1dFN0cmluZykucmVwbGFjZShlbmNvZGVyUmVnZXhwLCBlbmNvZGVyUmVwbGFjZXIpO1xuICAgIGxldCBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoYXIgPSAwLFxuICAgICAgcmVhZCA9IDA7XG4gICAgY29uc3QgdThBcnJMZW4gPSB1OEFyci5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXRTdHJpbmcubGVuZ3RoIHwgMDtcbiAgICBpZiAodThBcnJMZW4gPCBsZW4pIGxlbiA9IHU4QXJyTGVuO1xuICAgIHB1dENoYXJzOiB7XG4gICAgICBmb3IgKDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwKSB7XG4gICAgICAgIGNoYXIgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSkgfCAwO1xuICAgICAgICBzd2l0Y2ggKGNoYXIgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgLy8gZXh0ZW5zaW9uIHBvaW50czpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGlmICgoKGkgKyAxKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgaWYgKCgoaSArIDIpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICAvL2lmICghKGNoYXIgPT09IDB4RUYgJiYgZW5jb2RlZFN0cmluZy5zdWJzdHIoaSsxfDAsMikgPT09IFwiXFx4QkZcXHhCRFwiKSlcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgaWYgKCgoaSArIDMpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhayBwdXRDaGFycztcbiAgICAgICAgfVxuICAgICAgICAvL3JlYWQgPSByZWFkICsgKChjaGFyID4+IDYpICE9PSAyKSB8MDtcbiAgICAgICAgdThBcnJbaV0gPSBjaGFyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB3cml0dGVuOiBpLCByZWFkOiBpbnB1dExlbmd0aCA8IHJlYWQgPyBpbnB1dExlbmd0aCA6IHJlYWQgfTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY29kZSBhIFVURi04IHN0cmluZyBpbnRvIGEgVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBVaW50OEFycmF5IGludG8gYSBVVEYtOCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIFRleHREZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUoYSk7XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLyoqXG4gKiBUaHJvd24gZnJvbSBjb2RlIHRoYXQgcmVjZWl2ZXMgYSB2YWx1ZSB0aGF0IGlzIHVuZXhwZWN0ZWQgb3IgdGhhdCBpdCdzIHVuYWJsZSB0byBoYW5kbGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVmFsdWVFcnJvcicpXG5leHBvcnQgY2xhc3MgVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBQYXlsb2FkIENvbnZlcnRlciBpcyBtaXNjb25maWd1cmVkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1BheWxvYWRDb252ZXJ0ZXJFcnJvcicpXG5leHBvcnQgY2xhc3MgUGF5bG9hZENvbnZlcnRlckVycm9yIGV4dGVuZHMgVmFsdWVFcnJvciB7fVxuXG4vKipcbiAqIFVzZWQgaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBTREsgdG8gbm90ZSB0aGF0IHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcyBoYXBwZW5lZC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdJbGxlZ2FsU3RhdGVFcnJvcicpXG5leHBvcnQgY2xhc3MgSWxsZWdhbFN0YXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgV29ya2Zsb3cgd2l0aCB0aGUgZ2l2ZW4gSWQgaXMgbm90IGtub3duIHRvIFRlbXBvcmFsIFNlcnZlci5cbiAqIEl0IGNvdWxkIGJlIGJlY2F1c2U6XG4gKiAtIElkIHBhc3NlZCBpcyBpbmNvcnJlY3RcbiAqIC0gV29ya2Zsb3cgaXMgY2xvc2VkIChmb3Igc29tZSBjYWxscywgZS5nLiBgdGVybWluYXRlYClcbiAqIC0gV29ya2Zsb3cgd2FzIGRlbGV0ZWQgZnJvbSB0aGUgU2VydmVyIGFmdGVyIHJlYWNoaW5nIGl0cyByZXRlbnRpb24gbGltaXRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd05vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIFdvcmtmbG93Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ05hbWVzcGFjZU5vdEZvdW5kRXJyb3InKVxuZXhwb3J0IGNsYXNzIE5hbWVzcGFjZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHN1cGVyKGBOYW1lc3BhY2Ugbm90IGZvdW5kOiAnJHtuYW1lc3BhY2V9J2ApO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBpc1JlY29yZCwgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG5leHBvcnQgY29uc3QgRkFJTFVSRV9TT1VSQ0UgPSAnVHlwZVNjcmlwdFNESyc7XG5leHBvcnQgdHlwZSBQcm90b0ZhaWx1cmUgPSB0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5JRmFpbHVyZTtcblxuZXhwb3J0IGNvbnN0IFRpbWVvdXRUeXBlID0ge1xuICBTVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcbiAgU0NIRURVTEVfVE9fU1RBUlQ6ICdTQ0hFRFVMRV9UT19TVEFSVCcsXG4gIFNDSEVEVUxFX1RPX0NMT1NFOiAnU0NIRURVTEVfVE9fQ0xPU0UnLFxuICBIRUFSVEJFQVQ6ICdIRUFSVEJFQVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNUQVJUX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU1RBUlRfVE9fQ0xPU0U6ICdTVEFSVF9UT19DTE9TRScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19TVEFSVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX1NUQVJUOiAnU0NIRURVTEVfVE9fU1RBUlQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU0NIRURVTEVfVE9fQ0xPU0V9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TQ0hFRFVMRV9UT19DTE9TRTogJ1NDSEVEVUxFX1RPX0NMT1NFJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEhFQVJUQkVBVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX0hFQVJUQkVBVDogJ0hFQVJUQkVBVCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB1bmRlZmluZWRgIGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgVGltZW91dFR5cGUgPSAodHlwZW9mIFRpbWVvdXRUeXBlKVtrZXlvZiB0eXBlb2YgVGltZW91dFR5cGVdO1xuXG5leHBvcnQgY29uc3QgW2VuY29kZVRpbWVvdXRUeXBlLCBkZWNvZGVUaW1lb3V0VHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlRpbWVvdXRUeXBlLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlRpbWVvdXRUeXBlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlRpbWVvdXRUeXBlLFxuICB0eXBlb2YgVGltZW91dFR5cGUsXG4gICdUSU1FT1VUX1RZUEVfJ1xuPihcbiAge1xuICAgIFtUaW1lb3V0VHlwZS5TVEFSVF9UT19DTE9TRV06IDEsXG4gICAgW1RpbWVvdXRUeXBlLlNDSEVEVUxFX1RPX1NUQVJUXTogMixcbiAgICBbVGltZW91dFR5cGUuU0NIRURVTEVfVE9fQ0xPU0VdOiAzLFxuICAgIFtUaW1lb3V0VHlwZS5IRUFSVEJFQVRdOiA0LFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnVElNRU9VVF9UWVBFXydcbik7XG5cbmV4cG9ydCBjb25zdCBSZXRyeVN0YXRlID0ge1xuICBJTl9QUk9HUkVTUzogJ0lOX1BST0dSRVNTJyxcbiAgTk9OX1JFVFJZQUJMRV9GQUlMVVJFOiAnTk9OX1JFVFJZQUJMRV9GQUlMVVJFJyxcbiAgVElNRU9VVDogJ1RJTUVPVVQnLFxuICBNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQ6ICdNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUQnLFxuICBSRVRSWV9QT0xJQ1lfTk9UX1NFVDogJ1JFVFJZX1BPTElDWV9OT1RfU0VUJyxcbiAgSU5URVJOQUxfU0VSVkVSX0VSUk9SOiAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcbiAgQ0FOQ0VMX1JFUVVFU1RFRDogJ0NBTkNFTF9SRVFVRVNURUQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElOX1BST0dSRVNTfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9JTl9QUk9HUkVTUzogJ0lOX1BST0dSRVNTJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE5PTl9SRVRSWUFCTEVfRkFJTFVSRX0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfTk9OX1JFVFJZQUJMRV9GQUlMVVJFOiAnTk9OX1JFVFJZQUJMRV9GQUlMVVJFJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFRJTUVPVVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1RJTUVPVVQ6ICdUSU1FT1VUJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRH0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEOiAnTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFVFJZX1BPTElDWV9OT1RfU0VUfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9SRVRSWV9QT0xJQ1lfTk9UX1NFVDogJ1JFVFJZX1BPTElDWV9OT1RfU0VUJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElOVEVSTkFMX1NFUlZFUl9FUlJPUn0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5URVJOQUxfU0VSVkVSX0VSUk9SOiAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENBTkNFTF9SRVFVRVNURUR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX0NBTkNFTF9SRVFVRVNURUQ6ICdDQU5DRUxfUkVRVUVTVEVEJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYHVuZGVmaW5lZGAgaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJldHJ5U3RhdGUgPSAodHlwZW9mIFJldHJ5U3RhdGUpW2tleW9mIHR5cGVvZiBSZXRyeVN0YXRlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVSZXRyeVN0YXRlLCBkZWNvZGVSZXRyeVN0YXRlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiBSZXRyeVN0YXRlLFxuICAnUkVUUllfU1RBVEVfJ1xuPihcbiAge1xuICAgIFtSZXRyeVN0YXRlLklOX1BST0dSRVNTXTogMSxcbiAgICBbUmV0cnlTdGF0ZS5OT05fUkVUUllBQkxFX0ZBSUxVUkVdOiAyLFxuICAgIFtSZXRyeVN0YXRlLlRJTUVPVVRdOiAzLFxuICAgIFtSZXRyeVN0YXRlLk1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRF06IDQsXG4gICAgW1JldHJ5U3RhdGUuUkVUUllfUE9MSUNZX05PVF9TRVRdOiA1LFxuICAgIFtSZXRyeVN0YXRlLklOVEVSTkFMX1NFUlZFUl9FUlJPUl06IDYsXG4gICAgW1JldHJ5U3RhdGUuQ0FOQ0VMX1JFUVVFU1RFRF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdSRVRSWV9TVEFURV8nXG4pO1xuXG5leHBvcnQgdHlwZSBXb3JrZmxvd0V4ZWN1dGlvbiA9IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVdvcmtmbG93RXhlY3V0aW9uO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgZmFpbHVyZXMgdGhhdCBjYW4gY3Jvc3MgV29ya2Zsb3cgYW5kIEFjdGl2aXR5IGJvdW5kYXJpZXMuXG4gKlxuICogKipOZXZlciBleHRlbmQgdGhpcyBjbGFzcyBvciBhbnkgb2YgaXRzIGNoaWxkcmVuLioqXG4gKlxuICogVGhlIG9ubHkgY2hpbGQgY2xhc3MgeW91IHNob3VsZCBldmVyIHRocm93IGZyb20geW91ciBjb2RlIGlzIHtAbGluayBBcHBsaWNhdGlvbkZhaWx1cmV9LlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RlbXBvcmFsRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgVGVtcG9yYWxGYWlsdXJlIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGZhaWx1cmUgdGhhdCBjb25zdHJ1Y3RlZCB0aGlzIGVycm9yLlxuICAgKlxuICAgKiBPbmx5IHByZXNlbnQgaWYgdGhpcyBlcnJvciB3YXMgZ2VuZXJhdGVkIGZyb20gYW4gZXh0ZXJuYWwgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGZhaWx1cmU/OiBQcm90b0ZhaWx1cmU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKiBFeGNlcHRpb25zIG9yaWdpbmF0ZWQgYXQgdGhlIFRlbXBvcmFsIHNlcnZpY2UuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1NlcnZlckZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFNlcnZlckZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IG5vblJldHJ5YWJsZTogYm9vbGVhbixcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgcyBhcmUgdXNlZCB0byBjb21tdW5pY2F0ZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBmYWlsdXJlcyBpbiBXb3JrZmxvd3MgYW5kIEFjdGl2aXRpZXMuXG4gKlxuICogVGhlIHtAbGluayB0eXBlfSBwcm9wZXJ0eSBpcyBtYXRjaGVkIGFnYWluc3Qge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9IHRvIGRldGVybWluZSBpZiBhbiBpbnN0YW5jZVxuICogb2YgdGhpcyBlcnJvciBpcyByZXRyeWFibGUuIEFub3RoZXIgd2F5IHRvIGF2b2lkIHJldHJ5aW5nIGlzIGJ5IHNldHRpbmcgdGhlIHtAbGluayBub25SZXRyeWFibGV9IGZsYWcgdG8gYHRydWVgLlxuICpcbiAqIEluIFdvcmtmbG93cywgaWYgeW91IHRocm93IGEgbm9uLWBBcHBsaWNhdGlvbkZhaWx1cmVgLCB0aGUgV29ya2Zsb3cgVGFzayB3aWxsIGZhaWwgYW5kIGJlIHJldHJpZWQuIElmIHlvdSB0aHJvdyBhblxuICogYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gd2lsbCBmYWlsLlxuICpcbiAqIEluIEFjdGl2aXRpZXMsIHlvdSBjYW4gZWl0aGVyIHRocm93IGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIG9yIGFub3RoZXIgYEVycm9yYCB0byBmYWlsIHRoZSBBY3Rpdml0eSBUYXNrLiBJbiB0aGVcbiAqIGxhdHRlciBjYXNlLCB0aGUgYEVycm9yYCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYC4gVGhlIGNvbnZlcnNpb24gaXMgZG9uZSBhcyBmb2xsb3dpbmc6XG4gKlxuICogLSBgdHlwZWAgaXMgc2V0IHRvIGBlcnJvci5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBlcnJvci5uYW1lYFxuICogLSBgbWVzc2FnZWAgaXMgc2V0IHRvIGBlcnJvci5tZXNzYWdlYFxuICogLSBgbm9uUmV0cnlhYmxlYCBpcyBzZXQgdG8gZmFsc2VcbiAqIC0gYGRldGFpbHNgIGFyZSBzZXQgdG8gbnVsbFxuICogLSBzdGFjayB0cmFjZSBpcyBjb3BpZWQgZnJvbSB0aGUgb3JpZ2luYWwgZXJyb3JcbiAqXG4gKiBXaGVuIGFuIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hbi1hY3Rpdml0eS1leGVjdXRpb24gfCBBY3Rpdml0eSBFeGVjdXRpb259IGZhaWxzLCB0aGVcbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgIGZyb20gdGhlIGxhc3QgQWN0aXZpdHkgVGFzayB3aWxsIGJlIHRoZSBgY2F1c2VgIG9mIHRoZSB7QGxpbmsgQWN0aXZpdHlGYWlsdXJlfSB0aHJvd24gaW4gdGhlXG4gKiBXb3JrZmxvdy5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdBcHBsaWNhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIC8qKlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB1c2Uge0BsaW5rIGZyb21FcnJvcn0gb3Ige0BsaW5rIGNyZWF0ZX0uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdHlwZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IG5vblJldHJ5YWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBkZXRhaWxzPzogdW5rbm93bltdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBjYXVzZT86IEVycm9yLFxuICAgIHB1YmxpYyByZWFkb25seSBuZXh0UmV0cnlEZWxheT86IER1cmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBBcHBsaWNhdGlvbkZhaWx1cmVgIGZyb20gYW4gRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBGaXJzdCBjYWxscyB7QGxpbmsgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlIHwgYGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcilgfSBhbmQgdGhlbiBvdmVycmlkZXMgYW55IGZpZWxkc1xuICAgKiBwcm92aWRlZCBpbiBgb3ZlcnJpZGVzYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUVycm9yKGVycm9yOiBFcnJvciB8IHVua25vd24sIG92ZXJyaWRlcz86IEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMpOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIGNvbnN0IGZhaWx1cmUgPSBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUoZXJyb3IpO1xuICAgIE9iamVjdC5hc3NpZ24oZmFpbHVyZSwgb3ZlcnJpZGVzKTtcbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHdpbGwgYmUgcmV0cnlhYmxlICh1bmxlc3MgaXRzIGB0eXBlYCBpcyBpbmNsdWRlZCBpbiB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUgPSBmYWxzZSwgZGV0YWlscywgbmV4dFJldHJ5RGVsYXksIGNhdXNlIH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgbmV3IGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggdGhlIHtAbGluayBub25SZXRyeWFibGV9IGZsYWcgc2V0IHRvIGZhbHNlLiBOb3RlIHRoYXQgdGhpcyBlcnJvciB3aWxsIHN0aWxsXG4gICAqIG5vdCBiZSByZXRyaWVkIGlmIGl0cyBgdHlwZWAgaXMgaW5jbHVkZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9LlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB0eXBlIE9wdGlvbmFsIGVycm9yIHR5cGUgKHVzZWQgYnkge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KVxuICAgKiBAcGFyYW0gZGV0YWlscyBPcHRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJldHJ5YWJsZShtZXNzYWdlPzogc3RyaW5nIHwgbnVsbCwgdHlwZT86IHN0cmluZyB8IG51bGwsIC4uLmRldGFpbHM6IHVua25vd25bXSk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKG1lc3NhZ2UsIHR5cGUgPz8gJ0Vycm9yJywgZmFsc2UsIGRldGFpbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBXaGVuIHRocm93biBmcm9tIGFuIEFjdGl2aXR5IG9yIFdvcmtmbG93LCB0aGUgQWN0aXZpdHkgb3IgV29ya2Zsb3cgd2lsbCBub3QgYmUgcmV0cmllZCAoZXZlbiBpZiBgdHlwZWAgaXMgbm90XG4gICAqIGxpc3RlZCBpbiB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSBPcHRpb25hbCBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB0eXBlIE9wdGlvbmFsIGVycm9yIHR5cGVcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBub25SZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIHRydWUsIGRldGFpbHMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlXG4gICAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICovXG4gIHR5cGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgQWN0aXZpdHkgb3IgV29ya2Zsb3cgY2FuIGJlIHJldHJpZWRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG5vblJldHJ5YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIGRldGFpbHM/OiB1bmtub3duW107XG5cbiAgLyoqXG4gICAqIElmIHNldCwgb3ZlcnJpZGVzIHRoZSBkZWxheSB1bnRpbCB0aGUgbmV4dCByZXRyeSBvZiB0aGlzIEFjdGl2aXR5IC8gV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogUmV0cnkgYXR0ZW1wdHMgd2lsbCBzdGlsbCBiZSBzdWJqZWN0IHRvIHRoZSBtYXhpbXVtIHJldHJpZXMgbGltaXQgYW5kIHRvdGFsIHRpbWUgbGltaXQgZGVmaW5lZFxuICAgKiBieSB0aGUgcG9saWN5LlxuICAgKi9cbiAgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQ2F1c2Ugb2YgdGhlIGZhaWx1cmVcbiAgICovXG4gIGNhdXNlPzogRXJyb3I7XG59XG5cbi8qKlxuICogVGhpcyBlcnJvciBpcyB0aHJvd24gd2hlbiBDYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLiBUbyBhbGxvdyBDYW5jZWxsYXRpb24gdG8gaGFwcGVuLCBsZXQgaXQgcHJvcGFnYXRlLiBUb1xuICogaWdub3JlIENhbmNlbGxhdGlvbiwgY2F0Y2ggaXQgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gTm90ZSB0aGF0IENhbmNlbGxhdGlvbiBjYW4gb25seSBiZSByZXF1ZXN0ZWQgYSBzaW5nbGUgdGltZSwgc29cbiAqIHlvdXIgV29ya2Zsb3cvQWN0aXZpdHkgRXhlY3V0aW9uIHdpbGwgbm90IHJlY2VpdmUgZnVydGhlciBDYW5jZWxsYXRpb24gcmVxdWVzdHMuXG4gKlxuICogV2hlbiBhIFdvcmtmbG93IG9yIEFjdGl2aXR5IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjYW5jZWxsZWQsIGEgYENhbmNlbGxlZEZhaWx1cmVgIHdpbGwgYmUgdGhlIGBjYXVzZWAuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ2FuY2VsbGVkRmFpbHVyZScpXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlsczogdW5rbm93bltdID0gW10sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBVc2VkIGFzIHRoZSBgY2F1c2VgIHdoZW4gYSBXb3JrZmxvdyBoYXMgYmVlbiB0ZXJtaW5hdGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGVybWluYXRlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlcm1pbmF0ZWRGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjYXVzZT86IEVycm9yKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCB0byByZXByZXNlbnQgdGltZW91dHMgb2YgQWN0aXZpdGllcyBhbmQgV29ya2Zsb3dzXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVGltZW91dEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRpbWVvdXRGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBsYXN0SGVhcnRiZWF0RGV0YWlsczogdW5rbm93bixcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGltZW91dFR5cGU6IFRpbWVvdXRUeXBlXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW4gQWN0aXZpdHkgZmFpbHVyZS4gQWx3YXlzIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCByZWFzb24gZm9yIHRoZSBmYWlsdXJlIGFzIGl0cyBgY2F1c2VgLlxuICogRm9yIGV4YW1wbGUsIGlmIGFuIEFjdGl2aXR5IHRpbWVkIG91dCwgdGhlIGNhdXNlIHdpbGwgYmUgYSB7QGxpbmsgVGltZW91dEZhaWx1cmV9LlxuICpcbiAqIFRoaXMgZXhjZXB0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHRocm93biBvbmx5IGJ5IHRoZSBmcmFtZXdvcmsgY29kZS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdBY3Rpdml0eUZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIEFjdGl2aXR5RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHJldHJ5U3RhdGU6IFJldHJ5U3RhdGUsXG4gICAgcHVibGljIHJlYWRvbmx5IGlkZW50aXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIENoaWxkIFdvcmtmbG93IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMge0BsaW5rIGNhdXNlfS5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgQ2hpbGQgd2FzIFRlcm1pbmF0ZWQsIHRoZSBgY2F1c2VgIGlzIGEge0BsaW5rIFRlcm1pbmF0ZWRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ2hpbGRXb3JrZmxvd0ZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENoaWxkV29ya2Zsb3dGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXhlY3V0aW9uOiBXb3JrZmxvd0V4ZWN1dGlvbixcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHJldHJ5U3RhdGU6IFJldHJ5U3RhdGUsXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcignQ2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGZhaWxlZCcsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICogIC0gV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJRCBpcyBjdXJyZW50bHkgcnVubmluZyBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZENvbmZsaWN0UG9saWN5fSBpcyBgV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZX0ZBSUxgXG4gKiAgLSBUaGVyZSBpcyBhIGNsb3NlZCBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElkIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkUmV1c2VQb2xpY3l9XG4gKiAgICBpcyBgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1JFSkVDVF9EVVBMSUNBVEVgXG4gKiAgLSBUaGVyZSBpcyBjbG9zZWQgV29ya2Zsb3cgaW4gdGhlIGBDb21wbGV0ZWRgIHN0YXRlIHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZYFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1dvcmtmbG93RXhlY3V0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogSWYgYGVycm9yYCBpcyBhbHJlYWR5IGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLCByZXR1cm5zIGBlcnJvcmAuXG4gKlxuICogT3RoZXJ3aXNlLCBjb252ZXJ0cyBgZXJyb3JgIGludG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aDpcbiAqXG4gKiAtIGBtZXNzYWdlYDogYGVycm9yLm1lc3NhZ2VgIG9yIGBTdHJpbmcoZXJyb3IpYFxuICogLSBgdHlwZWA6IGBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lYCBvciBgZXJyb3IubmFtZWBcbiAqIC0gYHN0YWNrYDogYGVycm9yLnN0YWNrYCBvciBgJydgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUoZXJyb3I6IHVua25vd24pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbkZhaWx1cmUpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gKGlzUmVjb3JkKGVycm9yKSAmJiBTdHJpbmcoZXJyb3IubWVzc2FnZSkpIHx8IFN0cmluZyhlcnJvcik7XG4gIGNvbnN0IHR5cGUgPSAoaXNSZWNvcmQoZXJyb3IpICYmIChlcnJvci5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBlcnJvci5uYW1lKSkgfHwgdW5kZWZpbmVkO1xuICBjb25zdCBmYWlsdXJlID0gQXBwbGljYXRpb25GYWlsdXJlLmNyZWF0ZSh7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZTogZmFsc2UgfSk7XG4gIGZhaWx1cmUuc3RhY2sgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5zdGFjaykpIHx8ICcnO1xuICByZXR1cm4gZmFpbHVyZTtcbn1cblxuLyoqXG4gKiBJZiBgZXJyYCBpcyBhbiBFcnJvciBpdCBpcyB0dXJuZWQgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAqXG4gKiBJZiBgZXJyYCB3YXMgYWxyZWFkeSBhIGBUZW1wb3JhbEZhaWx1cmVgLCByZXR1cm5zIHRoZSBvcmlnaW5hbCBlcnJvci5cbiAqXG4gKiBPdGhlcndpc2UgcmV0dXJucyBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIGBTdHJpbmcoZXJyKWAgYXMgdGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyOiB1bmtub3duKTogVGVtcG9yYWxGYWlsdXJlIHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgcmV0dXJuIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnIpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcm9vdCBjYXVzZSBtZXNzYWdlIG9mIGdpdmVuIGBlcnJvcmAuXG4gKlxuICogSW4gY2FzZSBgZXJyb3JgIGlzIGEge0BsaW5rIFRlbXBvcmFsRmFpbHVyZX0sIHJlY3Vyc2UgdGhlIGBjYXVzZWAgY2hhaW4gYW5kIHJldHVybiB0aGUgcm9vdCBgY2F1c2UubWVzc2FnZWAuXG4gKiBPdGhlcndpc2UsIHJldHVybiBgZXJyb3IubWVzc2FnZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb290Q2F1c2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICByZXR1cm4gZXJyb3IuY2F1c2UgPyByb290Q2F1c2UoZXJyb3IuY2F1c2UpIDogZXJyb3IubWVzc2FnZTtcbiAgfVxuICByZXR1cm4gZXJyb3JNZXNzYWdlKGVycm9yKTtcbn1cbiIsIi8qKlxuICogQ29tbW9uIGxpYnJhcnkgZm9yIGNvZGUgdGhhdCdzIHVzZWQgYWNyb3NzIHRoZSBDbGllbnQsIFdvcmtlciwgYW5kL29yIFdvcmtmbG93XG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCAqIGFzIGVuY29kaW5nIGZyb20gJy4vZW5jb2RpbmcnO1xuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vYWN0aXZpdHktb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwcmVjYXRlZC10aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZmFpbHVyZSc7XG5leHBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktcG9saWN5JztcbmV4cG9ydCB0eXBlIHsgVGltZXN0YW1wLCBEdXJhdGlvbiwgU3RyaW5nVmFsdWUgfSBmcm9tICcuL3RpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuXG4vKipcbiAqIEVuY29kZSBhIFVURi04IHN0cmluZyBpbnRvIGEgVWludDhBcnJheVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1OChzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGVuY29kaW5nLmVuY29kZShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBVaW50OEFycmF5IGludG8gYSBVVEYtOCBzdHJpbmdcbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyKGFycjogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiBlbmNvZGluZy5kZWNvZGUoYXJyKTtcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLm1lc3NhZ2VgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGhlbHBlcnMuZXJyb3JNZXNzYWdlKGVycm9yKTtcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLmNvZGVgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JDb2RlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGhlbHBlcnMuZXJyb3JDb2RlKGVycm9yKTtcbn1cbiIsImltcG9ydCB7IEFueUZ1bmMsIE9taXRMYXN0UGFyYW0gfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBQYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGludGVyY2VwdG9yIGZ1bmN0aW9uXG4gKlxuICogQ2FsbGVkIGZyb20gYW4gaW50ZXJjZXB0b3IgdG8gY29udGludWUgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG5leHBvcnQgdHlwZSBOZXh0PElGLCBGTiBleHRlbmRzIGtleW9mIElGPiA9IFJlcXVpcmVkPElGPltGTl0gZXh0ZW5kcyBBbnlGdW5jID8gT21pdExhc3RQYXJhbTxSZXF1aXJlZDxJRj5bRk5dPiA6IG5ldmVyO1xuXG4vKiogSGVhZGVycyBhcmUganVzdCBhIG1hcHBpbmcgb2YgaGVhZGVyIG5hbWUgdG8gUGF5bG9hZCAqL1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG4vKipcbiAqIENvbXBvc2UgYWxsIGludGVyY2VwdG9yIG1ldGhvZHMgaW50byBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBDYWxsaW5nIHRoZSBjb21wb3NlZCBmdW5jdGlvbiByZXN1bHRzIGluIGNhbGxpbmcgZWFjaCBvZiB0aGUgcHJvdmlkZWQgaW50ZXJjZXB0b3IsIGluIG9yZGVyIChmcm9tIHRoZSBmaXJzdCB0b1xuICogdGhlIGxhc3QpLCBmb2xsb3dlZCBieSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gcHJvdmlkZWQgYXMgYXJndW1lbnQgdG8gYGNvbXBvc2VJbnRlcmNlcHRvcnMoKWAuXG4gKlxuICogQHBhcmFtIGludGVyY2VwdG9ycyBhIGxpc3Qgb2YgaW50ZXJjZXB0b3JzXG4gKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRvciBtZXRob2QgdG8gY29tcG9zZVxuICogQHBhcmFtIG5leHQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIGxpYi9pbnRlcmNlcHRvcnMpXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUludGVyY2VwdG9yczxJLCBNIGV4dGVuZHMga2V5b2YgST4oaW50ZXJjZXB0b3JzOiBJW10sIG1ldGhvZDogTSwgbmV4dDogTmV4dDxJLCBNPik6IE5leHQ8SSwgTT4ge1xuICBmb3IgKGxldCBpID0gaW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcnNbaV07XG4gICAgaWYgKGludGVyY2VwdG9yW21ldGhvZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcHJldiA9IG5leHQ7XG4gICAgICAvLyBXZSBsb3NlIHR5cGUgc2FmZXR5IGhlcmUgYmVjYXVzZSBUeXBlc2NyaXB0IGNhbid0IGRlZHVjZSB0aGF0IGludGVyY2VwdG9yW21ldGhvZF0gaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnNcbiAgICAgIC8vIHRoZSBzYW1lIHR5cGUgYXMgTmV4dDxJLCBNPlxuICAgICAgbmV4dCA9ICgoaW5wdXQ6IGFueSkgPT4gKGludGVyY2VwdG9yW21ldGhvZF0gYXMgYW55KShpbnB1dCwgcHJldikpIGFzIGFueTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG5leHBvcnQgdHlwZSBQYXlsb2FkID0gdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUGF5bG9hZDtcblxuLyoqIFR5cGUgdGhhdCBjYW4gYmUgcmV0dXJuZWQgZnJvbSBhIFdvcmtmbG93IGBleGVjdXRlYCBmdW5jdGlvbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dSZXR1cm5UeXBlID0gUHJvbWlzZTxhbnk+O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dVcGRhdGVUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT4gfCBhbnk7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZUFubm90YXRlZFR5cGUgPSB7XG4gIGhhbmRsZXI6IFdvcmtmbG93VXBkYXRlVHlwZTtcbiAgdW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3k7XG4gIHZhbGlkYXRvcj86IFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTaWduYWxUeXBlID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93U2lnbmFsQW5ub3RhdGVkVHlwZSA9IHtcbiAgaGFuZGxlcjogV29ya2Zsb3dTaWduYWxUeXBlO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dRdWVyeVR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IGFueTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlID0geyBoYW5kbGVyOiBXb3JrZmxvd1F1ZXJ5VHlwZTsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfTtcblxuLyoqXG4gKiBCcm9hZCBXb3JrZmxvdyBmdW5jdGlvbiBkZWZpbml0aW9uLCBzcGVjaWZpYyBXb3JrZmxvd3Mgd2lsbCB0eXBpY2FsbHkgdXNlIGEgbmFycm93ZXIgdHlwZSBkZWZpbml0aW9uLCBlLmc6XG4gKiBgYGB0c1xuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coYXJnMTogbnVtYmVyLCBhcmcyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3cgPSAoLi4uYXJnczogYW55W10pID0+IFdvcmtmbG93UmV0dXJuVHlwZTtcblxuZGVjbGFyZSBjb25zdCBhcmdzQnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5kZWNsYXJlIGNvbnN0IHJldEJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyB1cGRhdGUgZGVmaW5pdGlvbiwgYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lVXBkYXRlfVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBjYW4gYmUgdXNlZCBmb3IgcGFyYW1ldGVyIHR5cGUgaW5mZXJlbmNlIGluIGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBXb3JrZmxvd0hhbmRsZSBtZXRob2RzLlxuICogYE5hbWVgIGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCB3aXRoIGEgc3RyaW5nIGxpdGVyYWwgdHlwZSB0byBwcmVzZXJ2ZSB0eXBlLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgdXBkYXRlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICd1cGRhdGUnO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgVXBkYXRlRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgVXBkYXRlRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW3JldEJyYW5kXTogUmV0O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyBzaWduYWwgZGVmaW5pdGlvbiwgYXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgZGVmaW5lU2lnbmFsfVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBjYW4gYmUgdXNlZCBmb3IgcGFyYW1ldGVyIHR5cGUgaW5mZXJlbmNlIGluIGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBXb3JrZmxvd0hhbmRsZSBtZXRob2RzLlxuICogYE5hbWVgIGNhbiBvcHRpb25hbGx5IGJlIHNwZWNpZmllZCB3aXRoIGEgc3RyaW5nIGxpdGVyYWwgdHlwZSB0byBwcmVzZXJ2ZSB0eXBlLWxldmVsIGtub3dsZWRnZSBvZiB0aGUgc2lnbmFsIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVmaW5pdGlvbjxBcmdzIGV4dGVuZHMgYW55W10gPSBbXSwgTmFtZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICB0eXBlOiAnc2lnbmFsJztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFNpZ25hbERlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IGFyZ3MuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbYXJnc0JyYW5kXTogQXJncztcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgV29ya2Zsb3cgcXVlcnkgZGVmaW5pdGlvbiBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVRdWVyeX1cbiAqXG4gKiBAcmVtYXJrcyBgQXJnc2AgYW5kIGBSZXRgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBxdWVyeSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICdxdWVyeSc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBRdWVyeURlZmluaXRpb259IHR5cGVzIHdpdGggZGlmZmVyZW50IGFyZ3MuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbYXJnc0JyYW5kXTogQXJncztcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgcmV0dXJuIHR5cGVzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW3JldEJyYW5kXTogUmV0O1xufVxuXG4vKiogR2V0IHRoZSBcInVud3JhcHBlZFwiIHJldHVybiB0eXBlICh3aXRob3V0IFByb21pc2UpIG9mIHRoZSBleGVjdXRlIGhhbmRsZXIgZnJvbSBXb3JrZmxvdyB0eXBlIGBXYCAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dSZXN1bHRUeXBlPFcgZXh0ZW5kcyBXb3JrZmxvdz4gPSBSZXR1cm5UeXBlPFc+IGV4dGVuZHMgUHJvbWlzZTxpbmZlciBSPiA/IFIgOiBuZXZlcjtcblxuLyoqXG4gKiBJZiBhbm90aGVyIFNESyBjcmVhdGVzIGEgU2VhcmNoIEF0dHJpYnV0ZSB0aGF0J3Mgbm90IGFuIGFycmF5LCB3ZSB3cmFwIGl0IGluIGFuIGFycmF5LlxuICpcbiAqIERhdGVzIGFyZSBzZXJpYWxpemVkIGFzIElTTyBzdHJpbmdzLlxuICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVzID0gUmVjb3JkPHN0cmluZywgU2VhcmNoQXR0cmlidXRlVmFsdWUgfCBSZWFkb25seTxTZWFyY2hBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ+O1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVmFsdWUgPSBzdHJpbmdbXSB8IG51bWJlcltdIHwgYm9vbGVhbltdIHwgRGF0ZVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RnVuY3Rpb248UCBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+IHtcbiAgKC4uLmFyZ3M6IFApOiBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICogQGRlcHJlY2F0ZWQgbm90IHJlcXVpcmVkIGFueW1vcmUsIGZvciB1bnR5cGVkIGFjdGl2aXRpZXMgdXNlIHtAbGluayBVbnR5cGVkQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2UgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVW50eXBlZEFjdGl2aXRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBBIHdvcmtmbG93J3MgaGlzdG9yeSBhbmQgSUQuIFVzZWZ1bCBmb3IgcmVwbGF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBbmRXb3JrZmxvd0lkIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBoaXN0b3J5OiB0ZW1wb3JhbC5hcGkuaGlzdG9yeS52MS5IaXN0b3J5IHwgdW5rbm93biB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZGVmaW5pbmcgYWN0aW9ucyB0YWtlbiB3aGVuIGEgd29ya2Zsb3cgZXhpdHMgd2hpbGUgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVubmluZy5cbiAqIFRoZSB3b3JrZmxvdyBleGl0IG1heSBiZSBkdWUgdG8gc3VjY2Vzc2Z1bCByZXR1cm4sIGZhaWx1cmUsIGNhbmNlbGxhdGlvbiwgb3IgY29udGludWUtYXMtbmV3LlxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaW4gYWRkaXRpb24gdG8gYWJhbmRvbmluZyB0aGUgaGFuZGxlciBleGVjdXRpb24uIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiB0aGUgd29ya2Zsb3cgZmFpbHMuXG4gICAqL1xuICBXQVJOX0FORF9BQkFORE9OOiAnV0FSTl9BTkRfQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIEFiYW5kb24gdGhlIGhhbmRsZXIgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBhbiB1cGRhdGUgaGFuZGxlciB0aGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW5cbiAgICogdGhlIHVwZGF0ZSByZXN1bHQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSAodHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5KVtrZXlvZiB0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ldO1xuIiwiaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBFeGFjdCwgUmVtb3ZlUHJlZml4LCBVbmlvblRvSW50ZXJzZWN0aW9uIH0gZnJvbSAnLi4vdHlwZS1oZWxwZXJzJztcblxuLyoqXG4gKiBDcmVhdGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIG51bWVyaWMgYGVudW1gIHR5cGVzIHByb2R1Y2VkIGJ5IG91clxuICogUHJvdG9idWYgY29tcGlsZXIgYW5kIFwiY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3NcIiBlbnVtIHZhbHVlcyB0aGF0IHdlIGV4cG9zZSBpbiBvdXIgcHVibGljIEFQSXMuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogTmV3bHkgaW50cm9kdWNlZCBlbnVtcyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcGF0dGVybjpcbiAqXG4gKiBgYGB0c1xuICogICAgIHR5cGUgUGFyZW50Q2xvc2VQb2xpY3kgPSAodHlwZW9mIFBhcmVudENsb3NlUG9saWN5KVtrZXlvZiB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ldO1xuICogICAgIGNvbnN0IFBhcmVudENsb3NlUG9saWN5ID0ge1xuICogICAgICAgVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcbiAqICAgICAgIEFCQU5ET046ICdBQkFORE9OJyxcbiAqICAgICAgIFJFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxuICogICAgIH0gYXMgY29uc3Q7XG4gKlxuICogICAgIGNvbnN0IFtlbmNvZGVQYXJlbnRDbG9zZVBvbGljeSwgZGVjb2RlUGFyZW50Q2xvc2VQb2xpY3ldID0gLy9cbiAqICAgICAgIG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICogICAgICAgICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJyAgLy8gVGhpcyBtYXkgYmUgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBwcm90byBlbnVtIGRvZXNuJ3QgYWRkIGEgcmVwZWF0ZWQgcHJlZml4IG9uIHZhbHVlc1xuICogICAgICAgPihcbiAqICAgICAgICAge1xuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEVdOiAxLCAvLyBUaGVzZSBudW1iZXJzIG11c3QgbWF0Y2ggdGhlIG9uZXMgaW4gdGhlIHByb3RvIGVudW1cbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTl06IDIsXG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlJFUVVFU1RfQ0FOQ0VMXTogMyxcbiAqXG4gKiAgICAgICAgICAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgICAgICAgIH0gYXMgY29uc3QsXG4gKiAgICAgICAgICdQQVJFTlRfQ0xPU0VfUE9MSUNZXydcbiAqICAgICAgICk7XG4gKiBgYGBcbiAqXG4gKiBgbWFrZVByb3RvRW51bUNvbnZlcnRlcnNgIHN1cHBvcnRzIG90aGVyIHVzYWdlIHBhdHRlcm5zLCBidXQgdGhleSBhcmUgb25seSBtZWFudCBmb3JcbiAqIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBmb3JtZXIgZW51bSBkZWZpbml0aW9ucyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBuZXcgZW51bXMuXG4gKlxuICogIyMjIENvbnRleHRcbiAqXG4gKiBUZW1wb3JhbCdzIFByb3RvYnVmIEFQSXMgZGVmaW5lIHNldmVyYWwgYGVudW1gIHR5cGVzOyBvdXIgUHJvdG9idWYgY29tcGlsZXIgdHJhbnNmb3JtcyB0aGVzZSB0b1xuICogdHJhZGl0aW9uYWwgKGkuZS4gbm9uLWNvbnN0KSBbVHlwZVNjcmlwdCBudW1lcmljIGBlbnVtYHNdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjbnVtZXJpYy1lbnVtcykuXG4gKlxuICogRm9yIHZhcmlvdXMgcmVhc29ucywgdGhpcyBpcyBmYXIgZnJvbSBpZGVhbDpcbiAqXG4gKiAgLSBEdWUgdG8gdGhlIGR1YWwgbmF0dXJlIG9mIG5vbi1jb25zdCBUeXBlU2NyaXB0IGBlbnVtYHMgKHRoZXkgYXJlIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlKSxcbiAqICAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZWZlciB0byBhbiBlbnVtIHZhbHVlIGZyb20gY29kZSB3aXRob3V0IGEgXCJyZWFsXCIgaW1wb3J0IG9mIHRoZSBlbnVtIHR5cGVcbiAqICAgIChpLmUuIGNhbid0IHNpbXBseSBkbyBgaW1wb3J0IHR5cGUgLi4uYCkuIEluIFdvcmtmbG93IGNvZGUsIHN1Y2ggYW4gaW1wb3J0IHdvdWxkIHJlc3VsdCBpblxuICogICAgbG9hZGluZyBvdXIgZW50aXJlIFByb3RvYnVmIGRlZmluaXRpb25zIGludG8gdGhlIHdvcmtmbG93IHNhbmRib3gsIGFkZGluZyBzZXZlcmFsIG1lZ2FieXRlcyB0b1xuICogICAgdGhlIHBlci13b3JrZmxvdyBtZW1vcnkgZm9vdHByaW50LCB3aGljaCBpcyB1bmFjY2VwdGFibGU7IHRvIGF2b2lkIHRoYXQsIHdlIG5lZWQgdG8gbWFpbnRhaW5cbiAqICAgIGEgbWlycm9yIGNvcHkgb2YgZWFjaCBlbnVtIHR5cGVzIHVzZWQgYnkgaW4td29ya2Zsb3cgQVBJcywgYW5kIGV4cG9ydCB0aGVzZSBmcm9tIGVpdGhlclxuICogICAgYEB0ZW1wb3JhbGlvL2NvbW1vbmAgb3IgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YC5cbiAqICAtIEl0IGlzIG5vdCBkZXNpcmFibGUgZm9yIHVzZXJzIHRvIG5lZWQgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBgQHRlbXBvcmFsaW8vcHJvdG9gIGp1c3QgdG9cbiAqICAgIGdldCBhY2Nlc3MgdG8gdGhlc2UgZW51bSB0eXBlczsgd2UgdGhlcmVmb3JlIG1hZGUgaXQgYSBjb21tb24gcHJhY3RpY2UgdG8gcmVleHBvcnQgdGhlc2UgZW51bXNcbiAqICAgIGZyb20gb3VyIHB1YmxpYyBmYWNpbmcgcGFja2FnZXMuIEhvd2V2ZXIsIGV4cGVyaWVuY2UgZGVtb250cmF0ZWQgdGhhdCB0aGVzZSByZWV4cG9ydHMgZWZmZWN0aXZlbHlcbiAqICAgIHJlc3VsdGVkIGluIHBvb3IgYW5kIGluY29uc2lzdGVudCBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIGNvbXBhcmVkIHRvIG1pcnJvcmVkIGVudW1zIHR5cGVzLlxuICogIC0gT3VyIFByb3RvYnVmIGVudW0gdHlwZXMgdGVuZCB0byBmb2xsb3cgYSB2ZXJib3NlIGFuZCByZWR1bmRhbnQgbmFtaW5nIGNvbnZlbnRpb24sIHdoaWNoIGZlZWxzXG4gKiAgICB1bmF0dXJhbCBhbmQgZXhjZXNzaXZlIGFjY29yZGluZyB0byBtb3N0IFR5cGVTY3JpcHQgc3R5bGUgZ3VpZGVzOyBlLmcuIGluc3RlYWQgb2ZcbiAqICAgIGB3b3JrZmxvd0lkUmV1c2VQb2xpY3k6IFdvcmtmbG93SWRSZXVzZVBvbGljeS5XT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWAsXG4gKiAgICBhIFR5cGVTY3JpcHQgZGV2ZWxvcGVyIHdvdWxkIGdlbmVyYWxseSBleHBlY3QgdG8gYmUgYWJsZSB0byB3cml0ZSBzb21ldGhpbmcgc2ltaWxhciB0b1xuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogJ1JFSkVDVF9EVVBMSUNBVEUnYC5cbiAqICAtIEJlY2F1c2Ugb2YgdGhlIHdheSBQcm90b2J1ZiB3b3JrcywgbWFueSBvZiBvdXIgZW51bSB0eXBlcyBjb250YWluIGFuIGBVTlNQRUNJRklFRGAgdmFsdWUsIHdoaWNoXG4gKiAgICBpcyB1c2VkIHRvIGV4cGxpY2l0bHkgaWRlbnRpZnkgYSB2YWx1ZSB0aGF0IGlzIHVuc2V0LiBJbiBUeXBlU2NyaXB0IGNvZGUsIHRoZSBgdW5kZWZpbmVkYCB2YWx1ZVxuICogICAgYWxyZWFkeSBzZXJ2ZXMgdGhhdCBwdXJwb3NlLCBhbmQgaXMgZGVmaW5pdGVseSBtb3JlIGlkaW9tYXRpYyB0byBUUyBkZXZlbG9wZXJzLCB3aGVyZWFzIHRoZXNlXG4gKiAgICBgVU5TUEVDSUZJRURgIHZhbHVlcyBjcmVhdGUgbm9pc2UgYW5kIGNvbmZ1c2lvbiBpbiBvdXIgQVBJcy5cbiAqICAtIFR5cGVTY3JpcHQgZWRpdG9ycyBnZW5lcmFsbHkgZG8gYSB2ZXJ5IGJhZCBqb2IgYXQgcHJvdmlkaW5nIGF1dG9jb21wbGV0aW9uIHRoYXQgaW1wbGllcyByZWFjaGluZ1xuICogICAgZm9yIHZhbHVlcyBvZiBhIFR5cGVTY3JpcHQgZW51bSB0eXBlLCBmb3JjaW5nIGRldmVsb3BlcnMgdG8gZXhwbGljaXRseSB0eXBlIGluIGF0IGxlYXN0IHBhcnRcbiAqICAgIG9mIHRoZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgYmVmb3JlIHRoZXkgY2FuIGdldCBhdXRvY29tcGxldGlvbiBmb3IgaXRzIHZhbHVlcy4gT24gdGhlIG90aGVyXG4gKiAgICBoYW5kLCBhbGwgVFMgZWRpdG9ycyBpbW1lZGlhdGVseSBwcm92aWRlIGF1dG9jb21wbGV0aW9uIGZvciBzdHJpbmcgdW5pb24gdHlwZXMuXG4gKiAgLSBUaGUgW1R5cGVTY3JpcHQncyBvZmZpY2lhbCBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9lbnVtcy5odG1sI29iamVjdHMtdnMtZW51bXMpXG4gKiAgICBpdHNlbGYgc3VnZ2VzdHMgdGhhdCwgaW4gbW9kZXJuIFR5cGVTY3JpcHQsIHRoZSB1c2Ugb2YgYGFzIGNvbnN0YCBvYmplY3RzIG1heSBnZW5lcmFsbHkgc3VmZmljZVxuICogICAgYW5kIG1heSBiZSBhZHZhbnRhZ2VvdXMgb3ZlciB0aGUgdXNlIG9mIGBlbnVtYCB0eXBlcy5cbiAqXG4gKiBBIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzLCBjb21iaW5lZCB3aXRoIGEgdW5pb24gdHlwZSBvZiBwb3NzaWJsZSBzdHJpbmcgdmFsdWVzLCBwcm92aWRlcyBhIG11Y2hcbiAqIG1vcmUgaWRpb21hdGljIHN5bnRheCBhbmQgYSBiZXR0ZXIgRFggZm9yIFR5cGVTY3JpcHQgZGV2ZWxvcGVycy4gVGhpcyBob3dldmVyIHJlcXVpcmVzIGEgd2F5IHRvXG4gKiBjb252ZXJ0IGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIGBlbnVtYCB2YWx1ZXMgcHJvZHVjZWQgYnkgdGhlIFByb3RvYnVmIGNvbXBpbGVyIGFuZCB0aGVcbiAqIGVxdWl2YWxlbnQgc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGhlbHBlciBkeW5hbWljYWxseSBjcmVhdGVzIHRoZXNlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZvciBhIGdpdmVuIFByb3RvYnVmIGVudW0gdHlwZSxcbiAqIHN0cm9uZ2x5IGJ1aWxkaW5nIHVwb24gc3BlY2lmaWMgY29udmVudGlvbnMgdGhhdCB3ZSBoYXZlIGFkb3B0ZWQgaW4gb3VyIFByb3RvYnVmIGRlZmluaXRpb25zLlxuICpcbiAqICMjIyBWYWxpZGF0aW9uc1xuICpcbiAqIFRoZSBjb21wbGV4IHR5cGUgc2lnbmF0dXJlIG9mIHRoaXMgaGVscGVyIGlzIHRoZXJlIHRvIHByZXZlbnQgbW9zdCBwb3RlbnRpYWwgaW5jb2hlcmVuY2llc1xuICogdGhhdCBjb3VsZCByZXN1bHQgZnJvbSBoYXZpbmcgdG8gbWFudWFsbHkgc3luY2hyb25pemUgdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0gYW5kIHRoZVxuICogY29udmVyc2lvbiB0YWJsZSB3aXRoIHRoZSBwcm90byBlbnVtLCB3aGlsZSBub3QgcmVxdWlyaW5nIGEgcmVndWxhciBpbXBvcnQgb24gdGhlIFByb3RvYnVmIGVudW1cbiAqIGl0c2VsZiAoc28gaXQgY2FuIGJlIHVzZWQgc2FmZWx5IGZvciBlbnVtcyBtZWFudCB0byBiZSB1c2VkIGZyb20gd29ya2Zsb3cgY29kZSkuXG4gKlxuICogSW4gcGFydGljdWxhciwgZmFpbGluZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBpbnZhcmlhbnRzIHdpbGwgcmVzdWx0IGluIGJ1aWxkIHRpbWUgZXJyb3JzOlxuICpcbiAqIC0gRm9yIGV2ZXJ5IGtleSBvZiB0aGUgZm9ybSBgUFJFRklYX0tFWTogbnVtYmVyYCBpbiB0aGUgcHJvdG8gZW51bSwgZXhjbHVkaW5nIHRoZSBgVU5TUEVDSUZJRURgIGtleTpcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGEgY29ycmVzcG9uZGluZyBgS0VZOiAnS0VZJ2AgZW50cnkgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW07XG4gKiAgIC0gVGhlcmUgTUFZIGJlIGEgY29ycmVzcG9uZGluZyBgUFJFRklYX0tFWTogJ0tFWSdgIGluIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtXG4gKiAgICAgKHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmb3JtZXIgc3ludGF4OyBzdWNoIGFsaWFzZXMgc2hvdWxkXG4gKiAgICAgbm90IGJlIGFkZGVkIGZvciBuZXcgZW51bXMgYW5kIGVudW0gZW50cmllcyBpbnRyb2R1Y2VkIGdvaW5nIGZvcndhcmQpO1xuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6IG51bWJlcmAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIElmIHRoZSBwcm90byBlbnVtIGNvbnRhaW5zIGEgYFBSRUZJWF9VTlNQRUNJRklFRGAgZW50cnksIHRoZW46XG4gKiAgIC0gVGhlcmUgTUFZIGJlIGEgY29ycmVzcG9uZGluZyBgUFJFRklYX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWRgIGFuZC9vciBgVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGBcbiAqICAgICBlbnRyaWVzIGluIHRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIOKAlCB0aGlzIGlzIG1lYW50IHRvIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqICAgICB3aXRoIHRoZSBmb3JtZXIgc3ludGF4OyB0aGlzIGFsaWFzIHNob3VsZCBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBpbnRyb2R1Y2VkIGdvaW5nIGZvcndhcmQ7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhbiBgVU5TUEVDSUZJRUQ6IDBgIGluIHRoZSBtYXBwaW5nIHRhYmxlLlxuICogLSBUaGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBNVVNUIE5PVCBjb250YWluIGFueSBvdGhlciBrZXlzIHRoYW4gdGhlIG9uZXMgbWFuZGF0ZWQgb3JcbiAqICAgb3B0aW9uYWxseSBhbGxvd2VkIGJlIHRoZSBwcmVjZWVkaW5nIHJ1bGVzLlxuICogLSBUaGUgbWFwcGluZyB0YWJsZSBNVVNUIE5PVCBjb250YWluIGFueSBvdGhlciBrZXlzIHRoYW4gdGhlIG9uZXMgbWFuZGF0ZWQgYWJvdmUuXG4gKlxuICogVGhlc2UgcnVsZXMgbm90YWJseSBlbnN1cmUgdGhhdCB3aGVuZXZlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byBhbiBleGlzdGluZyBQcm90byBlbnVtLCB0aGUgY29kZVxuICogd2lsbCBmYWlsIHRvIGNvbXBpbGUgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaXMgYWRkZWQgb24gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqIGFuZCB0aGUgbWFwcGluZyB0YWJsZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBQcm90b0VudW1WYWx1ZSBleHRlbmRzIG51bWJlcixcbiAgUHJvdG9FbnVtIGV4dGVuZHMgeyBbayBpbiBQcm90b0VudW1LZXldOiBQcm90b0VudW1WYWx1ZSB9LFxuICBQcm90b0VudW1LZXkgZXh0ZW5kcyBgJHtQcmVmaXh9JHtzdHJpbmd9YCxcbiAgU3RyaW5nRW51bVR5cGVBY3R1YWwgZXh0ZW5kcyBFeGFjdDxTdHJpbmdFbnVtVHlwZSwgU3RyaW5nRW51bVR5cGVBY3R1YWw+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4gIC8vXG4gIC8vIFBhcmFtZXRlcnMgYWZ0ZXIgdGhpcyBwb2ludCB3aWxsIGJlIGluZmVycmVkOyB0aGV5J3JlIG5vdCBtZWFudCBub3QgdG8gYmUgc3BlY2lmaWVkIGJ5IGRldmVsb3BlcnNcbiAgVW5zcGVjaWZpZWQgPSBQcm90b0VudW1LZXkgZXh0ZW5kcyBgJHtQcmVmaXh9VU5TUEVDSUZJRURgID8gJ1VOU1BFQ0lGSUVEJyA6IG5ldmVyLFxuICBTaG9ydFN0cmluZ0VudW1LZXkgZXh0ZW5kcyBSZW1vdmVQcmVmaXg8UHJlZml4LCBQcm90b0VudW1LZXk+ID0gRXhjbHVkZTxcbiAgICBSZW1vdmVQcmVmaXg8UHJlZml4LCBQcm90b0VudW1LZXk+LFxuICAgIFVuc3BlY2lmaWVkXG4gID4sXG4gIFN0cmluZ0VudW1UeXBlIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5LFxuICAgIFByZWZpeCxcbiAgICBVbnNwZWNpZmllZFxuICA+ID0gUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgTWFwVGFibGUgZXh0ZW5kcyBQcm90b0VudW1Ub0NvbnN0T2JqZWN0T2ZTdHJpbmdNYXBUYWJsZTxcbiAgICBTdHJpbmdFbnVtVHlwZSxcbiAgICBQcm90b0VudW1WYWx1ZSxcbiAgICBQcm90b0VudW0sXG4gICAgUHJvdG9FbnVtS2V5LFxuICAgIFByZWZpeCxcbiAgICBVbnNwZWNpZmllZCxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXlcbiAgPiA9IFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+LFxuPihcbiAgbWFwVGFibGU6IE1hcFRhYmxlLFxuICBwcmVmaXg6IFByZWZpeFxuKTogW1xuICAoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICkgPT4gUHJvdG9FbnVtVmFsdWUgfCB1bmRlZmluZWQsIC8vXG4gIChpbnB1dDogUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQsIC8vXG5dIHtcbiAgY29uc3QgcmV2ZXJzZVRhYmxlOiBSZWNvcmQ8UHJvdG9FbnVtVmFsdWUsIFNob3J0U3RyaW5nRW51bUtleT4gPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwVGFibGUpLm1hcCgoW2ssIHZdKSA9PiBbdiwga10pXG4gICk7XG4gIGNvbnN0IGhhc1Vuc3BlY2lmaWVkID0gKG1hcFRhYmxlIGFzIGFueSlbJ1VOU1BFQ0lGSUVEJ10gPT09IDAgfHwgKG1hcFRhYmxlIGFzIGFueSlbYCR7cHJlZml4fVVOU1BFQ0lGSUVEYF0gPT09IDA7XG5cbiAgZnVuY3Rpb24gaXNTaG9ydFN0cmluZ0VudW1LZXlzKHg6IHVua25vd24pOiB4IGlzIFNob3J0U3RyaW5nRW51bUtleSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyAmJiB4IGluIG1hcFRhYmxlO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOdW1lcmljRW51bVZhbHVlKHg6IHVua25vd24pOiB4IGlzIFByb3RvRW51bVtrZXlvZiBQcm90b0VudW1dIHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmIHggaW4gcmV2ZXJzZVRhYmxlO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5jb2RlKFxuICAgIGlucHV0OiBTaG9ydFN0cmluZ0VudW1LZXkgfCBgJHtQcmVmaXh9JHtTaG9ydFN0cmluZ0VudW1LZXl9YCB8IFByb3RvRW51bVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgc2hvcnRlbjogc3RyaW5nID0gaW5wdXQ7XG4gICAgICBpZiAoc2hvcnRlbi5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgc2hvcnRlbiA9IHNob3J0ZW4uc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTaG9ydFN0cmluZ0VudW1LZXlzKHNob3J0ZW4pKSB7XG4gICAgICAgIHJldHVybiBtYXBUYWJsZVtzaG9ydGVuXTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIGVudW0gdmFsdWU6ICcke2lucHV0fSdgKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9JyBvZiB0eXBlICR7dHlwZW9mIGlucHV0fWApO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZShpbnB1dDogUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKTogU2hvcnRTdHJpbmdFbnVtS2V5IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChoYXNVbnNwZWNpZmllZCAmJiBpbnB1dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOdW1lcmljRW51bVZhbHVlKGlucHV0KSkge1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVRhYmxlW2lucHV0XTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgZ290IGEgcHJvdG8gZW51bSB2YWx1ZSB0aGF0IHdlIGRvbid0IHlldCBrbm93IGFib3V0IChpLmUuIGl0IGRpZG4ndCBleGlzdCB3aGVuIHRoaXMgY29kZVxuICAgICAgLy8gd2FzIGNvbXBpbGVkKS4gVGhpcyBpcyBjZXJ0YWlubHkgYSBwb3NzaWJpbGl0eSwgYnV0IGdpdmVuIGhvdyBvdXIgQVBJcyBldm9sdmUsIHRoaXMgaXMgaXNcbiAgICAgIC8vIHVubGlrZWx5IHRvIGJlIGEgdGVycmlibHkgYmFkIHRoaW5nIGJ5IGl0c2VsZiAod2UgYXZvaWQgYWRkaW5nIG5ldyBlbnVtIHZhbHVlcyBpbiBwbGFjZXNcbiAgICAgIC8vIHRoYXQgd291bGQgYnJlYWsgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGRlcGxveWVkIGNvZGUpLiBUaGVyZWZvcmUsIHRocm93aW5nXG4gICAgICAvLyBvbiBcInVuZXhwZWN0ZWRcIiB2YWx1ZXMgaXMgbGlrZWx5IHRvIGVuZCB1cCBjYXVzaW5nIG1vcmUgcHJvYmxlbXMgdGhhbiBpdCBtaWdodCBhdm9pZCxcbiAgICAgIC8vIGVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0aGUgZGVjb2RlZCB2YWx1ZSBtYXkgYWN0dWFsbHkgbmV2ZXIgZ2V0IHJlYWQgYW53eWF5LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZXJlZm9yZSwgd2UgaW5zdGVhZCBjaGVhdCBvbiB0eXBlIGNvbnN0cmFpbnRzIGFuZCByZXR1cm4gYSBzdHJpbmcgb2YgdGhlIGZvcm0gXCJ1bmtub3duXzIzXCIuXG4gICAgICAvLyBUaGF0IHNvbWV3aGF0IG1pcnJvcnMgdGhlIGJlaGF2aW9yIHdlJ2QgZ2V0IHdpdGggdGhlIHB1cmUgbnVtZXJpY2FsIGFwcHJvYWNoLlxuICAgICAgcmV0dXJuIGB1bmtub3duXyR7aW5wdXR9YCBhcyBTaG9ydFN0cmluZ0VudW1LZXk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgcHJvdG8gZW51bSB2YWx1ZTogJyR7aW5wdXR9JyBvZiB0eXBlICR7dHlwZW9mIGlucHV0fWApO1xuICB9XG5cbiAgcmV0dXJuIFtlbmNvZGUsIGRlY29kZV0gYXMgY29uc3Q7XG59XG5cbi8qKlxuICogR2l2ZW4gdGhlIGV4cGxvZGVkIHBhcmFtZXRlcnMgb2YgYSBwcm90byBlbnVtIChpLmUuIHNob3J0IGtleXMsIHByZWZpeCwgYW5kIHNob3J0IGtleSBvZiB0aGVcbiAqIHVuc3BlY2lmaWVkIHZhbHVlKSwgbWFrZSBhIHR5cGUgdGhhdCBfZXhhY3RseV8gY29ycmVzcG9uZHMgdG8gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0sXG4gKiBlLmcuIHRoZSB0eXBlIHRoYXQgdGhlIGRldmVsb3BlciBpcyBleHBlY3RlZCB0byB3cml0ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZm9yIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksIHRoaXMgZXZhbHVhdGVzIHRvOlxuICpcbiAqIHtcbiAqICAgVEVSTUlOQVRFOiBcIlRFUk1JTkFURVwiO1xuICogICBBQkFORE9OOiBcIkFCQU5ET05cIjtcbiAqICAgUkVRVUVTVF9DQU5DRUw6IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFPzogXCJURVJNSU5BVEVcIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OPzogXCJBQkFORE9OXCI7XG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfUkVRVUVTVF9DQU5DRUw/OiBcIlJFUVVFU1RfQ0FOQ0VMXCI7XG4gKlxuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEPzogdW5kZWZpbmVkO1xuICogfVxuICovXG50eXBlIFByb3RvQ29uc3RPYmplY3RPZlN0cmluZ3NFbnVtPFxuICBTaG9ydFN0cmluZ0VudW1LZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsIC8vIGUuZy4gJ1VOU1BFQ0lGSUVEJ1xuPiA9IFVuaW9uVG9JbnRlcnNlY3Rpb248XG4gIHwge1xuICAgICAgLy8gZS5nLjogXCJURVJNSU5BVEVcIjogXCJURVJNSU5BVEVcIlxuICAgICAgcmVhZG9ubHkgW2sgaW4gU2hvcnRTdHJpbmdFbnVtS2V5XTogaztcbiAgICB9XG4gIHwge1xuICAgICAgW2sgaW4gU2hvcnRTdHJpbmdFbnVtS2V5XTogUHJlZml4IGV4dGVuZHMgJydcbiAgICAgICAgPyBvYmplY3RcbiAgICAgICAgOiB7XG4gICAgICAgICAgICAvLyBlLmcuOiBcIlBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFXCI/OiBcIlRFUk1JTkFURVwiXG4gICAgICAgICAgICByZWFkb25seSBba2sgaW4gYCR7UHJlZml4fSR7a31gXT86IGs7XG4gICAgICAgICAgfTtcbiAgICB9W1Nob3J0U3RyaW5nRW51bUtleV1cbiAgfCAoVW5zcGVjaWZpZWQgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8ge1xuICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9VTlNQRUNJRklFRFwiPzogdW5kZWZpbmVkXG4gICAgICAgICAgW2sgaW4gYCR7UHJlZml4fSR7VW5zcGVjaWZpZWR9YF0/OiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIDogb2JqZWN0KVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJVTlNQRUNJRklFRFwiPzogdW5kZWZpbmVkXG4gICAgICAgICAgW2sgaW4gYCR7VW5zcGVjaWZpZWR9YF0/OiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIDogb2JqZWN0KVxuPjtcblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgbWFwcGluZyB0YWJsZSB0aGF0IHRoZSB1c2VyIGlzXG4gKiBleHBlY3RlZCB0byBwcm92aWRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogIFVOU1BFQ0lGSUVEOiAwLFxuICogIFRFUk1JTkFURTogMSxcbiAqICBBQkFORE9OOiAyLFxuICogIFJFUVVFU1RfQ0FOQ0VMOiAzLFxuICogfVxuICovXG50eXBlIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICBfU3RyaW5nRW51bSBleHRlbmRzIFByb3RvQ29uc3RPYmplY3RPZlN0cmluZ3NFbnVtPFNob3J0U3RyaW5nRW51bUtleSwgUHJlZml4LCBVbnNwZWNpZmllZD4sXG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4gIFVuc3BlY2lmaWVkLFxuICBTaG9ydFN0cmluZ0VudW1LZXkgZXh0ZW5kcyBSZW1vdmVQcmVmaXg8UHJlZml4LCBQcm90b0VudW1LZXk+LFxuPiA9IFVuaW9uVG9JbnRlcnNlY3Rpb248XG4gIHtcbiAgICBbayBpbiBQcm90b0VudW1LZXldOiB7XG4gICAgICBba2sgaW4gUmVtb3ZlUHJlZml4PFByZWZpeCwgaz5dOiBQcm90b0VudW1ba10gZXh0ZW5kcyBudW1iZXIgPyBQcm90b0VudW1ba10gOiBuZXZlcjtcbiAgICB9O1xuICB9W1Byb3RvRW51bUtleV1cbj47XG4iLCJleHBvcnQgKiBmcm9tICcuL2VudW1zLWhlbHBlcnMnO1xuIiwiZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBWYWx1ZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgRHVyYXRpb24sIG1zT3B0aW9uYWxUb051bWJlciwgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9Ucywgb3B0aW9uYWxUc1RvTXMgfSBmcm9tICcuL3RpbWUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJldHJ5aW5nIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIENvZWZmaWNpZW50IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuZXh0IHJldHJ5IGludGVydmFsLlxuICAgKiBUaGUgbmV4dCByZXRyeSBpbnRlcnZhbCBpcyBwcmV2aW91cyBpbnRlcnZhbCBtdWx0aXBsaWVkIGJ5IHRoaXMgY29lZmZpY2llbnQuXG4gICAqIEBtaW5pbXVtIDFcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgYmFja29mZkNvZWZmaWNpZW50PzogbnVtYmVyO1xuICAvKipcbiAgICogSW50ZXJ2YWwgb2YgdGhlIGZpcnN0IHJldHJ5LlxuICAgKiBJZiBjb2VmZmljaWVudCBpcyAxIHRoZW4gaXQgaXMgdXNlZCBmb3IgYWxsIHJldHJpZXNcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqIEBkZWZhdWx0IDEgc2Vjb25kXG4gICAqL1xuICBpbml0aWFsSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzLiBXaGVuIGV4Y2VlZGVkLCByZXRyaWVzIHN0b3AgKGV2ZW4gaWYge0BsaW5rIEFjdGl2aXR5T3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fVxuICAgKiBoYXNuJ3QgYmVlbiByZWFjaGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgSW5maW5pdHlcbiAgICovXG4gIG1heGltdW1BdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZXRyaWVzLlxuICAgKiBFeHBvbmVudGlhbCBiYWNrb2ZmIGxlYWRzIHRvIGludGVydmFsIGluY3JlYXNlLlxuICAgKiBUaGlzIHZhbHVlIGlzIHRoZSBjYXAgb2YgdGhlIGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDB4IG9mIHtAbGluayBpbml0aWFsSW50ZXJ2YWx9XG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgbWF4aW11bUludGVydmFsPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXBwbGljYXRpb24gZmFpbHVyZXMgdHlwZXMgdG8gbm90IHJldHJ5LlxuICAgKi9cbiAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBSZXRyeVBvbGljeSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVJldHJ5UG9saWN5KHJldHJ5UG9saWN5OiBSZXRyeVBvbGljeSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVJldHJ5UG9saWN5IHtcbiAgaWYgKHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCAhPSBudWxsICYmIHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gIH1cbiAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyAhPSBudWxsKSB7XG4gICAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAvLyBkcm9wIGZpZWxkIChJbmZpbml0eSBpcyB0aGUgZGVmYXVsdClcbiAgICAgIGNvbnN0IHsgbWF4aW11bUF0dGVtcHRzOiBfLCAuLi53aXRob3V0IH0gPSByZXRyeVBvbGljeTtcbiAgICAgIHJldHJ5UG9saWN5ID0gd2l0aG91dDtcbiAgICB9IGVsc2UgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfSBlbHNlIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXhpbXVtSW50ZXJ2YWwgPSBtc09wdGlvbmFsVG9OdW1iZXIocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKTtcbiAgY29uc3QgaW5pdGlhbEludGVydmFsID0gbXNUb051bWJlcihyZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgPz8gMTAwMCk7XG4gIGlmIChtYXhpbXVtSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKGluaXRpYWxJbnRlcnZhbCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgY2Fubm90IGJlIDAnKTtcbiAgfVxuICBpZiAobWF4aW11bUludGVydmFsICE9IG51bGwgJiYgbWF4aW11bUludGVydmFsIDwgaW5pdGlhbEludGVydmFsKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0cyBpbml0aWFsSW50ZXJ2YWwnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heGltdW1BdHRlbXB0czogcmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzLFxuICAgIGluaXRpYWxJbnRlcnZhbDogbXNUb1RzKGluaXRpYWxJbnRlcnZhbCksXG4gICAgbWF4aW11bUludGVydmFsOiBtc09wdGlvbmFsVG9UcyhtYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50LFxuICAgIG5vblJldHJ5YWJsZUVycm9yVHlwZXM6IHJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXMsXG4gIH07XG59XG5cbi8qKlxuICogVHVybiBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3kgaW50byBhIFRTIFJldHJ5UG9saWN5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXBpbGVSZXRyeVBvbGljeShcbiAgcmV0cnlQb2xpY3k/OiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB8IG51bGxcbik6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXRyeVBvbGljeSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50ID8/IHVuZGVmaW5lZCxcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUludGVydmFsOiBvcHRpb25hbFRzVG9NcyhyZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGluaXRpYWxJbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsKSxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzID8/IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiIsImltcG9ydCBMb25nIGZyb20gJ2xvbmcnOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0XG5pbXBvcnQgbXMsIHsgU3RyaW5nVmFsdWUgfSBmcm9tICdtcyc7XG5pbXBvcnQgdHlwZSB7IGdvb2dsZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIE5PVEU6IHRoZXNlIGFyZSB0aGUgc2FtZSBpbnRlcmZhY2UgaW4gSlNcbi8vIGdvb2dsZS5wcm90b2J1Zi5JRHVyYXRpb247XG4vLyBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcbi8vIFRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBiZWxvdyBzaG91bGQgd29yayBmb3IgYm90aFxuXG5leHBvcnQgdHlwZSBUaW1lc3RhbXAgPSBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcblxuLyoqXG4gKiBBIGR1cmF0aW9uLCBleHByZXNzZWQgZWl0aGVyIGFzIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgb3IgYXMgYSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb24gPSBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdy5cbiAqIElmIHRzIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aHJvd3MgYSBUeXBlRXJyb3IsIHdpdGggZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAke2ZpZWxkTmFtZX0gdG8gYmUgYSB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRpbWVzdGFtcCwgZ290ICR7dHN9YCk7XG4gIH1cbiAgY29uc3QgeyBzZWNvbmRzLCBuYW5vcyB9ID0gdHM7XG4gIHJldHVybiAoc2Vjb25kcyB8fCBMb25nLlVaRVJPKVxuICAgIC5tdWwoMTAwMClcbiAgICAuYWRkKE1hdGguZmxvb3IoKG5hbm9zIHx8IDApIC8gMTAwMDAwMCkpXG4gICAgLnRvTnVtYmVyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTtcbiAgY29uc3QgbmFub3MgPSAobWlsbGlzICUgMTAwMCkgKiAxMDAwMDAwO1xuICBpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpIHx8IE51bWJlci5pc05hTihuYW5vcykpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBtaWxsaXMgJHttaWxsaXN9YCk7XG4gIH1cbiAgcmV0dXJuIHsgc2Vjb25kczogTG9uZy5mcm9tTnVtYmVyKHNlY29uZHMpLCBuYW5vcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gbXNOdW1iZXJUb1RzKG1zVG9OdW1iZXIoc3RyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9UcyhzdHI6IER1cmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHIgPyBtc1RvVHMoc3RyKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbXNUb051bWJlcih2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb051bWJlcih2YWw6IER1cmF0aW9uKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gbXNXaXRoVmFsaWRhdGlvbih2YWwpO1xufVxuXG5mdW5jdGlvbiBtc1dpdGhWYWxpZGF0aW9uKHN0cjogU3RyaW5nVmFsdWUpOiBudW1iZXIge1xuICBjb25zdCBtaWxsaXMgPSBtcyhzdHIpO1xuICBpZiAobWlsbGlzID09IG51bGwgfHwgaXNOYU4obWlsbGlzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZHVyYXRpb24gc3RyaW5nOiAnJHtzdHJ9J2ApO1xuICB9XG4gIHJldHVybiBtaWxsaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0c1RvRGF0ZSh0czogVGltZXN0YW1wKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUocmVxdWlyZWRUc1RvTXModHMsIGZpZWxkTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKHRzVG9Ncyh0cykpO1xufVxuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIHNjaGVkdWxlLWhlbHBlcnMudHMpXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxEYXRlVG9UcyhkYXRlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1zVG9UcyhkYXRlLmdldFRpbWUoKSk7XG59XG4iLCIvKiogU2hvcnRoYW5kIGFsaWFzICovXG5leHBvcnQgdHlwZSBBbnlGdW5jID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4vKiogQSB0dXBsZSB3aXRob3V0IGl0cyBsYXN0IGVsZW1lbnQgKi9cbmV4cG9ydCB0eXBlIE9taXRMYXN0PFQ+ID0gVCBleHRlbmRzIFsuLi5pbmZlciBSRVNULCBhbnldID8gUkVTVCA6IG5ldmVyO1xuLyoqIEYgd2l0aCBhbGwgYXJndW1lbnRzIGJ1dCB0aGUgbGFzdCAqL1xuZXhwb3J0IHR5cGUgT21pdExhc3RQYXJhbTxGIGV4dGVuZHMgQW55RnVuYz4gPSAoLi4uYXJnczogT21pdExhc3Q8UGFyYW1ldGVyczxGPj4pID0+IFJldHVyblR5cGU8Rj47XG4vKiogUmVxdWlyZSB0aGF0IFQgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvdmlkZWQgcHJvcGVydGllcyBkZWZpbmVkICovXG5leHBvcnQgdHlwZSBSZXF1aXJlQXRMZWFzdE9uZTxULCBLZXlzIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+ID0gUGljazxULCBFeGNsdWRlPGtleW9mIFQsIEtleXM+PiAmXG4gIHtcbiAgICBbSyBpbiBLZXlzXS0/OiBSZXF1aXJlZDxQaWNrPFQsIEs+PiAmIFBhcnRpYWw8UGljazxULCBFeGNsdWRlPEtleXMsIEs+Pj47XG4gIH1bS2V5c107XG5cbi8qKiBWZXJpZnkgdGhhdCBhbiB0eXBlIF9Db3B5IGV4dGVuZHMgX09yaWcgKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0V4dGVuZHM8X09yaWcsIF9Db3B5IGV4dGVuZHMgX09yaWc+KCk6IHZvaWQge1xuICAvLyBub29wLCBqdXN0IHR5cGUgY2hlY2tcbn1cblxuZXhwb3J0IHR5cGUgUmVwbGFjZTxCYXNlLCBOZXc+ID0gT21pdDxCYXNlLCBrZXlvZiBOZXc+ICYgTmV3O1xuXG4vLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2UvdW5pb24tdG8taW50ZXJzZWN0aW9uLmQudHNcbi8vIE1JVCBvciBDQzAtMS4wIOKAlCBJdCBpcyBtZWFudCB0byBiZSBjb3BpZWQgaW50byB5b3VyIGNvZGViYXNlIHJhdGhlciB0aGFuIGJlaW5nIHVzZWQgYXMgYSBkZXBlbmRlbmN5LlxuZXhwb3J0IHR5cGUgVW5pb25Ub0ludGVyc2VjdGlvbjxVbmlvbj4gPVxuICAvLyBgZXh0ZW5kcyB1bmtub3duYCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGhlIGNhc2UgYW5kIGlzIHVzZWQgdG8gY29udmVydCB0aGUgYFVuaW9uYCBpbnRvIGFcbiAgLy8gW2Rpc3RyaWJ1dGl2ZSBjb25kaXRpb25hbCB0eXBlXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMi04Lmh0bWwjZGlzdHJpYnV0aXZlLWNvbmRpdGlvbmFsLXR5cGVzKS5cbiAgKFxuICAgIFVuaW9uIGV4dGVuZHMgdW5rbm93blxuICAgICAgPyAvLyBUaGUgdW5pb24gdHlwZSBpcyB1c2VkIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIGEgZnVuY3Rpb24gc2luY2UgdGhlIHVuaW9uXG4gICAgICAgIC8vIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBhbiBpbnRlcnNlY3Rpb24uXG4gICAgICAgIChkaXN0cmlidXRlZFVuaW9uOiBVbmlvbikgPT4gdm9pZFxuICAgICAgOiAvLyBUaGlzIHdvbid0IGhhcHBlbi5cbiAgICAgICAgbmV2ZXJcbiAgKSBleHRlbmRzIC8vIEluZmVyIHRoZSBgSW50ZXJzZWN0aW9uYCB0eXBlIHNpbmNlIFR5cGVTY3JpcHQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb25hbFxuICAvLyBhcmd1bWVudHMgb2YgdW5pb25zIG9mIGZ1bmN0aW9ucyBhcyBhbiBpbnRlcnNlY3Rpb24gb2YgdGhlIHVuaW9uLlxuICAobWVyZ2VkSW50ZXJzZWN0aW9uOiBpbmZlciBJbnRlcnNlY3Rpb24pID0+IHZvaWRcbiAgICA/IC8vIFRoZSBgJiBVbmlvbmAgaXMgdG8gYWxsb3cgaW5kZXhpbmcgYnkgdGhlIHJlc3VsdGluZyB0eXBlXG4gICAgICBJbnRlcnNlY3Rpb24gJiBVbmlvblxuICAgIDogbmV2ZXI7XG5cbnR5cGUgSXNFcXVhbDxBLCBCPiA9ICg8Rz4oKSA9PiBHIGV4dGVuZHMgQSA/IDEgOiAyKSBleHRlbmRzIDxHPigpID0+IEcgZXh0ZW5kcyBCID8gMSA6IDIgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgUHJpbWl0aXZlID0gbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzeW1ib2wgfCBiaWdpbnQ7XG5cbnR5cGUgSXNOdWxsPFQ+ID0gW1RdIGV4dGVuZHMgW251bGxdID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIElzVW5rbm93bjxUPiA9IHVua25vd24gZXh0ZW5kcyBUIC8vIGBUYCBjYW4gYmUgYHVua25vd25gIG9yIGBhbnlgXG4gID8gSXNOdWxsPFQ+IGV4dGVuZHMgZmFsc2UgLy8gYGFueWAgY2FuIGJlIGBudWxsYCwgYnV0IGB1bmtub3duYCBjYW4ndCBiZVxuICAgID8gdHJ1ZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxudHlwZSBPYmplY3RWYWx1ZTxULCBLPiA9IEsgZXh0ZW5kcyBrZXlvZiBUXG4gID8gVFtLXVxuICA6IFRvU3RyaW5nPEs+IGV4dGVuZHMga2V5b2YgVFxuICAgID8gVFtUb1N0cmluZzxLPl1cbiAgICA6IEsgZXh0ZW5kcyBgJHtpbmZlciBOdW1iZXJLIGV4dGVuZHMgbnVtYmVyfWBcbiAgICAgID8gTnVtYmVySyBleHRlbmRzIGtleW9mIFRcbiAgICAgICAgPyBUW051bWJlcktdXG4gICAgICAgIDogbmV2ZXJcbiAgICAgIDogbmV2ZXI7XG5cbnR5cGUgVG9TdHJpbmc8VD4gPSBUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyID8gYCR7VH1gIDogbmV2ZXI7XG5cbnR5cGUgS2V5c09mVW5pb248T2JqZWN0VHlwZT4gPSBPYmplY3RUeXBlIGV4dGVuZHMgdW5rbm93biA/IGtleW9mIE9iamVjdFR5cGUgOiBuZXZlcjtcblxudHlwZSBBcnJheUVsZW1lbnQ8VD4gPSBUIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdID8gVFswXSA6IG5ldmVyO1xuXG50eXBlIEV4YWN0T2JqZWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgUGFyYW1ldGVyVHlwZV06IEV4YWN0PFBhcmFtZXRlclR5cGVbS2V5XSwgT2JqZWN0VmFsdWU8SW5wdXRUeXBlLCBLZXk+Pjtcbn0gJiBSZWNvcmQ8RXhjbHVkZTxrZXlvZiBJbnB1dFR5cGUsIEtleXNPZlVuaW9uPFBhcmFtZXRlclR5cGU+PiwgbmV2ZXI+O1xuXG5leHBvcnQgdHlwZSBFeGFjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+ID1cbiAgLy8gQmVmb3JlIGRpc3RyaWJ1dGluZywgY2hlY2sgaWYgdGhlIHR3byB0eXBlcyBhcmUgZXF1YWwgYW5kIGlmIHNvLCByZXR1cm4gdGhlIHBhcmFtZXRlciB0eXBlIGltbWVkaWF0ZWx5XG4gIElzRXF1YWw8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiBleHRlbmRzIHRydWVcbiAgICA/IFBhcmFtZXRlclR5cGVcbiAgICA6IC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBwcmltaXRpdmUsIHJldHVybiBpdCBhcyBpcyBpbW1lZGlhdGVseSB0byBhdm9pZCBpdCBiZWluZyBjb252ZXJ0ZWQgdG8gYSBjb21wbGV4IHR5cGVcbiAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyBQcmltaXRpdmVcbiAgICAgID8gUGFyYW1ldGVyVHlwZVxuICAgICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGFuIHVua25vd24sIHJldHVybiBpdCBhcyBpcyBpbW1lZGlhdGVseSB0byBhdm9pZCBpdCBiZWluZyBjb252ZXJ0ZWQgdG8gYSBjb21wbGV4IHR5cGVcbiAgICAgICAgSXNVbmtub3duPFBhcmFtZXRlclR5cGU+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICA/IHVua25vd25cbiAgICAgICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGEgRnVuY3Rpb24sIHJldHVybiBpdCBhcyBpcyBiZWNhdXNlIHRoaXMgdHlwZSBpcyBub3QgY2FwYWJsZSBvZiBoYW5kbGluZyBmdW5jdGlvbiwgbGVhdmUgaXQgdG8gVHlwZVNjcmlwdFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgRnVuY3Rpb25cbiAgICAgICAgICA/IFBhcmFtZXRlclR5cGVcbiAgICAgICAgICA6IC8vIENvbnZlcnQgdW5pb24gb2YgYXJyYXkgdG8gYXJyYXkgb2YgdW5pb246IEFbXSAmIEJbXSA9PiAoQSAmIEIpW11cbiAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyB1bmtub3duW11cbiAgICAgICAgICAgID8gQXJyYXk8RXhhY3Q8QXJyYXlFbGVtZW50PFBhcmFtZXRlclR5cGU+LCBBcnJheUVsZW1lbnQ8SW5wdXRUeXBlPj4+XG4gICAgICAgICAgICA6IC8vIEluIFR5cGVTY3JpcHQsIEFycmF5IGlzIGEgc3VidHlwZSBvZiBSZWFkb25seUFycmF5LCBzbyBhbHdheXMgdGVzdCBBcnJheSBiZWZvcmUgUmVhZG9ubHlBcnJheS5cbiAgICAgICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXVxuICAgICAgICAgICAgICA/IFJlYWRvbmx5QXJyYXk8RXhhY3Q8QXJyYXlFbGVtZW50PFBhcmFtZXRlclR5cGU+LCBBcnJheUVsZW1lbnQ8SW5wdXRUeXBlPj4+XG4gICAgICAgICAgICAgIDogRXhhY3RPYmplY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPjtcbi8vIEVuZCBvZiBib3Jyb3cgZnJvbSAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS91bmlvbi10by1pbnRlcnNlY3Rpb24uZC50c1xuXG5leHBvcnQgdHlwZSBSZW1vdmVQcmVmaXg8UHJlZml4IGV4dGVuZHMgc3RyaW5nLCBLZXlzIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW2sgaW4gS2V5c106IGsgZXh0ZW5kcyBgJHtQcmVmaXh9JHtpbmZlciBTdWZmaXh9YCA/IFN1ZmZpeCA6IG5ldmVyO1xufVtLZXlzXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnR5PFggZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcmVjb3JkOiBYLFxuICBwcm9wOiBZXG4pOiByZWNvcmQgaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9wIGluIHJlY29yZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc093blByb3BlcnRpZXM8WCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBZIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICByZWNvcmQ6IFgsXG4gIHByb3BzOiBZW11cbik6IHJlY29yZCBpcyBYICYgUmVjb3JkPFksIHVua25vd24+IHtcbiAgcmV0dXJuIHByb3BzLmV2ZXJ5KChwcm9wKSA9PiBwcm9wIGluIHJlY29yZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3Ige1xuICByZXR1cm4gKFxuICAgIGlzUmVjb3JkKGVycm9yKSAmJlxuICAgIHR5cGVvZiBlcnJvci5uYW1lID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBlcnJvci5tZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgIChlcnJvci5zdGFjayA9PSBudWxsIHx8IHR5cGVvZiBlcnJvci5zdGFjayA9PT0gJ3N0cmluZycpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Fib3J0RXJyb3IoZXJyb3I6IHVua25vd24pOiBlcnJvciBpcyBFcnJvciAmIHsgbmFtZTogJ0Fib3J0RXJyb3InIH0ge1xuICByZXR1cm4gaXNFcnJvcihlcnJvcikgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgRXJyb3JXaXRoQ29kZSB7XG4gIGNvZGU6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNFcnJvcldpdGhDb2RlKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3JXaXRoQ29kZSB7XG4gIHJldHVybiBpc1JlY29yZChlcnJvcikgJiYgdHlwZW9mIGVycm9yLmNvZGUgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JDb2RlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJyb3JXaXRoQ29kZShlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHNvbWUgdHlwZSBpcyB0aGUgbmV2ZXIgdHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIobXNnOiBzdHJpbmcsIHg6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZyArICc6ICcgKyB4KTtcbn1cblxuZXhwb3J0IHR5cGUgQ2xhc3M8RSBleHRlbmRzIEVycm9yPiA9IHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IEU7XG4gIHByb3RvdHlwZTogRTtcbn07XG5cbi8qKlxuICogQSBkZWNvcmF0b3IgdG8gYmUgdXNlZCBvbiBlcnJvciBjbGFzc2VzLiBJdCBhZGRzIHRoZSAnbmFtZScgcHJvcGVydHkgQU5EIHByb3ZpZGVzIGEgY3VzdG9tXG4gKiAnaW5zdGFuY2VvZicgaGFuZGxlciB0aGF0IHdvcmtzIGNvcnJlY3RseSBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLlxuICpcbiAqICMjIyBEZXRhaWxzICMjI1xuICpcbiAqIEFjY29yZGluZyB0byB0aGUgRWNtYVNjcmlwdCdzIHNwZWMsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEphdmFTY3JpcHQncyBgeCBpbnN0YW5jZW9mIFlgIG9wZXJhdG9yIGlzIHRvIHdhbGsgdXAgdGhlXG4gKiBwcm90b3R5cGUgY2hhaW4gb2Ygb2JqZWN0ICd4JywgY2hlY2tpbmcgaWYgYW55IGNvbnN0cnVjdG9yIGluIHRoYXQgaGllcmFyY2h5IGlzIF9leGFjdGx5IHRoZSBzYW1lIG9iamVjdF8gYXMgdGhlXG4gKiBjb25zdHJ1Y3RvciBmdW5jdGlvbiAnWScuXG4gKlxuICogVW5mb3J0dW5hdGVseSwgaXQgaGFwcGVucyBpbiB2YXJpb3VzIHNpdHVhdGlvbnMgdGhhdCBkaWZmZXJlbnQgY29uc3RydWN0b3IgZnVuY3Rpb24gb2JqZWN0cyBnZXQgY3JlYXRlZCBmb3Igd2hhdFxuICogYXBwZWFycyB0byBiZSB0aGUgdmVyeSBzYW1lIGNsYXNzLiBUaGlzIGxlYWRzIHRvIHN1cnByaXNpbmcgYmVoYXZpb3Igd2hlcmUgYGluc3RhbmNlb2ZgIHJldHVybnMgZmFsc2UgdGhvdWdoIGl0IGlzXG4gKiBrbm93biB0aGF0IHRoZSBvYmplY3QgaXMgaW5kZWVkIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MuIE9uZSBwYXJ0aWN1bGFyIGNhc2Ugd2hlcmUgdGhpcyBoYXBwZW5zIGlzIHdoZW4gY29uc3RydWN0b3JcbiAqICdZJyBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHJlYWxtIHRoYW4gdGhlIGNvbnN0dWN0b3Igd2l0aCB3aGljaCAneCcgd2FzIGluc3RhbnRpYXRlZC4gQW5vdGhlciBjYXNlIGlzIHdoZW4gdHdvIGNvcGllc1xuICogb2YgdGhlIHNhbWUgbGlicmFyeSBnZXRzIGxvYWRlZCBpbiB0aGUgc2FtZSByZWFsbS5cbiAqXG4gKiBJbiBwcmFjdGljZSwgdGhpcyB0ZW5kcyB0byBjYXVzZSBpc3N1ZXMgd2hlbiBjcm9zc2luZyB0aGUgd29ya2Zsb3ctc2FuZGJveGluZyBib3VuZGFyeSAoc2luY2UgTm9kZSdzIHZtIG1vZHVsZVxuICogcmVhbGx5IGNyZWF0ZXMgbmV3IGV4ZWN1dGlvbiByZWFsbXMpLCBhcyB3ZWxsIGFzIHdoZW4gcnVubmluZyB0ZXN0cyB1c2luZyBKZXN0IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2plc3Rqcy9qZXN0L2lzc3Vlcy8yNTQ5XG4gKiBmb3Igc29tZSBkZXRhaWxzIG9uIHRoYXQgb25lKS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGluamVjdHMgYSBjdXN0b20gJ2luc3RhbmNlb2YnIGhhbmRsZXIgaW50byB0aGUgcHJvdG90eXBlIG9mICdjbGF6eicsIHdoaWNoIGlzIGJvdGggY3Jvc3MtcmVhbG0gc2FmZSBhbmRcbiAqIGNyb3NzLWNvcGllcy1vZi10aGUtc2FtZS1saWIgc2FmZS4gSXQgd29ya3MgYnkgYWRkaW5nIGEgc3BlY2lhbCBzeW1ib2wgcHJvcGVydHkgdG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCBhbmQgdGhlblxuICogY2hlY2tpbmcgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGF0IHN5bWJvbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yPEUgZXh0ZW5kcyBFcnJvcj4obWFya2VyTmFtZTogc3RyaW5nKTogKGNsYXp6OiBDbGFzczxFPikgPT4gdm9pZCB7XG4gIHJldHVybiAoY2xheno6IENsYXNzPEU+KTogdm9pZCA9PiB7XG4gICAgY29uc3QgbWFya2VyID0gU3ltYm9sLmZvcihgX190ZW1wb3JhbF9pcyR7bWFya2VyTmFtZX1gKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsICduYW1lJywgeyB2YWx1ZTogbWFya2VyTmFtZSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCBtYXJrZXIsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6eiwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LXNob3J0aGFuZFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0aGlzOiBhbnksIGVycm9yOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMgPT09IGNsYXp6KSB7XG4gICAgICAgICAgcmV0dXJuIGlzUmVjb3JkKGVycm9yKSAmJiAoZXJyb3IgYXMgYW55KVttYXJrZXJdID09PSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICd0aGlzJyBtdXN0IGJlIGEgX3N1YmNsYXNzXyBvZiBjbGF6eiB0aGF0IGRvZXNuJ3QgcmVkZWZpbmVkIFtTeW1ib2wuaGFzSW5zdGFuY2VdLCBzbyB0aGF0IGl0IGluaGVyaXRlZFxuICAgICAgICAgIC8vIGZyb20gY2xhenoncyBbU3ltYm9sLmhhc0luc3RhbmNlXS4gSWYgd2UgZG9uJ3QgaGFuZGxlIHRoaXMgcGFydGljdWxhciBzaXR1YXRpb24sIHRoZW5cbiAgICAgICAgICAvLyBgeCBpbnN0YW5jZW9mIFN1YmNsYXNzT2ZQYXJlbnRgIHdvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgaW5zdGFuY2Ugb2YgJ1BhcmVudCcsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJZGVhbGx5LCBpdCdkIGJlIHByZWZlcmFibGUgdG8gYXZvaWQgdGhpcyBjYXNlIGVudGlyZWx5LCBieSBtYWtpbmcgc3VyZSB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mICdjbGF6eidcbiAgICAgICAgICAvLyByZWRlZmluZSBbU3ltYm9sLmhhc0luc3RhbmNlXSwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdC4gV2UgdGhlcmVmb3JlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlb2ZcbiAgICAgICAgICAvLyBiZWhhdmlvciAod2hpY2ggaXMgTk9UIGNyb3NzLXJlYWxtIHNhZmUpLlxuICAgICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGVycm9yKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cblxuLy8gVGhhbmtzIE1ETjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2ZyZWV6ZVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBGcmVlemU8VD4ob2JqZWN0OiBUKTogVCB7XG4gIC8vIFJldHJpZXZlIHRoZSBwcm9wZXJ0eSBuYW1lcyBkZWZpbmVkIG9uIG9iamVjdFxuICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmplY3QpO1xuXG4gIC8vIEZyZWV6ZSBwcm9wZXJ0aWVzIGJlZm9yZSBmcmVlemluZyBzZWxmXG4gIGZvciAoY29uc3QgbmFtZSBvZiBwcm9wTmFtZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IChvYmplY3QgYXMgYW55KVtuYW1lXTtcblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZWVwRnJlZXplKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBva2F5LCB0aGVyZSBhcmUgc29tZSB0eXBlZCBhcnJheXMgdGhhdCBjYW5ub3QgYmUgZnJvemVuIChlbmNvZGluZ0tleXMpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5mcmVlemUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKG9iamVjdCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IGNvcmVzZGsgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgdHlwZSB7IFZlcnNpb25pbmdJbnRlbnQgYXMgVmVyc2lvbmluZ0ludGVudFN0cmluZyB9IGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIsIGNoZWNrRXh0ZW5kcyB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLy8gQXZvaWQgaW1wb3J0aW5nIHRoZSBwcm90byBpbXBsZW1lbnRhdGlvbiB0byByZWR1Y2Ugd29ya2Zsb3cgYnVuZGxlIHNpemVcbi8vIENvcGllZCBmcm9tIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnRcbi8qKlxuICogUHJvdG9idWYgZW51bSByZXByZXNlbnRhdGlvbiBvZiB7QGxpbmsgVmVyc2lvbmluZ0ludGVudFN0cmluZ30uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZW51bSBWZXJzaW9uaW5nSW50ZW50IHtcbiAgVU5TUEVDSUZJRUQgPSAwLFxuICBDT01QQVRJQkxFID0gMSxcbiAgREVGQVVMVCA9IDIsXG59XG5cbmNoZWNrRXh0ZW5kczxjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50LCBWZXJzaW9uaW5nSW50ZW50PigpO1xuY2hlY2tFeHRlbmRzPFZlcnNpb25pbmdJbnRlbnQsIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byhpbnRlbnQ6IFZlcnNpb25pbmdJbnRlbnRTdHJpbmcgfCB1bmRlZmluZWQpOiBWZXJzaW9uaW5nSW50ZW50IHtcbiAgc3dpdGNoIChpbnRlbnQpIHtcbiAgICBjYXNlICdERUZBVUxUJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkRFRkFVTFQ7XG4gICAgY2FzZSAnQ09NUEFUSUJMRSc6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5DT01QQVRJQkxFO1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuVU5TUEVDSUZJRUQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKCdVbmV4cGVjdGVkIFZlcnNpb25pbmdJbnRlbnQnLCBpbnRlbnQpO1xuICB9XG59XG4iLCIvKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGludGVuZHMgY2VydGFpbiBjb21tYW5kcyB0byBiZSBydW4gb24gYSBjb21wYXRpYmxlIHdvcmtlciBCdWlsZCBJZCB2ZXJzaW9uIG9yIG5vdC5cbiAqXG4gKiBgQ09NUEFUSUJMRWAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiBhIHdvcmtlciB3aXRoIGNvbXBhdGlibGUgdmVyc2lvbiBpZiBwb3NzaWJsZS4gSXQgbWF5IG5vdCBiZVxuICogcG9zc2libGUgaWYgdGhlIHRhcmdldCB0YXNrIHF1ZXVlIGRvZXMgbm90IGFsc28gaGF2ZSBrbm93bGVkZ2Ugb2YgdGhlIGN1cnJlbnQgd29ya2VyJ3MgQnVpbGQgSWQuXG4gKlxuICogYERFRkFVTFRgIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHNob3VsZCBydW4gb24gdGhlIHRhcmdldCB0YXNrIHF1ZXVlJ3MgY3VycmVudCBvdmVyYWxsLWRlZmF1bHQgQnVpbGQgSWQuXG4gKlxuICogV2hlcmUgdGhpcyB0eXBlIGlzIGFjY2VwdGVkIG9wdGlvbmFsbHksIGFuIHVuc2V0IHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBTREsgc2hvdWxkIGNob29zZSB0aGUgbW9zdCBzZW5zaWJsZSBkZWZhdWx0XG4gKiBiZWhhdmlvciBmb3IgdGhlIHR5cGUgb2YgY29tbWFuZCwgYWNjb3VudGluZyBmb3Igd2hldGhlciB0aGUgY29tbWFuZCB3aWxsIGJlIHJ1biBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIHRoZVxuICogY3VycmVudCB3b3JrZXIuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBzdGFydGluZyBXb3JrZmxvd3MgaXMgYERFRkFVTFRgLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgV29ya2Zsb3dzIHN0YXJ0aW5nXG4gKiBBY3Rpdml0aWVzLCBzdGFydGluZyBDaGlsZCBXb3JrZmxvd3MsIG9yIENvbnRpbnVpbmcgQXMgTmV3IGlzIGBDT01QQVRJQkxFYC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIFZlcnNpb25pbmdJbnRlbnQgPSAnQ09NUEFUSUJMRScgfCAnREVGQVVMVCc7XG4iLCJpbXBvcnQgeyBXb3JrZmxvdywgV29ya2Zsb3dSZXN1bHRUeXBlLCBTaWduYWxEZWZpbml0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBCYXNlIFdvcmtmbG93SGFuZGxlIGludGVyZmFjZSwgZXh0ZW5kZWQgaW4gd29ya2Zsb3cgYW5kIGNsaWVudCBsaWJzLlxuICpcbiAqIFRyYW5zZm9ybXMgYSB3b3JrZmxvdyBpbnRlcmZhY2UgYFRgIGludG8gYSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VXb3JrZmxvd0hhbmRsZTxUIGV4dGVuZHMgV29ya2Zsb3c+IHtcbiAgLyoqXG4gICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIFdvcmtmbG93IGV4ZWN1dGlvbiBjb21wbGV0ZXNcbiAgICovXG4gIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbiAgLyoqXG4gICAqIFNpZ25hbCBhIHJ1bm5pbmcgV29ya2Zsb3cuXG4gICAqXG4gICAqIEBwYXJhbSBkZWYgYSBzaWduYWwgZGVmaW5pdGlvbiBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGF3YWl0IGhhbmRsZS5zaWduYWwoaW5jcmVtZW50U2lnbmFsLCAzKTtcbiAgICogYGBgXG4gICAqL1xuICBzaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzLCBOYW1lPiB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JrZmxvd0lkIG9mIHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgU2VhcmNoQXR0cmlidXRlcywgV29ya2Zsb3cgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3JldHJ5LXBvbGljeSc7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICpcbiAqIFNlZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeX0gZm9yIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhXG4gKiBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKlJ1bm5pbmcqIFdvcmtmbG93LlxuICpcbiAqIENvbmNlcHQ6IHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXdvcmtmbG93LWlkLXJldXNlLXBvbGljeS8gfCBXb3JrZmxvdyBJZCBSZXVzZSBQb2xpY3l9XG4gKlxuICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlLlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZSB0aGF0IGlzIG5vdCBDb21wbGV0ZWQuXG4gICAqL1xuICBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2Fubm90IGJlIHN0YXJ0ZWQuXG4gICAqL1xuICBSRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBXb3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nOyBvdGhlcndpc2UgYWxsb3cgcmV1c2luZyB0aGUgV29ya2Zsb3cgSUQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURX0gaW5zdGVhZCwgYW5kXG4gICAqICAgICAgICAgICAgIHNldCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgdG9cbiAgICogICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVEVSTUlOQVRFX0VYSVNUSU5HfS5cbiAgICogICAgICAgICAgICAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIG11c3QgYmUgbGVmdCB1bnNwZWNpZmllZC5cbiAgICovXG4gIFRFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLy8vIEFueXRoaW5nIGJlbG93IHRoaXMgbGluZSBoYXMgYmVlbiBkZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIE5vIG5lZWQgdG8gdXNlIHRoaXMuIElmIGEgYFdvcmtmbG93SWRSZXVzZVBvbGljeWAgaXMgc2V0IHRvIHRoaXMsIG9yIGlzIG5vdCBzZXQgYXQgYWxsLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEVpdGhlciBsZWF2ZSBwcm9wZXJ0eSBgdW5kZWZpbmVkYCwgb3IgdXNlIHtAbGluayBBTExPV19EVVBMSUNBVEV9IGluc3RlYWQuXG4gICAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEFMTE9XX0RVUExJQ0FURX0gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURTogJ0FMTE9XX0RVUExJQ0FURScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFl9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVKRUNUX0RVUExJQ0FURX0gaW5zdGVhZC4gKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1JFSkVDVF9EVVBMSUNBVEU6ICdSRUpFQ1RfRFVQTElDQVRFJywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFRFUk1JTkFURV9JRl9SVU5OSU5HfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfVEVSTUlOQVRFX0lGX1JVTk5JTkc6ICdURVJNSU5BVEVfSUZfUlVOTklORycsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSAodHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSlba2V5b2YgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVdOiAxLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZXTogMixcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlJFSkVDVF9EVVBMSUNBVEVdOiAzLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuVEVSTUlOQVRFX0lGX1JVTk5JTkddOiA0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuKTtcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3dcbiAqIHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiAqTm90ZTogSXQgaXMgbmV2ZXIgcG9zc2libGUgdG8gaGF2ZSB0d28gX2FjdGl2ZWx5IHJ1bm5pbmdfIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5ID0gKHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kpW2tleW9mIHR5cGVvZiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ldO1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByYWlzZSBhIGBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3JgLlxuICAgKi9cbiAgRkFJTDogJ0ZBSUwnLFxuXG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmV0dXJuIGEgV29ya2Zsb3cgSGFuZGxlIGZvciB0aGUgYWxyZWFkeSBSdW5uaW5nIFdvcmtmbG93LlxuICAgKi9cbiAgVVNFX0VYSVNUSU5HOiAnVVNFX0VYSVNUSU5HJyxcblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgV29ya2Zsb3csIHRlcm1pbmF0aW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqL1xuICBURVJNSU5BVEVfRVhJU1RJTkc6ICdURVJNSU5BVEVfRVhJU1RJTkcnLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LkZBSUxdOiAxLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVVNFX0VYSVNUSU5HXTogMixcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlRFUk1JTkFURV9FWElTVElOR106IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICAgKlxuICAgKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEV9XG4gICAqL1xuICB3b3JrZmxvd0lkUmV1c2VQb2xpY3k/OiBXb3JrZmxvd0lkUmV1c2VQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpSdW5uaW5nKiBXb3JrZmxvdy5cbiAgICpcbiAgICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVU5TUEVDSUZJRUR9XG4gICAqL1xuICB3b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3k/OiBXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3k7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIGhvdyBhIFdvcmtmbG93IEV4ZWN1dGlvbiBpcyByZXRyaWVkLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBXb3JrZmxvdyBFeGVjdXRpb25zIGFyZSBub3QgcmV0cmllZC4gRG8gbm90IG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYS1yZXRyeS1wb2xpY3kvIHwgTW9yZSBpbmZvcm1hdGlvbn0uXG4gICAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjcm9uIHNjaGVkdWxlIGZvciBXb3JrZmxvdy4gSWYgYSBjcm9uIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIFdvcmtmbG93IHdpbGwgcnVuIGFzIGEgY3JvbiBiYXNlZCBvbiB0aGVcbiAgICogc2NoZWR1bGUuIFRoZSBzY2hlZHVsaW5nIHdpbGwgYmUgYmFzZWQgb24gVVRDIHRpbWUuIFRoZSBzY2hlZHVsZSBmb3IgdGhlIG5leHQgcnVuIG9ubHkgaGFwcGVucyBhZnRlciB0aGUgY3VycmVudFxuICAgKiBydW4gaXMgY29tcGxldGVkL2ZhaWxlZC90aW1lb3V0LiBJZiBhIFJldHJ5UG9saWN5IGlzIGFsc28gc3VwcGxpZWQsIGFuZCB0aGUgV29ya2Zsb3cgZmFpbGVkIG9yIHRpbWVkIG91dCwgdGhlXG4gICAqIFdvcmtmbG93IHdpbGwgYmUgcmV0cmllZCBiYXNlZCBvbiB0aGUgcmV0cnkgcG9saWN5LiBXaGlsZSB0aGUgV29ya2Zsb3cgaXMgcmV0cnlpbmcsIGl0IHdvbid0IHNjaGVkdWxlIGl0cyBuZXh0IHJ1bi5cbiAgICogSWYgdGhlIG5leHQgc2NoZWR1bGUgaXMgZHVlIHdoaWxlIHRoZSBXb3JrZmxvdyBpcyBydW5uaW5nIChvciByZXRyeWluZyksIHRoZW4gaXQgd2lsbCBza2lwIHRoYXQgc2NoZWR1bGUuIENyb25cbiAgICogV29ya2Zsb3cgd2lsbCBub3Qgc3RvcCB1bnRpbCBpdCBpcyB0ZXJtaW5hdGVkIG9yIGNhbmNlbGxlZCAoYnkgcmV0dXJuaW5nIHRlbXBvcmFsLkNhbmNlbGVkRXJyb3IpLlxuICAgKiBodHRwczovL2Nyb250YWIuZ3VydS8gaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHlvdXIgY3JvbiBleHByZXNzaW9ucy5cbiAgICovXG4gIGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgbm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gdG8gYXR0YWNoIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24uIFRoZSB2YWx1ZXMgY2FuIGJlIGFueXRoaW5nIHRoYXRcbiAgICogaXMgc2VyaWFsaXphYmxlIGJ5IHtAbGluayBEYXRhQ29udmVydGVyfS5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlcztcbn1cblxuZXhwb3J0IHR5cGUgV2l0aFdvcmtmbG93QXJnczxXIGV4dGVuZHMgV29ya2Zsb3csIFQ+ID0gVCAmXG4gIChQYXJhbWV0ZXJzPFc+IGV4dGVuZHMgW2FueSwgLi4uYW55W11dXG4gICAgPyB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M6IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH1cbiAgICA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBXb3JrZmxvd1xuICAgICAgICAgKi9cbiAgICAgICAgYXJncz86IFBhcmFtZXRlcnM8Vz4gfCBSZWFkb25seTxQYXJhbWV0ZXJzPFc+PjtcbiAgICAgIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RHVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHdvcmtmbG93IHJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90XG4gICAqIHJlbHkgb24gcnVuIHRpbWVvdXQgZm9yIGJ1c2luZXNzIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVyc1xuICAgKiBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBleGVjdXRpb24gKHdoaWNoIGluY2x1ZGVzIHJ1biByZXRyaWVzIGFuZCBjb250aW51ZSBhcyBuZXcpIGlzXG4gICAqIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBzZXJ2aWNlLiBEbyBub3QgcmVseSBvbiBleGVjdXRpb24gdGltZW91dCBmb3IgYnVzaW5lc3NcbiAgICogbGV2ZWwgdGltZW91dHMuIEl0IGlzIHByZWZlcnJlZCB0byB1c2UgaW4gd29ya2Zsb3cgdGltZXJzIGZvciB0aGlzIHB1cnBvc2UuXG4gICAqXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgb2YgYSBzaW5nbGUgd29ya2Zsb3cgdGFzay4gRGVmYXVsdCBpcyAxMCBzZWNvbmRzLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93VGFza1RpbWVvdXQ/OiBEdXJhdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQ29tbW9uV29ya2Zsb3dPcHRpb25zID0gQmFzZVdvcmtmbG93T3B0aW9ucyAmIFdvcmtmbG93RHVyYXRpb25PcHRpb25zO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFdvcmtmbG93VHlwZTxUIGV4dGVuZHMgV29ya2Zsb3c+KHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnc3RyaW5nJykgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYyBhcyBzdHJpbmc7XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHdvcmtmbG93VHlwZU9yRnVuYz8ubmFtZSkgcmV0dXJuIHdvcmtmbG93VHlwZU9yRnVuYy5uYW1lO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd29ya2Zsb3cgdHlwZTogdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGFub255bW91cycpO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgYEludmFsaWQgd29ya2Zsb3cgdHlwZTogZXhwZWN0ZWQgZWl0aGVyIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24sIGdvdCAnJHt0eXBlb2Ygd29ya2Zsb3dUeXBlT3JGdW5jfSdgXG4gICk7XG59XG4iLCIvLyBBIHBvcnQgb2YgYW4gYWxnb3JpdGhtIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2UuY29tPiwgMjAxMFxuLy8gaHR0cDovL2JhYWdvZS5jb20vZW4vUmFuZG9tTXVzaW5ncy9qYXZhc2NyaXB0L1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL25xdWlubGFuL2JldHRlci1yYW5kb20tbnVtYmVycy1mb3ItamF2YXNjcmlwdC1taXJyb3Jcbi8vIE9yaWdpbmFsIHdvcmsgaXMgdW5kZXIgTUlUIGxpY2Vuc2UgLVxuXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgYnkgSm9oYW5uZXMgQmFhZ8O4ZSA8YmFhZ29lQGJhYWdvZS5vcmc+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuLy8gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkYmF1L3NlZWRyYW5kb20vYmxvYi9yZWxlYXNlZC9saWIvYWxlYS5qc1xuXG5jbGFzcyBBbGVhIHtcbiAgcHVibGljIGM6IG51bWJlcjtcbiAgcHVibGljIHMwOiBudW1iZXI7XG4gIHB1YmxpYyBzMTogbnVtYmVyO1xuICBwdWJsaWMgczI6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihzZWVkOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG1hc2ggPSBuZXcgTWFzaCgpO1xuICAgIC8vIEFwcGx5IHRoZSBzZWVkaW5nIGFsZ29yaXRobSBmcm9tIEJhYWdvZS5cbiAgICB0aGlzLmMgPSAxO1xuICAgIHRoaXMuczAgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMSA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMyID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczAgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMwIDwgMCkge1xuICAgICAgdGhpcy5zMCArPSAxO1xuICAgIH1cbiAgICB0aGlzLnMxIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMSA8IDApIHtcbiAgICAgIHRoaXMuczEgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMiAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczIgPCAwKSB7XG4gICAgICB0aGlzLnMyICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5leHQoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ID0gMjA5MTYzOSAqIHRoaXMuczAgKyB0aGlzLmMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICAgIHRoaXMuczAgPSB0aGlzLnMxO1xuICAgIHRoaXMuczEgPSB0aGlzLnMyO1xuICAgIHJldHVybiAodGhpcy5zMiA9IHQgLSAodGhpcy5jID0gdCB8IDApKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSTkcgPSAoKSA9PiBudW1iZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGVhKHNlZWQ6IG51bWJlcltdKTogUk5HIHtcbiAgY29uc3QgeGcgPSBuZXcgQWxlYShzZWVkKTtcbiAgcmV0dXJuIHhnLm5leHQuYmluZCh4Zyk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXNoIHtcbiAgcHJpdmF0ZSBuID0gMHhlZmM4MjQ5ZDtcblxuICBwdWJsaWMgbWFzaChkYXRhOiBudW1iZXJbXSk6IG51bWJlciB7XG4gICAgbGV0IHsgbiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIG4gKz0gZGF0YVtpXTtcbiAgICAgIGxldCBoID0gMC4wMjUxOTYwMzI4MjQxNjkzOCAqIG47XG4gICAgICBuID0gaCA+Pj4gMDtcbiAgICAgIGggLT0gbjtcbiAgICAgIGggKj0gbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgbiArPSBoICogMHgxMDAwMDAwMDA7IC8vIDJeMzJcbiAgICB9XG4gICAgdGhpcy5uID0gbjtcbiAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3luY0xvY2FsU3RvcmFnZSBhcyBBTFMgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcbmltcG9ydCB7IENhbmNlbGxlZEZhaWx1cmUsIER1cmF0aW9uLCBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9OdW1iZXIgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuXG4vLyBBc3luY0xvY2FsU3RvcmFnZSBpcyBpbmplY3RlZCB2aWEgdm0gbW9kdWxlIGludG8gZ2xvYmFsIHNjb3BlLlxuLy8gSW4gY2FzZSBXb3JrZmxvdyBjb2RlIGlzIGltcG9ydGVkIGluIE5vZGUuanMgY29udGV4dCwgcmVwbGFjZSB3aXRoIGFuIGVtcHR5IGNsYXNzLlxuZXhwb3J0IGNvbnN0IEFzeW5jTG9jYWxTdG9yYWdlOiBuZXcgPFQ+KCkgPT4gQUxTPFQ+ID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Bc3luY0xvY2FsU3RvcmFnZSA/PyBjbGFzcyB7fTtcblxuLyoqIE1hZ2ljIHN5bWJvbCB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBzY29wZSAtIGludGVudGlvbmFsbHkgbm90IGV4cG9ydGVkICovXG5jb25zdCBOT19QQVJFTlQgPSBTeW1ib2woJ05PX1BBUkVOVCcpO1xuXG4vKipcbiAqIE9wdGlvbiBmb3IgY29uc3RydWN0aW5nIGEgQ2FuY2VsbGF0aW9uU2NvcGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMge1xuICAvKipcbiAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzY29wZSBjYW5jZWxsYXRpb24gaXMgYXV0b21hdGljYWxseSByZXF1ZXN0ZWRcbiAgICovXG4gIHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHByZXZlbnQgb3V0ZXIgY2FuY2VsbGF0aW9uIGZyb20gcHJvcGFnYXRpbmcgdG8gaW5uZXIgc2NvcGVzLCBBY3Rpdml0aWVzLCB0aW1lcnMsIGFuZCBUcmlnZ2VycywgZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogKFNjb3BlIHN0aWxsIHByb3BhZ2F0ZXMgQ2FuY2VsbGVkRmFpbHVyZSB0aHJvd24gZnJvbSB3aXRoaW4pLlxuICAgKi9cbiAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLlxuICAgKiBUaGUgYE5PX1BBUkVOVGAgc3ltYm9sIGlzIHJlc2VydmVkIGZvciB0aGUgcm9vdCBzY29wZS5cbiAgICovXG4gIHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlIHwgdHlwZW9mIE5PX1BBUkVOVDtcbn1cblxuLyoqXG4gKiBDYW5jZWxsYXRpb24gU2NvcGVzIHByb3ZpZGUgdGhlIG1lY2hhbmljIGJ5IHdoaWNoIGEgV29ya2Zsb3cgbWF5IGdyYWNlZnVsbHkgaGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGZvciBjYW5jZWxsYXRpb25cbiAqIChlLmcuIGluIHJlc3BvbnNlIHRvIHtAbGluayBXb3JrZmxvd0hhbmRsZS5jYW5jZWx9IG9yIHRocm91Z2ggdGhlIFVJIG9yIENMSSksIGFzIHdlbGwgYXMgcmVxdWVzdCBjYW5jZWxhdGlvbiBvZlxuICogY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBpdCBvd25zIChlLmcuIEFjdGl2aXRpZXMsIFRpbWVycywgQ2hpbGQgV29ya2Zsb3dzLCBldGMpLlxuICpcbiAqIENhbmNlbGxhdGlvbiBTY29wZXMgZm9ybSBhIHRyZWUsIHdpdGggdGhlIFdvcmtmbG93J3MgbWFpbiBmdW5jdGlvbiBydW5uaW5nIGluIHRoZSByb290IHNjb3BlIG9mIHRoYXQgdHJlZS5cbiAqIEJ5IGRlZmF1bHQsIGNhbmNlbGxhdGlvbiBwcm9wYWdhdGVzIGRvd24gZnJvbSBhIHBhcmVudCBzY29wZSB0byBpdHMgY2hpbGRyZW4gYW5kIGl0cyBjYW5jZWxsYWJsZSBvcGVyYXRpb25zLlxuICogQSBub24tY2FuY2VsbGFibGUgc2NvcGUgY2FuIHJlY2VpdmUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLCBidXQgaXMgbmV2ZXIgZWZmZWN0aXZlbHkgY29uc2lkZXJlZCBhcyBjYW5jZWxsZWQsXG4gKiB0aHVzIHNoaWVsZGRpbmcgaXRzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGl0IHJlY2VpdmVzLlxuICpcbiAqIFNjb3BlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBjb25zdHJ1Y3RvciBvciB0aGUgc3RhdGljIGhlbHBlciBtZXRob2RzIHtAbGluayBjYW5jZWxsYWJsZX0sXG4gKiB7QGxpbmsgbm9uQ2FuY2VsbGFibGV9IGFuZCB7QGxpbmsgd2l0aFRpbWVvdXR9LiBgd2l0aFRpbWVvdXRgIGNyZWF0ZXMgYSBzY29wZSB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyBpdHNlbGYgYWZ0ZXJcbiAqIHNvbWUgZHVyYXRpb24uXG4gKlxuICogQ2FuY2VsbGF0aW9uIG9mIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVzdWx0cyBpbiBhbGwgb3BlcmF0aW9ucyBjcmVhdGVkIGRpcmVjdGx5IGluIHRoYXQgc2NvcGUgdG8gdGhyb3cgYVxuICoge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IChlaXRoZXIgZGlyZWN0bHksIG9yIGFzIHRoZSBgY2F1c2VgIG9mIGFuIHtAbGluayBBY3Rpdml0eUZhaWx1cmV9IG9yIGFcbiAqIHtAbGluayBDaGlsZFdvcmtmbG93RmFpbHVyZX0pLiBGdXJ0aGVyIGF0dGVtcHQgdG8gY3JlYXRlIG5ldyBjYW5jZWxsYWJsZSBzY29wZXMgb3IgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyB3aXRoaW4gYVxuICogc2NvcGUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZCB3aWxsIGFsc28gaW1tZWRpYXRlbHkgdGhyb3cgYSB7QGxpbmsgQ2FuY2VsbGVkRmFpbHVyZX0gZXhjZXB0aW9uLiBJdCBpcyBob3dldmVyXG4gKiBwb3NzaWJsZSB0byBjcmVhdGUgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgYXQgdGhhdCBwb2ludDsgdGhpcyBpcyBvZnRlbiB1c2VkIHRvIGV4ZWN1dGUgcm9sbGJhY2sgb3IgY2xlYW51cFxuICogb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqIGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3coLi4uKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIHRyeSB7XG4gKiAgICAgLy8gVGhpcyBhY3Rpdml0eSBydW5zIGluIHRoZSByb290IGNhbmNlbGxhdGlvbiBzY29wZS4gVGhlcmVmb3JlLCBhIGNhbmNlbGF0aW9uIHJlcXVlc3Qgb25cbiAqICAgICAvLyB0aGUgV29ya2Zsb3cgZXhlY3V0aW9uIChlLmcuIHRocm91Z2ggdGhlIFVJIG9yIENMSSkgYXV0b21hdGljYWxseSBwcm9wYWdhdGVzIHRvIHRoaXNcbiAqICAgICAvLyBhY3Rpdml0eS4gQXNzdW1pbmcgdGhhdCB0aGUgYWN0aXZpdHkgcHJvcGVybHkgaGFuZGxlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgdGhlbiB0aGVcbiAqICAgICAvLyBjYWxsIGJlbG93IHdpbGwgdGhyb3cgYW4gYEFjdGl2aXR5RmFpbHVyZWAgZXhjZXB0aW9uLCB3aXRoIGBjYXVzZWAgc2V0cyB0byBhblxuICogICAgIC8vIGluc3RhbmNlIG9mIGBDYW5jZWxsZWRGYWlsdXJlYC5cbiAqICAgICBhd2FpdCBzb21lQWN0aXZpdHkoKTtcbiAqICAgfSBjYXRjaCAoZSkge1xuICogICAgIGlmIChpc0NhbmNlbGxhdGlvbihlKSkge1xuICogICAgICAgLy8gUnVuIGNsZWFudXAgYWN0aXZpdHkgaW4gYSBub24tY2FuY2VsbGFibGUgc2NvcGVcbiAqICAgICAgIGF3YWl0IENhbmNlbGxhdGlvblNjb3BlLm5vbkNhbmNlbGxhYmxlKGFzeW5jICgpID0+IHtcbiAqICAgICAgICAgYXdhaXQgY2xlYW51cEFjdGl2aXR5KCk7XG4gKiAgICAgICB9XG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRocm93IGU7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIGNhbmNlbGxhYmxlIHNjb3BlIG1heSBiZSBwcm9ncmFtYXRpY2FsbHkgY2FuY2VsbGVkIGJ5IGNhbGxpbmcge0BsaW5rIGNhbmNlbHxgc2NvcGUuY2FuY2VsKClgfWAuIFRoaXMgbWF5IGJlIHVzZWQsXG4gKiBmb3IgZXhhbXBsZSwgdG8gZXhwbGljaXRseSByZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiBhbiBBY3Rpdml0eSBvciBDaGlsZCBXb3JrZmxvdzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKCk7XG4gKiBjb25zdCBhY3Rpdml0eVByb21pc2UgPSBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUucnVuKCgpID0+IHNvbWVBY3Rpdml0eSgpKTtcbiAqIGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZS5jYW5jZWwoKTsgLy8gQ2FuY2VscyB0aGUgYWN0aXZpdHlcbiAqIGF3YWl0IGFjdGl2aXR5UHJvbWlzZTsgLy8gVGhyb3dzIGBBY3Rpdml0eUZhaWx1cmVgIHdpdGggYGNhdXNlYCBzZXQgdG8gYENhbmNlbGxlZEZhaWx1cmVgXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENhbmNlbGxhdGlvblNjb3BlIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgc2NvcGUgY2FuY2VsbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgcmVxdWVzdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHRoZW4gdGhpcyBzY29wZSB3aWxsIG5ldmVyIGJlIGNvbnNpZGVyZWQgY2FuY2VsbGVkLCBldmVuIGlmIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaXMgcmVjZWl2ZWQgKGVpdGhlclxuICAgKiBkaXJlY3RseSBieSBjYWxsaW5nIGBzY29wZS5jYW5jZWwoKWAgb3IgaW5kaXJlY3RseSBieSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgcGFyZW50IHNjb3BlKS4gVGhpcyBlZmZlY3RpdmVseVxuICAgKiBzaGllbGRzIHRoZSBzY29wZSdzIGNoaWxkcmVuIGFuZCBjYW5jZWxsYWJsZSBvcGVyYXRpb25zIGZyb20gcHJvcGFnYXRpb24gb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIG1hZGUgb24gdGhlXG4gICAqIG5vbi1jYW5jZWxsYWJsZSBzY29wZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBQcm9taXNlIHJldHVybmVkIGJ5IHRoZSBgcnVuYCBmdW5jdGlvbiBvZiBub24tY2FuY2VsbGFibGUgc2NvcGUgbWF5IHN0aWxsIHRocm93IGEgYENhbmNlbGxlZEZhaWx1cmVgXG4gICAqIGlmIHN1Y2ggYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIHdpdGhpbiB0aGF0IHNjb3BlIChlLmcuIGJ5IGRpcmVjdGx5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBjaGlsZCBzY29wZSkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuY2VsbGFibGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIENhbmNlbGxhdGlvblNjb3BlICh1c2VmdWwgZm9yIHJ1bm5pbmcgYmFja2dyb3VuZCB0YXNrcyksIGRlZmF1bHRzIHRvIHtAbGluayBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50fSgpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50PzogQ2FuY2VsbGF0aW9uU2NvcGU7XG5cbiAgLyoqXG4gICAqIEEgUHJvbWlzZSB0aGF0IHRocm93cyB3aGVuIGEgY2FuY2VsbGFibGUgc2NvcGUgcmVjZWl2ZXMgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCwgZWl0aGVyIGRpcmVjdGx5XG4gICAqIChpLmUuIGBzY29wZS5jYW5jZWwoKWApLCBvciBpbmRpcmVjdGx5IChieSBjYW5jZWxsaW5nIGEgY2FuY2VsbGFibGUgcGFyZW50IHNjb3BlKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG1heSByZWNlaXZlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cywgcmVzdWx0aW5nIGluIHRoZSBgY2FuY2VsUmVxdWVzdGVkYCBwcm9taXNlIGZvclxuICAgKiB0aGF0IHNjb3BlIHRvIHRocm93LCB0aG91Z2ggdGhlIHNjb3BlIHdpbGwgbm90IGVmZmVjdGl2ZWx5IGdldCBjYW5jZWxsZWQgKGkuZS4gYGNvbnNpZGVyZWRDYW5jZWxsZWRgIHdpbGwgc3RpbGxcbiAgICogcmV0dXJuIGBmYWxzZWAsIGFuZCBjYW5jZWxsYXRpb24gd2lsbCBub3QgYmUgcHJvcGFnYXRlZCB0byBjaGlsZCBzY29wZXMgYW5kIGNvbnRhaW5lZCBvcGVyYXRpb25zKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5jZWxSZXF1ZXN0ZWQ6IFByb21pc2U8bmV2ZXI+O1xuXG4gICNjYW5jZWxSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICAvLyBUeXBlc2NyaXB0IGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCB0aGUgUHJvbWlzZSBleGVjdXRvciBydW5zIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgLy8gQHRzLWlnbm9yZVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSBtc09wdGlvbmFsVG9OdW1iZXIob3B0aW9ucz8udGltZW91dCk7XG4gICAgdGhpcy5jYW5jZWxsYWJsZSA9IG9wdGlvbnM/LmNhbmNlbGxhYmxlID8/IHRydWU7XG4gICAgdGhpcy5jYW5jZWxSZXF1ZXN0ZWQgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRTQyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGUgUHJvbWlzZSBleGVjdXRvciBydW5zIHN5bmNocm9ub3VzbHlcbiAgICAgIHRoaXMucmVqZWN0ID0gKGVycikgPT4ge1xuICAgICAgICB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdW50cmFja1Byb21pc2UodGhpcy5jYW5jZWxSZXF1ZXN0ZWQpO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gICAgaWYgKG9wdGlvbnM/LnBhcmVudCAhPT0gTk9fUEFSRU5UKSB7XG4gICAgICB0aGlzLnBhcmVudCA9IG9wdGlvbnM/LnBhcmVudCB8fCBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGFyZW50LmNhbmNlbGxhYmxlIHx8XG4gICAgICAgICh0aGlzLnBhcmVudC4jY2FuY2VsUmVxdWVzdGVkICYmXG4gICAgICAgICAgIWdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy4jY2FuY2VsUmVxdWVzdGVkID0gdGhpcy5wYXJlbnQuI2NhbmNlbFJlcXVlc3RlZDtcbiAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0KGVycik7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgIHRoaXMucGFyZW50LmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWdldEFjdGl2YXRvcigpLmhhc0ZsYWcoU2RrRmxhZ3MuTm9uQ2FuY2VsbGFibGVTY29wZXNBcmVTaGllbGRlZEZyb21Qcm9wYWdhdGlvbikpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzY29wZSB3YXMgZWZmZWN0aXZlbHkgY2FuY2VsbGVkLiBBIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBjYW4gbmV2ZXIgYmUgY29uc2lkZXJlZCBjYW5jZWxsZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnNpZGVyZWRDYW5jZWxsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCAmJiB0aGlzLmNhbmNlbGxhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBzY29wZSBhcyBjdXJyZW50IGFuZCBydW4gIGBmbmBcbiAgICpcbiAgICogQW55IHRpbWVycywgQWN0aXZpdGllcywgVHJpZ2dlcnMgYW5kIENhbmNlbGxhdGlvblNjb3BlcyBjcmVhdGVkIGluIHRoZSBib2R5IG9mIGBmbmBcbiAgICogYXV0b21hdGljYWxseSBsaW5rIHRoZWlyIGNhbmNlbGxhdGlvbiB0byB0aGlzIHNjb3BlLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgYGZuYFxuICAgKi9cbiAgcnVuPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHN0b3JhZ2UucnVuKHRoaXMsIHRoaXMucnVuSW5Db250ZXh0LmJpbmQodGhpcywgZm4pIGFzICgpID0+IFByb21pc2U8VD4pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0aGF0IHJ1bnMgYSBmdW5jdGlvbiBpbiBBc3luY0xvY2FsU3RvcmFnZSBjb250ZXh0LlxuICAgKlxuICAgKiBDb3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBhcyBhbm9ueW1vdXMgZnVuY3Rpb24sIG1hZGUgaW50byBhIG1ldGhvZCBmb3IgaW1wcm92ZWQgc3RhY2sgdHJhY2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1bkluQ29udGV4dDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGxldCB0aW1lclNjb3BlOiBDYW5jZWxsYXRpb25TY29wZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICB0aW1lclNjb3BlID0gbmV3IENhbmNlbGxhdGlvblNjb3BlKCk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgdGltZXJTY29wZVxuICAgICAgICAgIC5ydW4oKCkgPT4gc2xlZXAodGhpcy50aW1lb3V0IGFzIG51bWJlcikpXG4gICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNhbmNlbCgpLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBzY29wZSB3YXMgYWxyZWFkeSBjYW5jZWxsZWQsIGlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKFxuICAgICAgICB0aW1lclNjb3BlICYmXG4gICAgICAgICF0aW1lclNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQgJiZcbiAgICAgICAgZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIHRpbWVyU2NvcGUuY2FuY2VsKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdG8gY2FuY2VsIHRoZSBzY29wZSBhbmQgbGlua2VkIGNoaWxkcmVuXG4gICAqL1xuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5yZWplY3QobmV3IENhbmNlbGxlZEZhaWx1cmUoJ0NhbmNlbGxhdGlvbiBzY29wZSBjYW5jZWxsZWQnKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgc2NvcGVcbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCk6IENhbmNlbGxhdGlvblNjb3BlIHtcbiAgICAvLyBVc2luZyBnbG9iYWxzIGRpcmVjdGx5IGluc3RlYWQgb2YgYSBoZWxwZXIgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0XG4gICAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fVEVNUE9SQUxfQUNUSVZBVE9SX18ucm9vdFNjb3BlO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgY2FuY2VsbGFibGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogdHJ1ZSB9KS5ydW4oZm4pO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoeyBjYW5jZWxsYWJsZTogZmFsc2UgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIG5vbkNhbmNlbGxhYmxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgY2FuY2VsbGFibGU6IGZhbHNlIH0pLnJ1bihmbik7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlLCB0aW1lb3V0IH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB3aXRoVGltZW91dDxUPih0aW1lb3V0OiBEdXJhdGlvbiwgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogdHJ1ZSwgdGltZW91dCB9KS5ydW4oZm4pO1xuICB9XG59XG5cbmNvbnN0IHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8Q2FuY2VsbGF0aW9uU2NvcGU+KCk7XG5cbi8qKlxuICogQXZvaWQgZXhwb3NpbmcgdGhlIHN0b3JhZ2UgZGlyZWN0bHkgc28gaXQgZG9lc24ndCBnZXQgZnJvemVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlU3RvcmFnZSgpOiB2b2lkIHtcbiAgc3RvcmFnZS5kaXNhYmxlKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBSb290Q2FuY2VsbGF0aW9uU2NvcGUgZXh0ZW5kcyBDYW5jZWxsYXRpb25TY29wZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgY2FuY2VsbGFibGU6IHRydWUsIHBhcmVudDogTk9fUEFSRU5UIH0pO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KG5ldyBDYW5jZWxsZWRGYWlsdXJlKCdXb3JrZmxvdyBjYW5jZWxsZWQnKSk7XG4gIH1cbn1cblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGlzIG1vZHVsZSBhbmQgd29ya2Zsb3cudHMgKi9cbmxldCBzbGVlcCA9IChfOiBEdXJhdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGhhcyBub3QgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZCcpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbihmbjogdHlwZW9mIHNsZWVwKTogdm9pZCB7XG4gIHNsZWVwID0gZm47XG59XG4iLCJpbXBvcnQgeyBBY3Rpdml0eUZhaWx1cmUsIENhbmNlbGxlZEZhaWx1cmUsIENoaWxkV29ya2Zsb3dGYWlsdXJlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgd29ya2Zsb3cgZXJyb3JzXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIGluIHdvcmtmbG93IHdoZW4gaXQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIHRoYXQgbm9uLWRldGVybWluaXN0aWMgc3VjaCBhcyBjb25zdHJ1Y3QgYSBXZWFrUmVmKClcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yJylcbmV4cG9ydCBjbGFzcyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yIGV4dGVuZHMgV29ya2Zsb3dFcnJvciB7fVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBhY3RzIGFzIGEgbWFya2VyIGZvciB0aGlzIHNwZWNpYWwgcmVzdWx0IHR5cGVcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmJylcbmV4cG9ydCBjbGFzcyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmFja29mZjogY29yZXNkay5hY3Rpdml0eV9yZXN1bHQuSURvQmFja29mZikge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgcHJvdmlkZWQgYGVycmAgaXMgY2F1c2VkIGJ5IGNhbmNlbGxhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb24oZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSB8fFxuICAgICgoZXJyIGluc3RhbmNlb2YgQWN0aXZpdHlGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIENoaWxkV29ya2Zsb3dGYWlsdXJlKSAmJiBlcnIuY2F1c2UgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlKVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgdHlwZSBTZGtGbGFnID0ge1xuICBnZXQgaWQoKTogbnVtYmVyO1xuICBnZXQgZGVmYXVsdCgpOiBib29sZWFuO1xuICBnZXQgYWx0ZXJuYXRpdmVDb25kaXRpb25zKCk6IEFsdENvbmRpdGlvbkZuW10gfCB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBmbGFnc1JlZ2lzdHJ5OiBNYXA8bnVtYmVyLCBTZGtGbGFnPiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGNvbnN0IFNka0ZsYWdzID0ge1xuICAvKipcbiAgICogVGhpcyBmbGFnIGdhdGVzIG11bHRpcGxlIGZpeGVzIHJlbGF0ZWQgdG8gY2FuY2VsbGF0aW9uIHNjb3BlcyBhbmQgdGltZXJzIGludHJvZHVjZWQgaW4gMS4xMC4yLzEuMTEuMDpcbiAgICogLSBDYW5jZWxsYXRpb24gb2YgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgbm8gbG9uZ2VyIHByb3BhZ2F0ZXMgdG8gY2hpbGRyZW4gc2NvcGVzXG4gICAqICAgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVtcG9yYWxpby9zZGstdHlwZXNjcmlwdC9pc3N1ZXMvMTQyMykuXG4gICAqIC0gQ2FuY2VsbGF0aW9uU2NvcGUud2l0aFRpbWVvdXQoZm4pIG5vdyBjYW5jZWwgdGhlIHRpbWVyIGlmIGBmbmAgY29tcGxldGVzIGJlZm9yZSBleHBpcmF0aW9uXG4gICAqICAgb2YgdGhlIHRpbWVvdXQsIHNpbWlsYXIgdG8gaG93IGBjb25kaXRpb24oZm4sIHRpbWVvdXQpYCB3b3Jrcy5cbiAgICogLSBUaW1lcnMgY3JlYXRlZCB1c2luZyBzZXRUaW1lb3V0IGNhbiBub3cgYmUgaW50ZXJjZXB0ZWQuXG4gICAqXG4gICAqIEBzaW5jZSBJbnRyb2R1Y2VkIGluIDEuMTAuMi8xLjExLjAuIEhvd2V2ZXIsIGR1ZSB0byBhbiBTREsgYnVnLCBTREtzIHYxLjExLjAgYW5kIHYxLjExLjEgd2VyZSBub3RcbiAgICogICAgICAgIHByb3Blcmx5IHdyaXRpbmcgYmFjayB0aGUgZmxhZ3MgdG8gaGlzdG9yeSwgcG9zc2libHkgcmVzdWx0aW5nIGluIE5ERSBvbiByZXBsYXkuIFdlIHRoZXJlZm9yZVxuICAgKiAgICAgICAgY29uc2lkZXIgdGhhdCBhIFdGVCBlbWl0dGVkIGJ5IFdvcmtlciB2MS4xMS4wIG9yIHYxLjExLjEgdG8gaW1wbGljaXRseSBoYXZlIHRoaXMgZmxhZyBvbi5cbiAgICovXG4gIE5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb246IGRlZmluZUZsYWcoMSwgdHJ1ZSwgW2J1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcygvMVxcLjExXFwuWzAxXS8pXSksXG5cbiAgLyoqXG4gICAqIFByaW9yIHRvIDEuMTEuMCwgd2hlbiBwcm9jZXNzaW5nIGEgV29ya2Zsb3cgYWN0aXZhdGlvbiwgdGhlIFNESyB3b3VsZCBleGVjdXRlIGBub3RpZnlIYXNQYXRjaGBcbiAgICogYW5kIGBzaWduYWxXb3JrZmxvd2Agam9icyBpbiBkaXN0aW5jdCBwaGFzZXMsIGJlZm9yZSBvdGhlciB0eXBlcyBvZiBqb2JzLiBUaGUgcHJpbWFyeSByZWFzb25cbiAgICogYmVoaW5kIHRoYXQgbXVsdGktcGhhc2UgYWxnb3JpdGhtIHdhcyB0byBhdm9pZCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhIFdvcmtmbG93IGV4ZWN1dGlvbiBtaWdodFxuICAgKiBjb21wbGV0ZSBiZWZvcmUgYWxsIGluY29taW5nIHNpZ25hbHMgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgKGF0IGxlYXN0IHRvIHRoZSBwb2ludCB0aGF0IHRoZVxuICAgKiBfc3luY2hyb25vdXNfIHBhcnQgb2YgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQpLlxuICAgKlxuICAgKiBUaGlzIGZsYWcgcmVwbGFjZXMgdGhhdCBtdWx0aS1waGFzZSBhbGdvcml0aG0gd2l0aCBhIHNpbXBsZXIgb25lIHdoZXJlIGpvYnMgYXJlIHNpbXBseSBzb3J0ZWQgYXNcbiAgICogYChzaWduYWxzIGFuZCB1cGRhdGVzKSAtPiBvdGhlcnNgLCBidXQgd2l0aG91dCBwcm9jZXNzaW5nIHRoZW0gYXMgZGlzdGluY3QgYmF0Y2hlcyAoaS5lLiB3aXRob3V0XG4gICAqIGxlYXZpbmcvcmVlbnRlcmluZyB0aGUgVk0gY29udGV4dCBiZXR3ZWVuIGVhY2ggZ3JvdXAsIHdoaWNoIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcnMgdGhlIGV4ZWN1dGlvblxuICAgKiBvZiBhbGwgb3V0c3RhbmRpbmcgbWljcm90YXNrcykuIFRoYXQgc2luZ2xlLXBoYXNlIGFwcHJvYWNoIHJlc29sdmVzIGEgbnVtYmVyIG9mIHF1aXJrcyBvZiB0aGVcbiAgICogZm9ybWVyIGFsZ29yaXRobSwgYW5kIHlldCBzdGlsbCBzYXRpc2ZpZXMgdG8gdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50IG9mIGVuc3VyaW5nIHRoYXQgZXZlcnlcbiAgICogYHNpZ25hbFdvcmtmbG93YCBqb2JzIC0gYW5kIG5vdyBgZG9VcGRhdGVgIGpvYnMgYXMgd2VsbCAtIGhhdmUgYmVlbiBnaXZlbiBhIHByb3BlciBjaGFuY2UgdG9cbiAgICogZXhlY3V0ZSBiZWZvcmUgdGhlIFdvcmtmbG93IG1haW4gZnVuY3Rpb24gbWlnaHQgY29tcGxldGVzLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjExLjAuIFRoaXMgY2hhbmdlIGlzIG5vdCByb2xsYmFjay1zYWZlLiBIb3dldmVyLCBkdWUgdG8gYW4gU0RLIGJ1ZywgU0RLc1xuICAgKiAgICAgICAgdjEuMTEuMCBhbmQgdjEuMTEuMSB3ZXJlIG5vdCBwcm9wZXJseSB3cml0aW5nIGJhY2sgdGhlIGZsYWdzIHRvIGhpc3RvcnksIHBvc3NpYmx5IHJlc3VsdGluZ1xuICAgKiAgICAgICAgaW4gTkRFIG9uIHJlcGxheS4gV2UgdGhlcmVmb3JlIGNvbnNpZGVyIHRoYXQgYSBXRlQgZW1pdHRlZCBieSBXb3JrZXIgdjEuMTEuMCBvciB2MS4xMS4xXG4gICAqICAgICAgICB0byBpbXBsaWNpdGVseSBoYXZlIHRoaXMgZmxhZyBvbi5cbiAgICovXG4gIFByb2Nlc3NXb3JrZmxvd0FjdGl2YXRpb25Kb2JzQXNTaW5nbGVCYXRjaDogZGVmaW5lRmxhZygyLCB0cnVlLCBbYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKC8xXFwuMTFcXC5bMDFdLyldKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGRlZmluZUZsYWcoaWQ6IG51bWJlciwgZGVmOiBib29sZWFuLCBhbHRlcm5hdGl2ZUNvbmRpdGlvbnM/OiBBbHRDb25kaXRpb25GbltdKTogU2RrRmxhZyB7XG4gIGNvbnN0IGZsYWcgPSB7IGlkLCBkZWZhdWx0OiBkZWYsIGFsdGVybmF0aXZlQ29uZGl0aW9ucyB9O1xuICBmbGFnc1JlZ2lzdHJ5LnNldChpZCwgZmxhZyk7XG4gIHJldHVybiBmbGFnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VmFsaWRGbGFnKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFmbGFnc1JlZ2lzdHJ5LmhhcyhpZCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gU0RLIGZsYWc6ICR7aWR9YCk7XG59XG5cbi8qKlxuICogQW4gU0RLIEZsYWcgQWx0ZXJuYXRlIENvbmRpdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZsYWdcbiAqIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdGVDsgZS5nLiBieSBsb29raW5nIGF0IHRoZSB2ZXJzaW9uIG9mIHRoZSBTREtcbiAqIHRoYXQgZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVFxuICogZW1pdHRlZCBieSBwcmV2aW91cyBTREtzIHRoYXQgY29udGFpbmVkIGEgYnVnLlxuICpcbiAqIE5vdGUgdGhhdCBjb25kaXRpb25zIGFyZSBvbmx5IGV2YWx1YXRlZCB3aGlsZSByZXBsYXlpbmcsIGFuZCBvbmx5IGlmIHRoZSBjb3JyZXNwb25pbmcgZmxhZyBpc1xuICogbm90IGFscmVhZHkgc2V0LiBBbHNvLCBhbHRlcm5hdGUgY29uZGl0aW9ucyB3aWxsIG5vdCBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlXG4gKiBcInVzZWQgZmxhZ3NcIiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgZnVydGhlciBXb3JrZmxvdyBUYXNrcyBtYXkgbm90IHJlZmxlY3QgdGhpcyBmbGFnIGlmIHRoZVxuICogY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3QgYmVoYXZpb3JzIGluIGNhc2Ugd2hlcmUgYSBXb3JrZmxvd1xuICogRXhlY3V0aW9uIGhhcyBnb25lIHRocm91Z2ggYSBuZXdlciBTREsgdmVyc2lvbiB0aGVuIGFnYWluIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICovXG50eXBlIEFsdENvbmRpdGlvbkZuID0gKGN0eDogeyBpbmZvOiBXb3JrZmxvd0luZm8gfSkgPT4gYm9vbGVhbjtcblxuZnVuY3Rpb24gYnVpbGRJZFNka1ZlcnNpb25NYXRjaGVzKHZlcnNpb246IFJlZ0V4cCk6IEFsdENvbmRpdGlvbkZuIHtcbiAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeQHRlbXBvcmFsaW8vd29ya2VyQCgke3ZlcnNpb24uc291cmNlfSlbK11gKTtcbiAgcmV0dXJuICh7IGluZm8gfSkgPT4gaW5mby5jdXJyZW50QnVpbGRJZCAhPSBudWxsICYmIHJlZ2V4LnRlc3QoaW5mby5jdXJyZW50QnVpbGRJZCk7XG59XG4iLCJpbXBvcnQgeyBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyB0eXBlIEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlR2V0QWN0aXZhdG9yVW50eXBlZCgpOiB1bmtub3duIHtcbiAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkuX19URU1QT1JBTF9BQ1RJVkFUT1JfXztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEFjdGl2YXRvclVudHlwZWQoYWN0aXZhdG9yOiB1bmtub3duKTogdm9pZCB7XG4gIChnbG9iYWxUaGlzIGFzIGFueSkuX19URU1QT1JBTF9BQ1RJVkFUT1JfXyA9IGFjdGl2YXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlR2V0QWN0aXZhdG9yKCk6IEFjdGl2YXRvciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBtYXliZUdldEFjdGl2YXRvclVudHlwZWQoKSBhcyBBY3RpdmF0b3IgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbldvcmtmbG93Q29udGV4dChtZXNzYWdlOiBzdHJpbmcpOiBBY3RpdmF0b3Ige1xuICBjb25zdCBhY3RpdmF0b3IgPSBtYXliZUdldEFjdGl2YXRvcigpO1xuICBpZiAoYWN0aXZhdG9yID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGFjdGl2YXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2YXRvcigpOiBBY3RpdmF0b3Ige1xuICBjb25zdCBhY3RpdmF0b3IgPSBtYXliZUdldEFjdGl2YXRvcigpO1xuICBpZiAoYWN0aXZhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgfVxuICByZXR1cm4gYWN0aXZhdG9yO1xufVxuIiwiLyoqXG4gKiBPdmVycmlkZXMgc29tZSBnbG9iYWwgb2JqZWN0cyB0byBtYWtlIHRoZW0gZGV0ZXJtaW5pc3RpYy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IG1zVG9UcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdGltZSc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IFNka0ZsYWdzIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vd29ya2Zsb3cnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIGFueTtcbmNvbnN0IE9yaWdpbmFsRGF0ZSA9IGdsb2JhbFRoaXMuRGF0ZTtcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJyaWRlR2xvYmFscygpOiB2b2lkIHtcbiAgLy8gTW9jayBhbnkgd2VhayByZWZlcmVuY2UgYmVjYXVzZSBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYyBhbmQgdGhlIGVmZmVjdCBpcyBvYnNlcnZhYmxlIGZyb20gdGhlIFdvcmtmbG93LlxuICAvLyBXb3JrZmxvdyBkZXZlbG9wZXIgd2lsbCBnZXQgYSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiBpZiB0aGV5IHRyeSB0byB1c2UgdGhlc2UuXG4gIGdsb2JhbC5XZWFrUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdXZWFrUmVmIGNhbm5vdCBiZSB1c2VkIGluIFdvcmtmbG93cyBiZWNhdXNlIHY4IEdDIGlzIG5vbi1kZXRlcm1pbmlzdGljJyk7XG4gIH07XG4gIGdsb2JhbC5GaW5hbGl6YXRpb25SZWdpc3RyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBuZXcgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvcihcbiAgICAgICdGaW5hbGl6YXRpb25SZWdpc3RyeSBjYW5ub3QgYmUgdXNlZCBpbiBXb3JrZmxvd3MgYmVjYXVzZSB2OCBHQyBpcyBub24tZGV0ZXJtaW5pc3RpYydcbiAgICApO1xuICB9O1xuXG4gIGdsb2JhbC5EYXRlID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBuZXcgKE9yaWdpbmFsRGF0ZSBhcyBhbnkpKC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9yaWdpbmFsRGF0ZShnZXRBY3RpdmF0b3IoKS5ub3cpO1xuICB9O1xuXG4gIGdsb2JhbC5EYXRlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0QWN0aXZhdG9yKCkubm93O1xuICB9O1xuXG4gIGdsb2JhbC5EYXRlLnBhcnNlID0gT3JpZ2luYWxEYXRlLnBhcnNlLmJpbmQoT3JpZ2luYWxEYXRlKTtcbiAgZ2xvYmFsLkRhdGUuVVRDID0gT3JpZ2luYWxEYXRlLlVUQy5iaW5kKE9yaWdpbmFsRGF0ZSk7XG5cbiAgZ2xvYmFsLkRhdGUucHJvdG90eXBlID0gT3JpZ2luYWxEYXRlLnByb3RvdHlwZTtcblxuICBjb25zdCB0aW1lb3V0Q2FuY2VsYXRpb25TY29wZXMgPSBuZXcgTWFwPG51bWJlciwgQ2FuY2VsbGF0aW9uU2NvcGU+KCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciwgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMS5cbiAgICovXG4gIGdsb2JhbC5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKGNiOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgbXM6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBudW1iZXIge1xuICAgIG1zID0gTWF0aC5tYXgoMSwgbXMpO1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGlmIChhY3RpdmF0b3IuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSkge1xuICAgICAgLy8gQ2FwdHVyZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgc2xlZXAgd2lsbCBhbGxvY2F0ZVxuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyO1xuICAgICAgY29uc3QgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgc2xlZXBQcm9taXNlID0gdGltZXJTY29wZS5ydW4oKCkgPT4gc2xlZXAobXMpKTtcbiAgICAgIHNsZWVwUHJvbWlzZS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgIGNiKC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGF0aW9uU2NvcGVzLmRlbGV0ZShzZXEpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdW50cmFja1Byb21pc2Uoc2xlZXBQcm9taXNlKTtcbiAgICAgIHRpbWVvdXRDYW5jZWxhdGlvblNjb3Blcy5zZXQoc2VxLCB0aW1lclNjb3BlKTtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuICAgICAgLy8gQ3JlYXRlIGEgUHJvbWlzZSBmb3IgQXN5bmNMb2NhbFN0b3JhZ2UgdG8gYmUgYWJsZSB0byB0cmFjayB0aGlzIGNvbXBsZXRpb24gdXNpbmcgcHJvbWlzZSBob29rcy5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLnNldChzZXEsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKG1zKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRoZW4oXG4gICAgICAgICgpID0+IGNiKC4uLmFyZ3MpLFxuICAgICAgICAoKSA9PiB1bmRlZmluZWQgLyogaWdub3JlIGNhbmNlbGxhdGlvbiAqL1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICB9O1xuXG4gIGdsb2JhbC5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoaGFuZGxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICBjb25zdCB0aW1lclNjb3BlID0gdGltZW91dENhbmNlbGF0aW9uU2NvcGVzLmdldChoYW5kbGUpO1xuICAgIGlmICh0aW1lclNjb3BlKSB7XG4gICAgICB0aW1lb3V0Q2FuY2VsYXRpb25TY29wZXMuZGVsZXRlKGhhbmRsZSk7XG4gICAgICB0aW1lclNjb3BlLmNhbmNlbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3RpdmF0b3IubmV4dFNlcXMudGltZXIrKzsgLy8gU2hvdWxkbid0IGluY3JlYXNlIHNlcSBudW1iZXIsIGJ1dCB0aGF0J3MgdGhlIGxlZ2FjeSBiZWhhdmlvclxuICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgY2FuY2VsVGltZXI6IHtcbiAgICAgICAgICBzZXE6IGhhbmRsZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBhY3RpdmF0b3IucmFuZG9tIGlzIG11dGFibGUsIGRvbid0IGhhcmRjb2RlIGl0cyByZWZlcmVuY2VcbiAgTWF0aC5yYW5kb20gPSAoKSA9PiBnZXRBY3RpdmF0b3IoKS5yYW5kb20oKTtcbn1cbiIsIi8qKlxuICogVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIHRvb2xzIHJlcXVpcmVkIGZvciBhdXRob3Jpbmcgd29ya2Zsb3dzLlxuICpcbiAqICMjIFVzYWdlXG4gKiBTZWUgdGhlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9oZWxsby13b3JsZCN3b3JrZmxvd3MgfCB0dXRvcmlhbH0gZm9yIHdyaXRpbmcgeW91ciBmaXJzdCB3b3JrZmxvdy5cbiAqXG4gKiAjIyMgVGltZXJzXG4gKlxuICogVGhlIHJlY29tbWVuZGVkIHdheSBvZiBzY2hlZHVsaW5nIHRpbWVycyBpcyBieSB1c2luZyB0aGUge0BsaW5rIHNsZWVwfSBmdW5jdGlvbi4gV2UndmUgcmVwbGFjZWQgYHNldFRpbWVvdXRgIGFuZFxuICogYGNsZWFyVGltZW91dGAgd2l0aCBkZXRlcm1pbmlzdGljIHZlcnNpb25zIHNvIHRoZXNlIGFyZSBhbHNvIHVzYWJsZSBidXQgaGF2ZSBhIGxpbWl0YXRpb24gdGhhdCB0aGV5IGRvbid0IHBsYXkgd2VsbFxuICogd2l0aCB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvY2FuY2VsbGF0aW9uLXNjb3BlcyB8IGNhbmNlbGxhdGlvbiBzY29wZXN9LlxuICpcbiAqIDwhLS1TTklQU1RBUlQgdHlwZXNjcmlwdC1zbGVlcC13b3JrZmxvdy0tPlxuICogPCEtLVNOSVBFTkQtLT5cbiAqXG4gKiAjIyMgQWN0aXZpdGllc1xuICpcbiAqIFRvIHNjaGVkdWxlIEFjdGl2aXRpZXMsIHVzZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBvYnRhaW4gYW4gQWN0aXZpdHkgZnVuY3Rpb24gYW5kIGNhbGwuXG4gKlxuICogPCEtLVNOSVBTVEFSVCB0eXBlc2NyaXB0LXNjaGVkdWxlLWFjdGl2aXR5LXdvcmtmbG93LS0+XG4gKiA8IS0tU05JUEVORC0tPlxuICpcbiAqICMjIyBVcGRhdGVzLCBTaWduYWxzIGFuZCBRdWVyaWVzXG4gKlxuICogVXNlIHtAbGluayBzZXRIYW5kbGVyfSB0byBzZXQgaGFuZGxlcnMgZm9yIFVwZGF0ZXMsIFNpZ25hbHMsIGFuZCBRdWVyaWVzLlxuICpcbiAqIFVwZGF0ZSBhbmQgU2lnbmFsIGhhbmRsZXJzIGNhbiBiZSBlaXRoZXIgYXN5bmMgb3Igbm9uLWFzeW5jIGZ1bmN0aW9ucy4gVXBkYXRlIGhhbmRsZXJzIG1heSByZXR1cm4gYSB2YWx1ZSwgYnV0IHNpZ25hbFxuICogaGFuZGxlcnMgbWF5IG5vdCAocmV0dXJuIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmApLiBZb3UgbWF5IHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsIGNoaWxkIFdvcmtmbG93cywgZXRjIGluIFVwZGF0ZVxuICogYW5kIFNpZ25hbCBoYW5kbGVycywgYnV0IHRoaXMgc2hvdWxkIGJlIGRvbmUgY2F1dGlvdXNseTogZm9yIGV4YW1wbGUsIG5vdGUgdGhhdCBpZiB5b3UgYXdhaXQgYXN5bmMgb3BlcmF0aW9ucyBzdWNoIGFzXG4gKiB0aGVzZSBpbiBhbiBVcGRhdGUgb3IgU2lnbmFsIGhhbmRsZXIsIHRoZW4geW91IGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgd29ya2Zsb3cgZG9lcyBub3QgY29tcGxldGUgZmlyc3QuXG4gKlxuICogUXVlcnkgaGFuZGxlcnMgbWF5ICoqbm90KiogYmUgYXN5bmMgZnVuY3Rpb25zLCBhbmQgbWF5ICoqbm90KiogbXV0YXRlIGFueSB2YXJpYWJsZXMgb3IgdXNlIEFjdGl2aXRpZXMsIFRpbWVycyxcbiAqIGNoaWxkIFdvcmtmbG93cywgZXRjLlxuICpcbiAqICMjIyMgSW1wbGVtZW50YXRpb25cbiAqXG4gKiA8IS0tU05JUFNUQVJUIHR5cGVzY3JpcHQtd29ya2Zsb3ctdXBkYXRlLXNpZ25hbC1xdWVyeS1leGFtcGxlLS0+XG4gKiA8IS0tU05JUEVORC0tPlxuICpcbiAqICMjIyBNb3JlXG4gKlxuICogLSBbRGV0ZXJtaW5pc3RpYyBidWlsdC1pbnNdKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RldGVybWluaXNtI3NvdXJjZXMtb2Ytbm9uLWRldGVybWluaXNtKVxuICogLSBbQ2FuY2VsbGF0aW9uIGFuZCBzY29wZXNdKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2NhbmNlbGxhdGlvbi1zY29wZXMpXG4gKiAgIC0ge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfVxuICogICAtIHtAbGluayBUcmlnZ2VyfVxuICogLSBbU2lua3NdKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9hcHBsaWNhdGlvbi1kZXZlbG9wbWVudC9vYnNlcnZhYmlsaXR5Lz9sYW5nPXRzI2xvZ2dpbmcpXG4gKiAgIC0ge0BsaW5rIFNpbmtzfVxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5leHBvcnQge1xuICBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIEFjdGl2aXR5RmFpbHVyZSxcbiAgQWN0aXZpdHlPcHRpb25zLFxuICBBcHBsaWNhdGlvbkZhaWx1cmUsXG4gIENhbmNlbGxlZEZhaWx1cmUsXG4gIENoaWxkV29ya2Zsb3dGYWlsdXJlLFxuICBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgUmV0cnlQb2xpY3ksXG4gIHJvb3RDYXVzZSxcbiAgU2VydmVyRmFpbHVyZSxcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBUZXJtaW5hdGVkRmFpbHVyZSxcbiAgVGltZW91dEZhaWx1cmUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2Vycm9ycyc7XG5leHBvcnQge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eUludGVyZmFjZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBQYXlsb2FkLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UXVlcnlUeXBlLFxuICBXb3JrZmxvd1Jlc3VsdFR5cGUsXG4gIFdvcmtmbG93UmV0dXJuVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlLCBDYW5jZWxsYXRpb25TY29wZSwgQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zLFxuICBDb250aW51ZUFzTmV3LFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBTdGFja1RyYWNlRmlsZUxvY2F0aW9uLFxuICBTdGFja1RyYWNlRmlsZVNsaWNlLFxuICBQYXJlbnRDbG9zZVBvbGljeSxcbiAgUGFyZW50V29ya2Zsb3dJbmZvLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZSxcbiAgVW5zYWZlV29ya2Zsb3dJbmZvLFxuICBXb3JrZmxvd0luZm8sXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgeyBwcm94eVNpbmtzLCBTaW5rLCBTaW5rQ2FsbCwgU2lua0Z1bmN0aW9uLCBTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2dzJztcbmV4cG9ydCB7IFRyaWdnZXIgfSBmcm9tICcuL3RyaWdnZXInO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdyc7XG5leHBvcnQgeyBDaGlsZFdvcmtmbG93SGFuZGxlLCBFeHRlcm5hbFdvcmtmbG93SGFuZGxlIH0gZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuXG4vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaXMgZGVwcmVjYXRlZFxuXG5leHBvcnQge1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAgICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICAgKiAgICAgICAgICAgICBieSBXb3JrZmxvdyBjb2RlLCBzZXQgdGhlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gcHJvcGVydHkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGFzIExvZ2dlclNpbmtzLFxufSBmcm9tICcuL2xvZ3MnO1xuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGFuZCBnZW5lcmljIGhlbHBlcnMgZm9yIGludGVyY2VwdG9ycy5cbiAqXG4gKiBUaGUgV29ya2Zsb3cgc3BlY2lmaWMgaW50ZXJjZXB0b3JzIGFyZSBkZWZpbmVkIGhlcmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEFjdGl2aXR5T3B0aW9ucywgSGVhZGVycywgTG9jYWxBY3Rpdml0eU9wdGlvbnMsIE5leHQsIFRpbWVzdGFtcCwgV29ya2Zsb3dFeGVjdXRpb24gfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsIENvbnRpbnVlQXNOZXdPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHsgTmV4dCwgSGVhZGVycyB9O1xuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuZXhlY3V0ZSAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGVJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVVwZGF0ZSBhbmRcbiAqIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IudmFsaWRhdGVVcGRhdGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5wdXQge1xuICByZWFkb25seSB1cGRhdGVJZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVNpZ25hbCAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxJbnB1dCB7XG4gIHJlYWRvbmx5IHNpZ25hbE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuaGFuZGxlUXVlcnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlJbnB1dCB7XG4gIHJlYWRvbmx5IHF1ZXJ5SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcXVlcnlOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnQgYW55IG9mIHRoZXNlIG1ldGhvZHMgdG8gaW50ZXJjZXB0IFdvcmtmbG93IGluYm91bmQgY2FsbHMgbGlrZSBleGVjdXRpb24sIGFuZCBzaWduYWwgYW5kIHF1ZXJ5IGhhbmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgZXhlY3V0ZSBtZXRob2QgaXMgY2FsbGVkXG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBXb3JrZmxvdyBleGVjdXRpb25cbiAgICovXG4gIGV4ZWN1dGU/OiAoaW5wdXQ6IFdvcmtmbG93RXhlY3V0ZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdleGVjdXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqIENhbGxlZCB3aGVuIFVwZGF0ZSBoYW5kbGVyIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgVXBkYXRlXG4gICAqL1xuICBoYW5kbGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdoYW5kbGVVcGRhdGUnPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKiogQ2FsbGVkIHdoZW4gdXBkYXRlIHZhbGlkYXRvciBjYWxsZWQgKi9cbiAgdmFsaWRhdGVVcGRhdGU/OiAoaW5wdXQ6IFVwZGF0ZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICd2YWxpZGF0ZVVwZGF0ZSc+KSA9PiB2b2lkO1xuXG4gIC8qKiBDYWxsZWQgd2hlbiBzaWduYWwgaXMgZGVsaXZlcmVkIHRvIGEgV29ya2Zsb3cgZXhlY3V0aW9uICovXG4gIGhhbmRsZVNpZ25hbD86IChpbnB1dDogU2lnbmFsSW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2hhbmRsZVNpZ25hbCc+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIFdvcmtmbG93IGlzIHF1ZXJpZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIHF1ZXJ5XG4gICAqL1xuICBoYW5kbGVRdWVyeT86IChpbnB1dDogUXVlcnlJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnaGFuZGxlUXVlcnknPikgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zY2hlZHVsZUFjdGl2aXR5ICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5SW5wdXQge1xuICByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNjaGVkdWxlTG9jYWxBY3Rpdml0eSAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEFjdGl2aXR5SW5wdXQge1xuICByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG9yaWdpbmFsU2NoZWR1bGVUaW1lPzogVGltZXN0YW1wO1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG59XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0IHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydFRpbWVyICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVySW5wdXQge1xuICByZWFkb25seSBkdXJhdGlvbk1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgQ29udGludWVBc05ld09wdGlvbnMgYnV0IHdvcmtmbG93VHlwZSBtdXN0IGJlIGRlZmluZWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGludWVBc05ld0lucHV0T3B0aW9ucyA9IENvbnRpbnVlQXNOZXdPcHRpb25zICYgUmVxdWlyZWQ8UGljazxDb250aW51ZUFzTmV3T3B0aW9ucywgJ3dvcmtmbG93VHlwZSc+PjtcblxuLyoqIElucHV0IGZvciBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5jb250aW51ZUFzTmV3ICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRpbnVlQXNOZXdJbnB1dCB7XG4gIHJlYWRvbmx5IGFyZ3M6IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgb3B0aW9uczogQ29udGludWVBc05ld0lucHV0T3B0aW9ucztcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zaWduYWxXb3JrZmxvdyAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxXb3JrZmxvd0lucHV0IHtcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNpZ25hbE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSB0YXJnZXQ6XG4gICAgfCB7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6ICdleHRlcm5hbCc7XG4gICAgICAgIHJlYWRvbmx5IHdvcmtmbG93RXhlY3V0aW9uOiBXb3JrZmxvd0V4ZWN1dGlvbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogJ2NoaWxkJztcbiAgICAgICAgcmVhZG9ubHkgY2hpbGRXb3JrZmxvd0lkOiBzdHJpbmc7XG4gICAgICB9O1xufVxuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLmdldExvZ0F0dHJpYnV0ZXMgKi9cbmV4cG9ydCB0eXBlIEdldExvZ0F0dHJpYnV0ZXNJbnB1dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEltcGxlbWVudCBhbnkgb2YgdGhlc2UgbWV0aG9kcyB0byBpbnRlcmNlcHQgV29ya2Zsb3cgY29kZSBjYWxscyB0byB0aGUgVGVtcG9yYWwgQVBJcywgbGlrZSBzY2hlZHVsaW5nIGFuIGFjdGl2aXR5IGFuZCBzdGFydGluZyBhIHRpbWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Ige1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2NoZWR1bGVzIGFuIEFjdGl2aXR5XG4gICAqXG4gICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpdml0eSBleGVjdXRpb25cbiAgICovXG4gIHNjaGVkdWxlQWN0aXZpdHk/OiAoaW5wdXQ6IEFjdGl2aXR5SW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ3NjaGVkdWxlQWN0aXZpdHknPikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2NoZWR1bGVzIGEgbG9jYWwgQWN0aXZpdHlcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGFjdGl2aXR5IGV4ZWN1dGlvblxuICAgKi9cbiAgc2NoZWR1bGVMb2NhbEFjdGl2aXR5PzogKGlucHV0OiBMb2NhbEFjdGl2aXR5SW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ3NjaGVkdWxlTG9jYWxBY3Rpdml0eSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzdGFydHMgYSB0aW1lclxuICAgKi9cbiAgc3RhcnRUaW1lcj86IChpbnB1dDogVGltZXJJbnB1dCwgbmV4dDogTmV4dDx0aGlzLCAnc3RhcnRUaW1lcic+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBjYWxscyBjb250aW51ZUFzTmV3XG4gICAqL1xuICBjb250aW51ZUFzTmV3PzogKGlucHV0OiBDb250aW51ZUFzTmV3SW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ2NvbnRpbnVlQXNOZXcnPikgPT4gUHJvbWlzZTxuZXZlcj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHNpZ25hbHMgYSBjaGlsZCBvciBleHRlcm5hbCBXb3JrZmxvd1xuICAgKi9cbiAgc2lnbmFsV29ya2Zsb3c/OiAoaW5wdXQ6IFNpZ25hbFdvcmtmbG93SW5wdXQsIG5leHQ6IE5leHQ8dGhpcywgJ3NpZ25hbFdvcmtmbG93Jz4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIGNoaWxkIHdvcmtmbG93IGV4ZWN1dGlvbiwgdGhlIGludGVyY2VwdG9yIGZ1bmN0aW9uIHJldHVybnMgMiBwcm9taXNlczpcbiAgICpcbiAgICogLSBUaGUgZmlyc3QgcmVzb2x2ZXMgd2l0aCB0aGUgYHJ1bklkYCB3aGVuIHRoZSBjaGlsZCB3b3JrZmxvdyBoYXMgc3RhcnRlZCBvciByZWplY3RzIGlmIGZhaWxlZCB0byBzdGFydC5cbiAgICogLSBUaGUgc2Vjb25kIHJlc29sdmVzIHdpdGggdGhlIHdvcmtmbG93IHJlc3VsdCB3aGVuIHRoZSBjaGlsZCB3b3JrZmxvdyBjb21wbGV0ZXMgb3IgcmVqZWN0cyBvbiBmYWlsdXJlLlxuICAgKi9cbiAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uPzogKFxuICAgIGlucHV0OiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCxcbiAgICBuZXh0OiBOZXh0PHRoaXMsICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nPlxuICApID0+IFByb21pc2U8W1Byb21pc2U8c3RyaW5nPiwgUHJvbWlzZTx1bmtub3duPl0+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBgd29ya2Zsb3cubG9nYCBtZXRob2RzLlxuICAgKlxuICAgKiBUaGUgYXR0cmlidXRlcyByZXR1cm5lZCBpbiB0aGlzIGNhbGwgYXJlIGF0dGFjaGVkIHRvIGV2ZXJ5IGxvZyBtZXNzYWdlLlxuICAgKi9cbiAgZ2V0TG9nQXR0cmlidXRlcz86IChpbnB1dDogR2V0TG9nQXR0cmlidXRlc0lucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdnZXRMb2dBdHRyaWJ1dGVzJz4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogSW5wdXQgZm9yIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuY29uY2x1ZGVBY3RpdmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmNsdWRlQWN0aXZhdGlvbklucHV0IHtcbiAgY29tbWFuZHM6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZFtdO1xufVxuXG4vKiogT3V0cHV0IGZvciBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmNvbmNsdWRlQWN0aXZhdGlvbiAqL1xuZXhwb3J0IHR5cGUgQ29uY2x1ZGVBY3RpdmF0aW9uT3V0cHV0ID0gQ29uY2x1ZGVBY3RpdmF0aW9uSW5wdXQ7XG5cbi8qKiBJbnB1dCBmb3IgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5hY3RpdmF0ZSAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0ZUlucHV0IHtcbiAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb247XG4gIGJhdGNoSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIElucHV0IGZvciBXb3JrZmxvd0ludGVybmFsc0ludGVyY2VwdG9yLmRpc3Bvc2UgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zZUlucHV0IHt9XG5cbi8qKlxuICogSW50ZXJjZXB0b3IgZm9yIHRoZSBpbnRlcm5hbHMgb2YgdGhlIFdvcmtmbG93IHJ1bnRpbWUuXG4gKlxuICogVXNlIHRvIG1hbmlwdWxhdGUgb3IgdHJhY2UgV29ya2Zsb3cgYWN0aXZhdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIEFQSSBpcyBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgV29ya2Zsb3cgcnVudGltZSBydW5zIGEgV29ya2Zsb3dBY3RpdmF0aW9uSm9iLlxuICAgKi9cbiAgYWN0aXZhdGU/KGlucHV0OiBBY3RpdmF0ZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdhY3RpdmF0ZSc+KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIGFsbCBgV29ya2Zsb3dBY3RpdmF0aW9uSm9iYHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgYW4gYWN0aXZhdGlvbi5cbiAgICpcbiAgICogQ2FuIG1hbmlwdWxhdGUgdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBieSB0aGUgV29ya2Zsb3dcbiAgICovXG4gIGNvbmNsdWRlQWN0aXZhdGlvbj8oaW5wdXQ6IENvbmNsdWRlQWN0aXZhdGlvbklucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdjb25jbHVkZUFjdGl2YXRpb24nPik6IENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dDtcblxuICAvKipcbiAgICogQ2FsbGVkIGJlZm9yZSBkaXNwb3NpbmcgdGhlIFdvcmtmbG93IGlzb2xhdGUgY29udGV4dC5cbiAgICpcbiAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAuXG4gICAqL1xuICBkaXNwb3NlPyhpbnB1dDogRGlzcG9zZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdkaXNwb3NlJz4pOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgbWFwcGluZyBmcm9tIGludGVyY2VwdG9yIHR5cGUgdG8gYW4gb3B0aW9uYWwgbGlzdCBvZiBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0ludGVyY2VwdG9ycyB7XG4gIGluYm91bmQ/OiBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIG91dGJvdW5kPzogV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3JbXTtcbiAgaW50ZXJuYWxzPzogV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvcltdO1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHtAbGluayBXb3JrZmxvd0ludGVyY2VwdG9yc30gYW5kIHRha2VzIG5vIGFyZ3VtZW50cy5cbiAqXG4gKiBXb3JrZmxvdyBpbnRlcmNlcHRvciBtb2R1bGVzIHNob3VsZCBleHBvcnQgYW4gYGludGVyY2VwdG9yc2AgZnVuY3Rpb24gb2YgdGhpcyB0eXBlLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBmdW5jdGlvbiBpbnRlcmNlcHRvcnMoKTogV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICogICByZXR1cm4ge1xuICogICAgIGluYm91bmQ6IFtdLCAgIC8vIFBvcHVsYXRlIHdpdGggbGlzdCBvZiBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgICBvdXRib3VuZDogW10sICAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgICAgaW50ZXJuYWxzOiBbXSwgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uc1xuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSA9ICgpID0+IFdvcmtmbG93SW50ZXJjZXB0b3JzO1xuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB7XG4gIFJldHJ5UG9saWN5LFxuICBUZW1wb3JhbEZhaWx1cmUsXG4gIENvbW1vbldvcmtmbG93T3B0aW9ucyxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNpZ25hbERlZmluaXRpb24sXG4gIFVwZGF0ZURlZmluaXRpb24sXG4gIFF1ZXJ5RGVmaW5pdGlvbixcbiAgRHVyYXRpb24sXG4gIFZlcnNpb25pbmdJbnRlbnQsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdHlwZS1oZWxwZXJzJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdy9lbnVtcy1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcblxuLyoqXG4gKiBXb3JrZmxvdyBFeGVjdXRpb24gaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0luZm8ge1xuICAvKipcbiAgICogSUQgb2YgdGhlIFdvcmtmbG93LCB0aGlzIGNhbiBiZSBzZXQgYnkgdGhlIGNsaWVudCBkdXJpbmcgV29ya2Zsb3cgY3JlYXRpb24uXG4gICAqIEEgc2luZ2xlIFdvcmtmbG93IG1heSBydW4gbXVsdGlwbGUgdGltZXMgZS5nLiB3aGVuIHNjaGVkdWxlZCB3aXRoIGNyb24uXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElEIG9mIGEgc2luZ2xlIFdvcmtmbG93IHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV29ya2Zsb3cgZnVuY3Rpb24ncyBuYW1lXG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd1R5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXM7XG5cbiAgLyoqXG4gICAqIE5vbi1pbmRleGVkIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogUGFyZW50IFdvcmtmbG93IGluZm8gKHByZXNlbnQgaWYgdGhpcyBpcyBhIENoaWxkIFdvcmtmbG93KVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50PzogUGFyZW50V29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBSZXN1bHQgZnJvbSB0aGUgcHJldmlvdXMgUnVuIChwcmVzZW50IGlmIHRoaXMgaXMgYSBDcm9uIFdvcmtmbG93IG9yIHdhcyBDb250aW51ZWQgQXMgTmV3KS5cbiAgICpcbiAgICogQW4gYXJyYXkgb2YgdmFsdWVzLCBzaW5jZSBvdGhlciBTREtzIG1heSByZXR1cm4gbXVsdGlwbGUgdmFsdWVzIGZyb20gYSBXb3JrZmxvdy5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3RSZXN1bHQ/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBGYWlsdXJlIGZyb20gdGhlIHByZXZpb3VzIFJ1biAocHJlc2VudCB3aGVuIHRoaXMgUnVuIGlzIGEgcmV0cnksIG9yIHRoZSBsYXN0IFJ1biBvZiBhIENyb24gV29ya2Zsb3cgZmFpbGVkKVxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdEZhaWx1cmU/OiBUZW1wb3JhbEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIExlbmd0aCBvZiBXb3JrZmxvdyBoaXN0b3J5IHVwIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogWW91IG1heSBzYWZlbHkgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZGVjaWRlIHdoZW4gdG8ge0BsaW5rIGNvbnRpbnVlQXNOZXd9LlxuICAgKi9cbiAgcmVhZG9ubHkgaGlzdG9yeUxlbmd0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIFdvcmtmbG93IGhpc3RvcnkgaW4gYnl0ZXMgdW50aWwgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgb25seSBvbiBUZW1wb3JhbCBTZXJ2ZXIgMS4yMCssIGFsd2F5cyB6ZXJvIG9uIG9sZGVyIHNlcnZlcnMuXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlTaXplOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgaGludCBwcm92aWRlZCBieSB0aGUgY3VycmVudCBXb3JrZmxvd1Rhc2tTdGFydGVkIGV2ZW50IHJlY29tbWVuZGluZyB3aGV0aGVyIHRvXG4gICAqIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgb25seSBvbiBUZW1wb3JhbCBTZXJ2ZXIgMS4yMCssIGFsd2F5cyBgZmFsc2VgIG9uIG9sZGVyIHNlcnZlcnMuXG4gICAqL1xuICByZWFkb25seSBjb250aW51ZUFzTmV3U3VnZ2VzdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIHRoaXMgV29ya2Zsb3cgaXMgZXhlY3V0aW5nIG9uXG4gICAqL1xuICByZWFkb25seSB0YXNrUXVldWU6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZXNwYWNlIHRoaXMgV29ya2Zsb3cgaXMgZXhlY3V0aW5nIGluXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZztcblxuICAvKipcbiAgICogUnVuIElkIG9mIHRoZSBmaXJzdCBSdW4gaW4gdGhpcyBFeGVjdXRpb24gQ2hhaW5cbiAgICovXG4gIHJlYWRvbmx5IGZpcnN0RXhlY3V0aW9uUnVuSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxhc3QgUnVuIElkIGluIHRoaXMgRXhlY3V0aW9uIENoYWluXG4gICAqL1xuICByZWFkb25seSBjb250aW51ZWRGcm9tRXhlY3V0aW9uUnVuSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWUgYXQgd2hpY2ggdGhpcyBbV29ya2Zsb3cgRXhlY3V0aW9uIENoYWluXShodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2Zsb3dzI3dvcmtmbG93LWV4ZWN1dGlvbi1jaGFpbikgd2FzIHN0YXJ0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGltZTogRGF0ZTtcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGUgY3VycmVudCBXb3JrZmxvdyBSdW4gc3RhcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcnVuU3RhcnRUaW1lOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIFdvcmtmbG93IEV4ZWN1dGlvbiBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgU2VydmVyLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRpbWVvdXRNcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIGV4cGlyZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkV4cGlyYXRpb25UaW1lPzogRGF0ZTtcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBXb3JrZmxvdyBSdW4gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIFNlcnZlci4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93UnVuVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSBydW5UaW1lb3V0TXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gZXhlY3V0aW9uIHRpbWUgb2YgYSBXb3JrZmxvdyBUYXNrIGluIG1pbGxpc2Vjb25kcy4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93VGFza1RpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgdGFza1RpbWVvdXRNczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXRyeSBQb2xpY3kgZm9yIHRoaXMgRXhlY3V0aW9uLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMucmV0cnl9LlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlQb2xpY3k/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogU3RhcnRzIGF0IDEgYW5kIGluY3JlbWVudHMgZm9yIGV2ZXJ5IHJldHJ5IGlmIHRoZXJlIGlzIGEgYHJldHJ5UG9saWN5YFxuICAgKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcm9uIFNjaGVkdWxlIGZvciB0aGlzIEV4ZWN1dGlvbi4gU2V0IHZpYSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLmNyb25TY2hlZHVsZX0uXG4gICAqL1xuICByZWFkb25seSBjcm9uU2NoZWR1bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBiZXR3ZWVuIENyb24gUnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgY3JvblNjaGVkdWxlVG9TY2hlZHVsZUludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgQnVpbGQgSUQgb2YgdGhlIHdvcmtlciB3aGljaCBleGVjdXRlZCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLiBNYXkgYmUgdW5kZWZpbmVkIGlmIHRoZVxuICAgKiB0YXNrIHdhcyBjb21wbGV0ZWQgYnkgYSB3b3JrZXIgd2l0aG91dCBhIEJ1aWxkIElELiBJZiB0aGlzIHdvcmtlciBpcyB0aGUgb25lIGV4ZWN1dGluZyB0aGlzXG4gICAqIHRhc2sgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBoYXMgYSBCdWlsZCBJRCBzZXQsIHRoZW4gaXRzIElEIHdpbGwgYmUgdXNlZC4gVGhpcyB2YWx1ZSBtYXkgY2hhbmdlXG4gICAqIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSB3b3JrZmxvdyBydW4sIGJ1dCBpcyBkZXRlcm1pbmlzdGljIGFuZCBzYWZlIHRvIHVzZSBmb3IgYnJhbmNoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEJ1aWxkSWQ/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgdW5zYWZlOiBVbnNhZmVXb3JrZmxvd0luZm87XG59XG5cbi8qKlxuICogVW5zYWZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvbi5cbiAqXG4gKiBOZXZlciByZWx5IG9uIHRoaXMgaW5mb3JtYXRpb24gaW4gV29ya2Zsb3cgbG9naWMgYXMgaXQgd2lsbCBjYXVzZSBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnNhZmVXb3JrZmxvd0luZm8ge1xuICAvKipcbiAgICogQ3VycmVudCBzeXN0ZW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICpcbiAgICogVGhlIHNhZmUgdmVyc2lvbiBvZiB0aW1lIGlzIGBuZXcgRGF0ZSgpYCBhbmQgYERhdGUubm93KClgLCB3aGljaCBhcmUgc2V0IG9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIGEgV29ya2Zsb3dcbiAgICogVGFzayBhbmQgc3RheSBjb25zdGFudCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBUYXNrIGFuZCBkdXJpbmcgcmVwbGF5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmc6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYSB3b3JrZmxvdyB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSW5mbyB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHVwZGF0ZSB0eXBlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50V29ya2Zsb3dJbmZvIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBOb3QgYW4gYWN0dWFsIGVycm9yLCB1c2VkIGJ5IHRoZSBXb3JrZmxvdyBydW50aW1lIHRvIGFib3J0IGV4ZWN1dGlvbiB3aGVuIHtAbGluayBjb250aW51ZUFzTmV3fSBpcyBjYWxsZWRcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdDb250aW51ZUFzTmV3JylcbmV4cG9ydCBjbGFzcyBDb250aW51ZUFzTmV3IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JQ29udGludWVBc05ld1dvcmtmbG93RXhlY3V0aW9uKSB7XG4gICAgc3VwZXIoJ1dvcmtmbG93IGNvbnRpbnVlZCBhcyBuZXcnKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnRpbnVpbmcgYSBXb3JrZmxvdyBhcyBuZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250aW51ZUFzTmV3T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFdvcmtmbG93IHR5cGUgbmFtZSwgZS5nLiB0aGUgZmlsZW5hbWUgaW4gdGhlIE5vZGUuanMgU0RLIG9yIGNsYXNzIG5hbWUgaW4gSmF2YVxuICAgKi9cbiAgd29ya2Zsb3dUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGFzayBxdWV1ZSB0byBjb250aW51ZSB0aGUgV29ya2Zsb3cgaW5cbiAgICovXG4gIHRhc2tRdWV1ZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIHRoZSBlbnRpcmUgV29ya2Zsb3cgcnVuXG4gICAqIEBmb3JtYXQge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93UnVuVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGltZW91dCBmb3IgYSBzaW5nbGUgV29ya2Zsb3cgdGFza1xuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1Rhc2tUaW1lb3V0PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBOb24tc2VhcmNoYWJsZSBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byBuZXh0IFdvcmtmbG93IHJ1blxuICAgKi9cbiAgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogU2VhcmNoYWJsZSBhdHRyaWJ1dGVzIHRvIGF0dGFjaCB0byBuZXh0IFdvcmtmbG93IHJ1blxuICAgKi9cbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXM7XG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHRoZSBXb3JrZXIgVmVyc2lvbmluZyBmZWF0dXJlLCBzcGVjaWZpZXMgd2hldGhlciB0aGlzIFdvcmtmbG93IHNob3VsZFxuICAgKiBDb250aW51ZS1hcy1OZXcgb250byBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICB2ZXJzaW9uaW5nSW50ZW50PzogVmVyc2lvbmluZ0ludGVudDtcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXM6XG4gKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGFyZSBzZW50IHRvIHRoZSBDaGlsZFxuICogLSB3aGV0aGVyIGFuZCB3aGVuIGEge0BsaW5rIENhbmNlbGVkRmFpbHVyZX0gaXMgdGhyb3duIGZyb20ge0BsaW5rIGV4ZWN1dGVDaGlsZH0gb3JcbiAqICAge0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fVxuICpcbiAqIEBkZWZhdWx0IHtAbGluayBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUR9XG4gKi9cbmV4cG9ydCB0eXBlIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlID1cbiAgKHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlXTtcbmV4cG9ydCBjb25zdCBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSA9IHtcbiAgLyoqXG4gICAqIERvbid0IHNlbmQgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCB0byB0aGUgQ2hpbGQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCB0byB0aGUgQ2hpbGQuIEltbWVkaWF0ZWx5IHRocm93IHRoZSBlcnJvci5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogU2VuZCBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHRvIHRoZSBDaGlsZC4gVGhlIENoaWxkIG1heSByZXNwZWN0IGNhbmNlbGxhdGlvbiwgaW4gd2hpY2ggY2FzZSBhbiBlcnJvciB3aWxsIGJlIHRocm93blxuICAgKiB3aGVuIGNhbmNlbGxhdGlvbiBoYXMgY29tcGxldGVkLCBhbmQge0BsaW5rIGlzQ2FuY2VsbGF0aW9ufShlcnJvcikgd2lsbCBiZSB0cnVlLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIENoaWxkIG1heVxuICAgKiBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LCBpbiB3aGljaCBjYXNlIGFuIGVycm9yIG1pZ2h0IGJlIHRocm93biB3aXRoIGEgZGlmZmVyZW50IGNhdXNlLCBvciB0aGUgQ2hpbGQgbWF5XG4gICAqIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogQGRlZmF1bHRcbiAgICovXG4gIFdBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRDogJ1dBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRCcsXG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCB0byB0aGUgQ2hpbGQuIFRocm93IHRoZSBlcnJvciBvbmNlIHRoZSBTZXJ2ZXIgcmVjZWl2ZXMgdGhlIENoaWxkIGNhbmNlbGxhdGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEJyxcbn0gYXMgY29uc3Q7XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLCBkZWNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gICcnXG4+KFxuICB7XG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLkFCQU5ET05dOiAwLFxuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5UUllfQ0FOQ0VMXTogMSxcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXTogMixcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEXTogMyxcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG5cbi8qKlxuICogSG93IGEgQ2hpbGQgV29ya2Zsb3cgcmVhY3RzIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3cgcmVhY2hpbmcgYSBDbG9zZWQgc3RhdGUuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYS1wYXJlbnQtY2xvc2UtcG9saWN5LyB8IFBhcmVudCBDbG9zZSBQb2xpY3l9XG4gKi9cbmV4cG9ydCB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbmV4cG9ydCBjb25zdCBQYXJlbnRDbG9zZVBvbGljeSA9IHtcbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIHRoZSBDaGlsZCBpcyBUZXJtaW5hdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgVEVSTUlOQVRFOiAnVEVSTUlOQVRFJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICovXG4gIFJFUVVFU1RfQ0FOQ0VMOiAnUkVRVUVTVF9DQU5DRUwnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBJZiBhIGBQYXJlbnRDbG9zZVBvbGljeWAgaXMgc2V0IHRvIHRoaXMsIG9yIGlzIG5vdCBzZXQgYXQgYWxsLCB0aGUgc2VydmVyIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHNldCBhbiBleHBsaWNpdCBwb2xpY3kgaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEV9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURTogJ1RFUk1JTkFURScsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgbm90aGluZyBpcyBkb25lIHRvIHRoZSBDaGlsZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiAnQUJBTkRPTicsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cblxuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5SRVFVRVNUX0NBTkNFTH0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbn0gYXMgY29uc3Q7XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ksXG4gICdQQVJFTlRfQ0xPU0VfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFXTogMSxcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTl06IDIsXG4gICAgW1BhcmVudENsb3NlUG9saWN5LlJFUVVFU1RfQ0FOQ0VMXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGlsZFdvcmtmbG93T3B0aW9ucyBleHRlbmRzIENvbW1vbldvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JrZmxvdyBpZCB0byB1c2Ugd2hlbiBzdGFydGluZy4gSWYgbm90IHNwZWNpZmllZCBhIFVVSUQgaXMgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgaXQgaXNcbiAgICogZGFuZ2Vyb3VzIGFzIGluIGNhc2Ugb2YgY2xpZW50IHNpZGUgcmV0cmllcyBubyBkZWR1cGxpY2F0aW9uIHdpbGwgaGFwcGVuIGJhc2VkIG9uIHRoZVxuICAgKiBnZW5lcmF0ZWQgaWQuIFNvIHByZWZlciBhc3NpZ25pbmcgYnVzaW5lc3MgbWVhbmluZ2Z1bCBpZHMgaWYgcG9zc2libGUuXG4gICAqL1xuICB3b3JrZmxvd0lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXNrIHF1ZXVlIHRvIHVzZSBmb3IgV29ya2Zsb3cgdGFza3MuIEl0IHNob3VsZCBtYXRjaCBhIHRhc2sgcXVldWUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgYVxuICAgKiBgV29ya2VyYCB0aGF0IGhvc3RzIHRoZSBXb3JrZmxvdyBjb2RlLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhIGNoaWxkIGlzIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSBUYXNrIFF1ZXVlIGFzIHRoZSBwYXJlbnQuXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBhcmUgc2VudCB0byB0aGUgQ2hpbGRcbiAgICogLSB3aGV0aGVyIGFuZCB3aGVuIGFuIGVycm9yIGlzIHRocm93biBmcm9tIHtAbGluayBleGVjdXRlQ2hpbGR9IG9yXG4gICAqICAge0BsaW5rIENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0fVxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEfVxuICAgKi9cbiAgY2FuY2VsbGF0aW9uVHlwZT86IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBDaGlsZCByZWFjdHMgdG8gdGhlIFBhcmVudCBXb3JrZmxvdyByZWFjaGluZyBhIENsb3NlZCBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlBBUkVOVF9DTE9TRV9QT0xJQ1lfVEVSTUlOQVRFfVxuICAgKi9cbiAgcGFyZW50Q2xvc2VQb2xpY3k/OiBQYXJlbnRDbG9zZVBvbGljeTtcblxuICAvKipcbiAgICogV2hlbiB1c2luZyB0aGUgV29ya2VyIFZlcnNpb25pbmcgZmVhdHVyZSwgc3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBDaGlsZCBXb3JrZmxvdyBzaG91bGQgcnVuIG9uXG4gICAqIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50O1xufVxuXG5leHBvcnQgdHlwZSBSZXF1aXJlZENoaWxkV29ya2Zsb3dPcHRpb25zID0gUmVxdWlyZWQ8UGljazxDaGlsZFdvcmtmbG93T3B0aW9ucywgJ3dvcmtmbG93SWQnIHwgJ2NhbmNlbGxhdGlvblR5cGUnPj4gJiB7XG4gIGFyZ3M6IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzID0gQ2hpbGRXb3JrZmxvd09wdGlvbnMgJiBSZXF1aXJlZENoaWxkV29ya2Zsb3dPcHRpb25zO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VTREtJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNsaWNlIG9mIGEgZmlsZSBzdGFydGluZyBhdCBsaW5lT2Zmc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZUZpbGVTbGljZSB7XG4gIC8qKlxuICAgKiBPbmx5IHVzZWQgcG9zc2libGUgdG8gdHJpbSB0aGUgZmlsZSB3aXRob3V0IGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuXG4gICAqL1xuICBsaW5lX29mZnNldDogbnVtYmVyO1xuICAvKipcbiAgICogc2xpY2Ugb2YgYSBmaWxlIHdpdGggYFxcbmAgKG5ld2xpbmUpIGxpbmUgdGVybWluYXRvci5cbiAgICovXG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBpbiBhIGZpbGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlRmlsZUxvY2F0aW9uIHtcbiAgLyoqXG4gICAqIFBhdGggdG8gc291cmNlIGZpbGUgKGFic29sdXRlIG9yIHJlbGF0aXZlKS5cbiAgICogV2hlbiB1c2luZyBhIHJlbGF0aXZlIHBhdGgsIG1ha2Ugc3VyZSBhbGwgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzYW1lIHJvb3QuXG4gICAqL1xuICBmaWxlX3BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJZiBwb3NzaWJsZSwgU0RLIHNob3VsZCBzZW5kIHRoaXMsIHJlcXVpcmVkIGZvciBkaXNwbGF5aW5nIHRoZSBjb2RlIGxvY2F0aW9uLlxuICAgKi9cbiAgbGluZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIHBvc3NpYmxlLCBTREsgc2hvdWxkIHNlbmQgdGhpcy5cbiAgICovXG4gIGNvbHVtbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG5hbWUgdGhpcyBsaW5lIGJlbG9uZ3MgdG8gKGlmIGFwcGxpY2FibGUpLlxuICAgKiBVc2VkIGZvciBmYWxsaW5nIGJhY2sgdG8gc3RhY2sgdHJhY2Ugdmlldy5cbiAgICovXG4gIGZ1bmN0aW9uX25hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGbGFnIHRvIG1hcmsgdGhpcyBhcyBpbnRlcm5hbCBTREsgY29kZSBhbmQgaGlkZSBieSBkZWZhdWx0IGluIHRoZSBVSS5cbiAgICovXG4gIGludGVybmFsX2NvZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZSB7XG4gIGxvY2F0aW9uczogU3RhY2tUcmFjZUZpbGVMb2NhdGlvbltdO1xufVxuXG4vKipcbiAqIFVzZWQgYXMgdGhlIHJlc3VsdCBmb3IgdGhlIGVuaGFuY2VkIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZWRTdGFja1RyYWNlIHtcbiAgc2RrOiBTdGFja1RyYWNlU0RLSW5mbztcbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgZmlsZSBwYXRoIHRvIGZpbGUgY29udGVudHMuXG4gICAqIFNESyBtYXkgY2hvb3NlIHRvIHNlbmQgbm8sIHNvbWUgb3IgYWxsIHNvdXJjZXMuXG4gICAqIFNvdXJjZXMgbWlnaHQgYmUgdHJpbW1lZCwgYW5kIHNvbWUgdGltZSBvbmx5IHRoZSBmaWxlKHMpIG9mIHRoZSB0b3AgZWxlbWVudCBvZiB0aGUgdHJhY2Ugd2lsbCBiZSBzZW50LlxuICAgKi9cbiAgc291cmNlczogUmVjb3JkPHN0cmluZywgU3RhY2tUcmFjZUZpbGVTbGljZVtdPjtcbiAgc3RhY2tzOiBTdGFja1RyYWNlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dDcmVhdGVPcHRpb25zIHtcbiAgaW5mbzogV29ya2Zsb3dJbmZvO1xuICByYW5kb21uZXNzU2VlZDogbnVtYmVyW107XG4gIG5vdzogbnVtYmVyO1xuICBzaG93U3RhY2tUcmFjZVNvdXJjZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwgZXh0ZW5kcyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBzb3VyY2VNYXA6IFJhd1NvdXJjZU1hcDtcbiAgcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXM6IFNldDxzdHJpbmc+O1xuICBnZXRUaW1lT2ZEYXkoKTogYmlnaW50O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24sIFNpZ25hbERlZmluaXRpb24gb3IgUXVlcnlEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBIYW5kbGVyPFxuICBSZXQsXG4gIEFyZ3MgZXh0ZW5kcyBhbnlbXSxcbiAgVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248UmV0LCBBcmdzPiB8IFNpZ25hbERlZmluaXRpb248QXJncz4gfCBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzPixcbj4gPSBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxpbmZlciBSLCBpbmZlciBBPlxuICA/ICguLi5hcmdzOiBBKSA9PiBSIHwgUHJvbWlzZTxSPlxuICA6IFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPGluZmVyIEE+XG4gICAgPyAoLi4uYXJnczogQSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cbiAgICA6IFQgZXh0ZW5kcyBRdWVyeURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgIDogbmV2ZXI7XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBzaWduYWwgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHNpZ25hbCBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNpZ25hbEhhbmRsZXIgPSAoc2lnbmFsTmFtZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEEgdmFsaWRhdGlvbiBmdW5jdGlvbiBjYXBhYmxlIG9mIGFjY2VwdGluZyB0aGUgYXJndW1lbnRzIGZvciBhIGdpdmVuIFVwZGF0ZURlZmluaXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZVZhbGlkYXRvcjxBcmdzIGV4dGVuZHMgYW55W10+ID0gKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQ7XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHF1ZXJ5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5SGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cbi8qKlxuICogQSBkZXNjcmlwdGlvbiBvZiBhIHNpZ25hbCBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBTaWduYWxIYW5kbGVyT3B0aW9ucyA9IHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeSB9O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGFuZCBkZXNjcmlwdGlvbiBvZiBhbiB1cGRhdGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgVXBkYXRlSGFuZGxlck9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdPiA9IHtcbiAgdmFsaWRhdG9yPzogVXBkYXRlVmFsaWRhdG9yPEFyZ3M+O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdW5maW5pc2hlZFBvbGljeT86IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXTtcbiAgdXNlZEludGVybmFsRmxhZ3M6IG51bWJlcltdO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB7XG4gIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBGYWlsdXJlQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBhcnJheUZyb21QYXlsb2FkcyxcbiAgZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGVuc3VyZVRlbXBvcmFsRmFpbHVyZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIElsbGVnYWxTdGF0ZUVycm9yLFxuICBUZW1wb3JhbEZhaWx1cmUsXG4gIFdvcmtmbG93LFxuICBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IsXG4gIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSxcbiAgUHJvdG9GYWlsdXJlLFxuICBBcHBsaWNhdGlvbkZhaWx1cmUsXG4gIFdvcmtmbG93VXBkYXRlVHlwZSxcbiAgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlLFxuICBtYXBGcm9tUGF5bG9hZHMsXG4gIHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG4gIGZyb21QYXlsb2Fkc0F0SW5kZXgsXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB0eXBlIHsgY29yZXNkaywgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBhbGVhLCBSTkcgfSBmcm9tICcuL2FsZWEnO1xuaW1wb3J0IHsgUm9vdENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgVXBkYXRlU2NvcGUgfSBmcm9tICcuL3VwZGF0ZS1zY29wZSc7XG5pbXBvcnQgeyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yLCBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmLCBpc0NhbmNlbGxhdGlvbiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFF1ZXJ5SW5wdXQsIFNpZ25hbElucHV0LCBVcGRhdGVJbnB1dCwgV29ya2Zsb3dFeGVjdXRlSW5wdXQsIFdvcmtmbG93SW50ZXJjZXB0b3JzIH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHtcbiAgQ29udGludWVBc05ldyxcbiAgRGVmYXVsdFNpZ25hbEhhbmRsZXIsXG4gIFN0YWNrVHJhY2VTREtJbmZvLFxuICBTdGFja1RyYWNlRmlsZVNsaWNlLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFdvcmtmbG93SW5mbyxcbiAgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwsXG4gIEFjdGl2YXRpb25Db21wbGV0aW9uLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHlwZSBTaW5rQ2FsbCB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHBrZyBmcm9tICcuL3BrZyc7XG5pbXBvcnQgeyBTZGtGbGFnLCBhc3NlcnRWYWxpZEZsYWcgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZywgbG9nIH0gZnJvbSAnLi9sb2dzJztcblxuY29uc3QgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPSB7XG4gIFdPUktGTE9XX0FMUkVBRFlfRVhJU1RTOiAnV09SS0ZMT1dfQUxSRUFEWV9FWElTVFMnLFxufSBhcyBjb25zdDtcbnR5cGUgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UgPVxuICAodHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKVtrZXlvZiB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdO1xuXG5jb25zdCBbX2VuY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLCBkZWNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZV0gPVxuICBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLFxuICAgIHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICAnU1RBUlRfQ0hJTERfV09SS0ZMT1dfRVhFQ1VUSU9OX0ZBSUxFRF9DQVVTRV8nXG4gID4oXG4gICAge1xuICAgICAgW1N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlLldPUktGTE9XX0FMUkVBRFlfRVhJU1RTXTogMSxcbiAgICAgIFVOU1BFQ0lGSUVEOiAwLFxuICAgIH0gYXMgY29uc3QsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrIHtcbiAgZm9ybWF0dGVkOiBzdHJpbmc7XG4gIHN0cnVjdHVyZWQ6IFN0YWNrVHJhY2VGaWxlTG9jYXRpb25bXTtcbn1cblxuLyoqXG4gKiBHbG9iYWwgc3RvcmUgdG8gdHJhY2sgcHJvbWlzZSBzdGFja3MgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbWlzZVN0YWNrU3RvcmUge1xuICBjaGlsZFRvUGFyZW50OiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU2V0PFByb21pc2U8dW5rbm93bj4+PjtcbiAgcHJvbWlzZVRvU3RhY2s6IE1hcDxQcm9taXNlPHVua25vd24+LCBTdGFjaz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGlvbiB7XG4gIHJlc29sdmUodmFsOiB1bmtub3duKTogdW5rbm93bjtcblxuICByZWplY3QocmVhc29uOiB1bmtub3duKTogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb24ge1xuICBmbigpOiBib29sZWFuO1xuXG4gIHJlc29sdmUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aXZhdGlvbkhhbmRsZXJGdW5jdGlvbjxLIGV4dGVuZHMga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2I+ID0gKFxuICBhY3RpdmF0aW9uOiBOb25OdWxsYWJsZTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYltLXT5cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBWZXJpZmllcyBhbGwgYWN0aXZhdGlvbiBqb2IgaGFuZGxpbmcgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWRcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZhdGlvbkhhbmRsZXIgPSB7XG4gIFtQIGluIGtleW9mIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iXTogQWN0aXZhdGlvbkhhbmRsZXJGdW5jdGlvbjxQPjtcbn07XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbi5cbiAqL1xuaW50ZXJmYWNlIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgaWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogS2VlcHMgYWxsIG9mIHRoZSBXb3JrZmxvdyBydW50aW1lIHN0YXRlIGxpa2UgcGVuZGluZyBjb21wbGV0aW9ucyBmb3IgYWN0aXZpdGllcyBhbmQgdGltZXJzLlxuICpcbiAqIEltcGxlbWVudHMgaGFuZGxlcnMgZm9yIGFsbCB3b3JrZmxvdyBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90ZSB0aGF0IG1vc3QgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBtZWFudCB0byBiZSBjYWxsZWQgb25seSBmcm9tIHdpdGhpbiB0aGUgVk0uXG4gKlxuICogSG93ZXZlciwgYSBmZXcgbWV0aG9kcyBtYXkgYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gb3V0c2lkZSB0aGUgVk0gKGVzc2VudGlhbGx5IGZyb20gYHZtLXNoYXJlZC50c2ApLlxuICogVGhlc2UgbWV0aG9kcyBhcmUgc3BlY2lmaWNhbGx5IG1hcmtlZCB3aXRoIGEgY29tbWVudCBhbmQgcmVxdWlyZSBjYXJlZnVsIGNvbnNpZGVyYXRpb24sIGFzIHRoZVxuICogZXhlY3V0aW9uIGNvbnRleHQgbWF5IG5vdCBwcm9wZXJseSByZWZsZWN0IHRoYXQgb2YgdGhlIHRhcmdldCB3b3JrZmxvdyBleGVjdXRpb24gKGUuZy46IHdpdGggUmV1c2FibGVcbiAqIFZNcywgdGhlIGBnbG9iYWxgIG1heSBub3QgaGF2ZSBiZWVuIHN3YXBwZWQgdG8gdGhvc2Ugb2YgdGhhdCB3b3JrZmxvdyBleGVjdXRpb247IHRoZSBhY3RpdmUgbWljcm90YXNrXG4gKiBxdWV1ZSBtYXkgYmUgdGhhdCBvZiB0aGUgdGhyZWFkL3Byb2Nlc3MsIHJhdGhlciB0aGFuIHRoZSBxdWV1ZSBvZiB0aGF0IFZNIGNvbnRleHQ7IGV0YykuIENvbnNlcXVlbnRseSxcbiAqIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIGZyb20gb3V0c2lkZSBvZiB0aGUgVk0gbXVzdCBub3QgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogLSBBY2Nlc3MgYW55IGdsb2JhbCB2YXJpYWJsZTtcbiAqIC0gQ3JlYXRlIFByb21pc2Ugb2JqZWN0cywgdXNlIGFzeW5jL2F3YWl0LCBvciBvdGhlcndpc2Ugc2NoZWR1bGUgbWljcm90YXNrcztcbiAqIC0gQ2FsbCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLCBpbmNsdWRpbmcgYW55IGZvcm0gb2YgaW50ZXJjZXB0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBBY3RpdmF0aW9uSGFuZGxlciB7XG4gIC8qKlxuICAgKiBDYWNoZSBmb3IgbW9kdWxlcyAtIHJlZmVyZW5jZWQgaW4gcmV1c2FibGUtdm0udHNcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gIC8qKlxuICAgKiBNYXAgb2YgdGFzayBzZXF1ZW5jZSB0byBhIENvbXBsZXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBsZXRpb25zID0ge1xuICAgIHRpbWVyOiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbj4oKSxcbiAgICBhY3Rpdml0eTogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb24+KCksXG4gICAgY2hpbGRXb3JrZmxvd1N0YXJ0OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbj4oKSxcbiAgICBjaGlsZFdvcmtmbG93Q29tcGxldGU6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPigpLFxuICAgIHNpZ25hbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbj4oKSxcbiAgICBjYW5jZWxXb3JrZmxvdzogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb24+KCksXG4gIH07XG5cbiAgLyoqXG4gICAqIEhvbGRzIGJ1ZmZlcmVkIFVwZGF0ZSBjYWxscyB1bnRpbCBhIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyZWRVcGRhdGVzID0gQXJyYXk8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZT4oKTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgc2lnbmFsIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFNpZ25hbHMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVNpZ25hbFdvcmtmbG93PigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHVwZGF0ZSBuYW1lIHRvIGhhbmRsZXIgYW5kIHZhbGlkYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHNpZ25hbCBuYW1lIHRvIGhhbmRsZXJcbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93U2lnbmFsQW5ub3RhdGVkVHlwZT4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyB1cGRhdGVzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1VwZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgaW4tcHJvZ3Jlc3Mgc2lnbmFscyB0byBoYW5kbGVyIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluUHJvZ3Jlc3NTaWduYWxzID0gbmV3IE1hcDxudW1iZXIsIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBBIHNlcXVlbmNlIG51bWJlciBwcm92aWRpbmcgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNpZ25hbEhhbmRsZXJFeGVjdXRpb25TZXEgPSAwO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFNpZ25hbEhhbmRsZXI/OiBEZWZhdWx0U2lnbmFsSGFuZGxlcjtcblxuICAvKipcbiAgICogU291cmNlIG1hcCBmaWxlIGZvciBsb29raW5nIHVwIHRoZSBzb3VyY2UgZmlsZXMgaW4gcmVzcG9uc2UgdG8gX19lbmhhbmNlZF9zdGFja190cmFjZVxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzZW5kIHRoZSBzb3VyY2VzIGluIGVuaGFuY2VkIHN0YWNrIHRyYWNlIHF1ZXJ5IHJlc3BvbnNlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTdGFja1RyYWNlU291cmNlcztcblxuICByZWFkb25seSBwcm9taXNlU3RhY2tTdG9yZTogUHJvbWlzZVN0YWNrU3RvcmUgPSB7XG4gICAgcHJvbWlzZVRvU3RhY2s6IG5ldyBNYXAoKSxcbiAgICBjaGlsZFRvUGFyZW50OiBuZXcgTWFwKCksXG4gIH07XG5cbiAgcHVibGljIHJlYWRvbmx5IHJvb3RTY29wZSA9IG5ldyBSb290Q2FuY2VsbGF0aW9uU2NvcGUoKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBxdWVyeSBuYW1lIHRvIGhhbmRsZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBxdWVyeUhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlPihbXG4gICAgW1xuICAgICAgJ19fc3RhY2tfdHJhY2UnLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tUcmFjZXMoKVxuICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mb3JtYXR0ZWQpXG4gICAgICAgICAgICAuam9pbignXFxuXFxuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHNlbnNpYmxlIHN0YWNrIHRyYWNlLicsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgJ19fZW5oYW5jZWRfc3RhY2tfdHJhY2UnLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKTogRW5oYW5jZWRTdGFja1RyYWNlID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNvdXJjZU1hcCB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBzZGs6IFN0YWNrVHJhY2VTREtJbmZvID0geyBuYW1lOiAndHlwZXNjcmlwdCcsIHZlcnNpb246IHBrZy52ZXJzaW9uIH07XG4gICAgICAgICAgY29uc3Qgc3RhY2tzID0gdGhpcy5nZXRTdGFja1RyYWNlcygpLm1hcCgoeyBzdHJ1Y3R1cmVkOiBsb2NhdGlvbnMgfSkgPT4gKHsgbG9jYXRpb25zIH0pKTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+ID0ge307XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1N0YWNrVHJhY2VTb3VyY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgbG9jYXRpb25zIH0gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgeyBmaWxlX3BhdGggfSBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfcGF0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHNvdXJjZU1hcD8uc291cmNlc0NvbnRlbnQ/Lltzb3VyY2VNYXA/LnNvdXJjZXMuaW5kZXhPZihmaWxlX3BhdGgpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXNbZmlsZV9wYXRoXSA9IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgc2RrLCBzdGFja3MsIHNvdXJjZXMgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdSZXR1cm5zIGEgc3RhY2sgdHJhY2UgYW5ub3RhdGVkIHdpdGggc291cmNlIGluZm9ybWF0aW9uLicsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgJ19fdGVtcG9yYWxfd29ya2Zsb3dfbWV0YWRhdGEnLFxuICAgICAge1xuICAgICAgICBoYW5kbGVyOiAoKTogdGVtcG9yYWwuYXBpLnNkay52MS5JV29ya2Zsb3dNZXRhZGF0YSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dUeXBlID0gdGhpcy5pbmZvLndvcmtmbG93VHlwZTtcbiAgICAgICAgICBjb25zdCBxdWVyeURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5SGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBjb25zdCBzaWduYWxEZWZpbml0aW9ucyA9IEFycmF5LmZyb20odGhpcy5zaWduYWxIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZURlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnVwZGF0ZUhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgdHlwZTogd29ya2Zsb3dUeXBlLFxuICAgICAgICAgICAgICBxdWVyeURlZmluaXRpb25zLFxuICAgICAgICAgICAgICBzaWduYWxEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgdXBkYXRlRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3b3JrZmxvdy4nLFxuICAgICAgfSxcbiAgICBdLFxuICBdKTtcblxuICAvKipcbiAgICogTG9hZGVkIGluIHtAbGluayBpbml0UnVudGltZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnM6IFJlcXVpcmVkPFdvcmtmbG93SW50ZXJjZXB0b3JzPiA9IHtcbiAgICBpbmJvdW5kOiBbXSxcbiAgICBvdXRib3VuZDogW10sXG4gICAgaW50ZXJuYWxzOiBbXSxcbiAgfTtcblxuICAvKipcbiAgICogQnVmZmVyIHRoYXQgc3RvcmVzIGFsbCBnZW5lcmF0ZWQgY29tbWFuZHMsIHJlc2V0IGFmdGVyIGVhY2ggYWN0aXZhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgYWxsIHtAbGluayBjb25kaXRpb259cyB0aGF0IGhhdmVuJ3QgYmVlbiB1bmJsb2NrZWQgeWV0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tlZENvbmRpdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgQ29uZGl0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIFdvcmtmbG93IGNvbXBsZXRlZD9cbiAgICpcbiAgICogQSBXb3JrZmxvdyB3aWxsIGJlIGNvbnNpZGVyZWQgY29tcGxldGVkIGlmIGl0IGdlbmVyYXRlcyBhIGNvbW1hbmQgdGhhdCB0aGVcbiAgICogc3lzdGVtIGNvbnNpZGVycyBhcyBhIGZpbmFsIFdvcmtmbG93IGNvbW1hbmQgKGUuZy5cbiAgICogY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbiBvciBmYWlsV29ya2Zsb3dFeGVjdXRpb24pLlxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXYXMgdGhpcyBXb3JrZmxvdyBjYW5jZWxsZWQ/XG4gICAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXh0IChpbmNyZW1lbnRhbCkgc2VxdWVuY2UgdG8gYXNzaWduIHdoZW4gZ2VuZXJhdGluZyBjb21wbGV0YWJsZSBjb21tYW5kc1xuICAgKi9cbiAgcHVibGljIG5leHRTZXFzID0ge1xuICAgIHRpbWVyOiAxLFxuICAgIGFjdGl2aXR5OiAxLFxuICAgIGNoaWxkV29ya2Zsb3c6IDEsXG4gICAgc2lnbmFsV29ya2Zsb3c6IDEsXG4gICAgY2FuY2VsV29ya2Zsb3c6IDEsXG4gICAgY29uZGl0aW9uOiAxLFxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSB0byBrZWVwIHRyYWNrIG9mIGFjdGl2ZSBzdGFjayB0cmFjZXNcbiAgICBzdGFjazogMSxcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyBzZXQgZXZlcnkgdGltZSB0aGUgd29ya2Zsb3cgZXhlY3V0ZXMgYW4gYWN0aXZhdGlvblxuICAgKiBNYXkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBub3c6IG51bWJlcjtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFdvcmtmbG93LCBpbml0aWFsaXplZCB3aGVuIGEgV29ya2Zsb3cgaXMgc3RhcnRlZFxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93PzogV29ya2Zsb3c7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqIE1heSBiZSBhY2Nlc3NlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGluZm86IFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogQSBkZXRlcm1pbmlzdGljIFJORywgdXNlZCBieSB0aGUgaXNvbGF0ZSdzIG92ZXJyaWRkZW4gTWF0aC5yYW5kb21cbiAgICovXG4gIHB1YmxpYyByYW5kb206IFJORztcblxuICBwdWJsaWMgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciA9IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyO1xuICBwdWJsaWMgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIGtub3cgdGhlIHN0YXR1cyBvZiBmb3IgdGhpcyB3b3JrZmxvdywgYXMgaW4ge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duUHJlc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBzZW50IHRvIGNvcmUge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93bkZsYWdzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqXG4gICAqIEJ1ZmZlcmVkIHNpbmsgY2FsbHMgcGVyIGFjdGl2YXRpb25cbiAgICovXG4gIHNpbmtDYWxscyA9IEFycmF5PFNpbmtDYWxsPigpO1xuXG4gIC8qKlxuICAgKiBBIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lIGZ1bmN0aW9uLCBleHRlcm5hbGx5IGluamVjdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2V0VGltZU9mRGF5OiAoKSA9PiBiaWdpbnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW5mbyxcbiAgICBub3csXG4gICAgc2hvd1N0YWNrVHJhY2VTb3VyY2VzLFxuICAgIHNvdXJjZU1hcCxcbiAgICBnZXRUaW1lT2ZEYXksXG4gICAgcmFuZG9tbmVzc1NlZWQsXG4gICAgcmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMsXG4gIH06IFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsKSB7XG4gICAgdGhpcy5nZXRUaW1lT2ZEYXkgPSBnZXRUaW1lT2ZEYXk7XG4gICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB0aGlzLm5vdyA9IG5vdztcbiAgICB0aGlzLnNob3dTdGFja1RyYWNlU291cmNlcyA9IHNob3dTdGFja1RyYWNlU291cmNlcztcbiAgICB0aGlzLnNvdXJjZU1hcCA9IHNvdXJjZU1hcDtcbiAgICB0aGlzLnJhbmRvbSA9IGFsZWEocmFuZG9tbmVzc1NlZWQpO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFjdGl2aXR5TmFtZXMgPSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgbXV0YXRlV29ya2Zsb3dJbmZvKGZuOiAoaW5mbzogV29ya2Zsb3dJbmZvKSA9PiBXb3JrZmxvd0luZm8pOiB2b2lkIHtcbiAgICB0aGlzLmluZm8gPSBmbih0aGlzLmluZm8pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFN0YWNrVHJhY2VzKCk6IFN0YWNrW10ge1xuICAgIGNvbnN0IHsgY2hpbGRUb1BhcmVudCwgcHJvbWlzZVRvU3RhY2sgfSA9IHRoaXMucHJvbWlzZVN0YWNrU3RvcmU7XG4gICAgY29uc3QgaW50ZXJuYWxOb2RlcyA9IFsuLi5jaGlsZFRvUGFyZW50LnZhbHVlcygpXS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGN1cnIpIHtcbiAgICAgICAgYWNjLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IFNldCgpKTtcbiAgICBjb25zdCBzdGFja3MgPSBuZXcgTWFwPHN0cmluZywgU3RhY2s+KCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFRvUGFyZW50LmtleXMoKSkge1xuICAgICAgaWYgKCFpbnRlcm5hbE5vZGVzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwcm9taXNlVG9TdGFjay5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5mb3JtYXR0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBzdGFja3Muc2V0KHN0YWNrLmZvcm1hdHRlZCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3QgMTAwJSBzdXJlIHdoZXJlIHRoaXMgY29tZXMgZnJvbSwganVzdCBmaWx0ZXIgaXQgb3V0XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pJyk7XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pXFxuJyk7XG4gICAgcmV0dXJuIFsuLi5zdGFja3NdLm1hcCgoW18sIHN0YWNrXSkgPT4gc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBnZXRBbmRSZXNldFNpbmtDYWxscygpOiBTaW5rQ2FsbFtdIHtcbiAgICBjb25zdCB7IHNpbmtDYWxscyB9ID0gdGhpcztcbiAgICB0aGlzLnNpbmtDYWxscyA9IFtdO1xuICAgIHJldHVybiBzaW5rQ2FsbHM7XG4gIH1cblxuICAvKipcbiAgICogQnVmZmVyIGEgV29ya2Zsb3cgY29tbWFuZCB0byBiZSBjb2xsZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBQcmV2ZW50cyBjb21tYW5kcyBmcm9tIGJlaW5nIGFkZGVkIGFmdGVyIFdvcmtmbG93IGNvbXBsZXRpb24uXG4gICAqL1xuICBwdXNoQ29tbWFuZChjbWQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZCwgY29tcGxldGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChjbWQpO1xuICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKSxcbiAgICAgIHVzZWRJbnRlcm5hbEZsYWdzOiBbLi4udGhpcy5rbm93bkZsYWdzXSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0V29ya2Zsb3dOZXh0SGFuZGxlcih7IGFyZ3MgfTogV29ya2Zsb3dFeGVjdXRlSW5wdXQpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgd29ya2Zsb3cgfSA9IHRoaXM7XG4gICAgaWYgKHdvcmtmbG93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgdW5pbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgd29ya2Zsb3coLi4uYXJncyk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnRXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQsICdleGVjdXRlJywgdGhpcy5zdGFydFdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cbiAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgIGV4ZWN1dGVXaXRoTGlmZWN5Y2xlTG9nZ2luZygoKSA9PlxuICAgICAgICBleGVjdXRlKHtcbiAgICAgICAgICBoZWFkZXJzOiBhY3RpdmF0aW9uLmhlYWRlcnMgPz8ge30sXG4gICAgICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmFyZ3VtZW50cyksXG4gICAgICAgIH0pXG4gICAgICApLnRoZW4odGhpcy5jb21wbGV0ZVdvcmtmbG93LmJpbmQodGhpcyksIHRoaXMuaGFuZGxlV29ya2Zsb3dGYWlsdXJlLmJpbmQodGhpcykpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRpbnVlZEZhaWx1cmUsIGxhc3RDb21wbGV0aW9uUmVzdWx0LCBtZW1vLCBzZWFyY2hBdHRyaWJ1dGVzIH0gPSBhY3RpdmF0aW9uO1xuXG4gICAgLy8gTW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpbml0aWFsaXphdGlvbiBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgIHRoaXMubXV0YXRlV29ya2Zsb3dJbmZvKChpbmZvKSA9PiAoe1xuICAgICAgLi4uaW5mbyxcbiAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6XG4gICAgICAgIChtYXBGcm9tUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcz8uaW5kZXhlZEZpZWxkcykgYXMgU2VhcmNoQXR0cmlidXRlcykgPz8ge30sXG4gICAgICBtZW1vOiBtYXBGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBtZW1vPy5maWVsZHMpLFxuICAgICAgbGFzdFJlc3VsdDogZnJvbVBheWxvYWRzQXRJbmRleCh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIDAsIGxhc3RDb21wbGV0aW9uUmVzdWx0Py5wYXlsb2FkcyksXG4gICAgICBsYXN0RmFpbHVyZTpcbiAgICAgICAgY29udGludWVkRmFpbHVyZSAhPSBudWxsXG4gICAgICAgICAgPyB0aGlzLmZhaWx1cmVDb252ZXJ0ZXIuZmFpbHVyZVRvRXJyb3IoY29udGludWVkRmFpbHVyZSwgdGhpcy5wYXlsb2FkQ29udmVydGVyKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWxXb3JrZmxvdyhfYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklDYW5jZWxXb3JrZmxvdyk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJvb3RTY29wZS5jYW5jZWwoKTtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlVGltZXIoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklGaXJlVGltZXIpOiB2b2lkIHtcbiAgICAvLyBUaW1lcnMgYXJlIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZWlyIGNvbXBsZXRpb24gbWlnaHQgbm90IGJlIGluIFdvcmtmbG93IHN0YXRlLFxuICAgIC8vIHRoaXMgaXMgZHVlIHRvIGltbWVkaWF0ZSB0aW1lciBjYW5jZWxsYXRpb24gdGhhdCBkb2Vzbid0IGdvIHdhaXQgZm9yIENvcmUuXG4gICAgY29uc3QgY29tcGxldGlvbiA9IHRoaXMubWF5YmVDb25zdW1lQ29tcGxldGlvbigndGltZXInLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGNvbXBsZXRpb24/LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlQWN0aXZpdHkoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQWN0aXZpdHkpOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUFjdGl2aXR5IGFjdGl2YXRpb24gd2l0aCBubyByZXN1bHQnKTtcbiAgICB9XG4gICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QgfSA9IHRoaXMuY29uc3VtZUNvbXBsZXRpb24oJ2FjdGl2aXR5JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGNvbnN0IGVyciA9IGZhaWx1cmUgPyB0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUpIDogdW5kZWZpbmVkO1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkO1xuICAgICAgY29uc3QgZXJyID0gZmFpbHVyZSA/IHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSkgOiB1bmRlZmluZWQ7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2YXRpb24ucmVzdWx0LmJhY2tvZmYpIHtcbiAgICAgIHJlamVjdChuZXcgTG9jYWxBY3Rpdml0eURvQmFja29mZihhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQoXG4gICAgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCdjaGlsZFdvcmtmbG93U3RhcnQnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnN1Y2NlZWRlZCkge1xuICAgICAgcmVzb2x2ZShhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgaWYgKGRlY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKGFjdGl2YXRpb24uZmFpbGVkLmNhdXNlKSAhPT0gJ1dPUktGTE9XX0FMUkVBRFlfRVhJU1RTJykge1xuICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ0dvdCB1bmtub3duIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIShhY3RpdmF0aW9uLnNlcSAmJiBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd0lkICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93VHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhdHRyaWJ1dGVzIGluIGFjdGl2YXRpb24gam9iJyk7XG4gICAgICB9XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IoXG4gICAgICAgICAgJ1dvcmtmbG93IGV4ZWN1dGlvbiBhbHJlYWR5IHN0YXJ0ZWQnLFxuICAgICAgICAgIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLmNhbmNlbGxlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBubyBmYWlsdXJlIGluIGNhbmNlbGxlZCB2YXJpYW50Jyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gc3RhdHVzJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24gYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd0NvbXBsZXRlJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09PSB1bmRlZmluZWQgfHwgZmFpbHVyZSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT09IHVuZGVmaW5lZCB8fCBmYWlsdXJlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBjYW5jZWxsZWQgcmVzdWx0IHdpdGggbm8gZmFpbHVyZSBhdHRyaWJ1dGUnKTtcbiAgICAgIH1cbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUpKTtcbiAgICB9XG4gIH1cblxuICAvLyBJbnRlbnRpb25hbGx5IG5vbi1hc3luYyBmdW5jdGlvbiBzbyB0aGlzIGhhbmRsZXIgZG9lc24ndCBzaG93IHVwIGluIHRoZSBzdGFjayB0cmFjZVxuICBwcm90ZWN0ZWQgcXVlcnlXb3JrZmxvd05leHRIYW5kbGVyKHsgcXVlcnlOYW1lLCBhcmdzIH06IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucXVlcnlIYW5kbGVycy5nZXQocXVlcnlOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qga25vd25RdWVyeVR5cGVzID0gWy4uLnRoaXMucXVlcnlIYW5kbGVycy5rZXlzKCldLmpvaW4oJyAnKTtcbiAgICAgIC8vIEZhaWwgdGhlIHF1ZXJ5XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICBgV29ya2Zsb3cgZGlkIG5vdCByZWdpc3RlciBhIGhhbmRsZXIgZm9yICR7cXVlcnlOYW1lfS4gUmVnaXN0ZXJlZCBxdWVyaWVzOiBbJHtrbm93blF1ZXJ5VHlwZXN9XWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdRdWVyeSBoYW5kbGVycyBzaG91bGQgbm90IHJldHVybiBhIFByb21pc2UnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVlcnlXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVF1ZXJ5V29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgcXVlcnlJZCwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIShxdWVyeVR5cGUgJiYgcXVlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcXVlcnkgYWN0aXZhdGlvbiBhdHRyaWJ1dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLFxuICAgICAgJ2hhbmRsZVF1ZXJ5JyxcbiAgICAgIHRoaXMucXVlcnlXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcylcbiAgICApO1xuICAgIGV4ZWN1dGUoe1xuICAgICAgcXVlcnlOYW1lOiBxdWVyeVR5cGUsXG4gICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uYXJndW1lbnRzKSxcbiAgICAgIHF1ZXJ5SWQsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgIH0pLnRoZW4oXG4gICAgICAocmVzdWx0KSA9PiB0aGlzLmNvbXBsZXRlUXVlcnkocXVlcnlJZCwgcmVzdWx0KSxcbiAgICAgIChyZWFzb24pID0+IHRoaXMuZmFpbFF1ZXJ5KHF1ZXJ5SWQsIHJlYXNvbilcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRvVXBkYXRlKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JRG9VcGRhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB7IGlkOiB1cGRhdGVJZCwgcHJvdG9jb2xJbnN0YW5jZUlkLCBuYW1lLCBoZWFkZXJzLCBydW5WYWxpZGF0b3IgfSA9IGFjdGl2YXRpb247XG4gICAgaWYgKCF1cGRhdGVJZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBpZCcpO1xuICAgIH1cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiB1cGRhdGUgbmFtZScpO1xuICAgIH1cbiAgICBpZiAoIXByb3RvY29sSW5zdGFuY2VJZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBwcm90b2NvbEluc3RhbmNlSWQnKTtcbiAgICB9XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnVwZGF0ZUhhbmRsZXJzLmdldChuYW1lKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1ha2VJbnB1dCA9ICgpOiBVcGRhdGVJbnB1dCA9PiAoe1xuICAgICAgdXBkYXRlSWQsXG4gICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQpLFxuICAgICAgbmFtZSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgaXMgcmVzcG9uc2libGUgZm9yIHVwaG9sZGluZywgYW5kIGNvbnN0cmFpbmVkXG4gICAgLy8gYnksIHRoZSBmb2xsb3dpbmcgY29udHJhY3Q6XG4gICAgLy9cbiAgICAvLyAxLiBJZiBubyB2YWxpZGF0b3IgaXMgcHJlc2VudCB0aGVuIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzIHdpbGwgbm90IGJlIHJ1bi5cbiAgICAvL1xuICAgIC8vIDIuIER1cmluZyB2YWxpZGF0aW9uLCBhbnkgZXJyb3IgbXVzdCBmYWlsIHRoZSBVcGRhdGU7IGR1cmluZyB0aGUgVXBkYXRlXG4gICAgLy8gICAgaXRzZWxmLCBUZW1wb3JhbCBlcnJvcnMgZmFpbCB0aGUgVXBkYXRlIHdoZXJlYXMgb3RoZXIgZXJyb3JzIGZhaWwgdGhlXG4gICAgLy8gICAgYWN0aXZhdGlvbi5cbiAgICAvL1xuICAgIC8vIDMuIFRoZSBoYW5kbGVyIG11c3Qgbm90IHNlZSBhbnkgbXV0YXRpb25zIG9mIHRoZSBhcmd1bWVudHMgbWFkZSBieSB0aGVcbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA0LiBBbnkgZXJyb3Igd2hlbiBkZWNvZGluZy9kZXNlcmlhbGl6aW5nIGlucHV0IG11c3QgYmUgY2F1Z2h0IGFuZCByZXN1bHRcbiAgICAvLyAgICBpbiByZWplY3Rpb24gb2YgdGhlIFVwZGF0ZSBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQsIGV2ZW4gaWYgdGhlcmUgaXMgbm9cbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA1LiBUaGUgaW5pdGlhbCBzeW5jaHJvbm91cyBwb3J0aW9uIG9mIHRoZSAoYXN5bmMpIFVwZGF0ZSBoYW5kbGVyIHNob3VsZFxuICAgIC8vICAgIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSAoc3luYykgdmFsaWRhdG9yIGNvbXBsZXRlcyBzdWNoIHRoYXQgdGhlcmUgaXNcbiAgICAvLyAgICBtaW5pbWFsIG9wcG9ydHVuaXR5IGZvciBhIGRpZmZlcmVudCBjb25jdXJyZW50IHRhc2sgdG8gYmUgc2NoZWR1bGVkXG4gICAgLy8gICAgYmV0d2VlbiB0aGVtLlxuICAgIC8vXG4gICAgLy8gNi4gVGhlIHN0YWNrIHRyYWNlIHZpZXcgcHJvdmlkZWQgaW4gdGhlIFRlbXBvcmFsIFVJIG11c3Qgbm90IGJlIHBvbGx1dGVkXG4gICAgLy8gICAgYnkgcHJvbWlzZXMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gdXNlciBjb2RlLiBUaGlzIGltcGxpZXMgdGhhdFxuICAgIC8vICAgIGFzeW5jL2F3YWl0IHN5bnRheCBtYXkgbm90IGJlIHVzZWQuXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBkZWxpYmVyYXRlbHkgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGJlbG93LlxuICAgIC8vIFRoZXNlIGFyZSBjYXVnaHQgZWxzZXdoZXJlIGFuZCBmYWlsIHRoZSBjb3JyZXNwb25kaW5nIGFjdGl2YXRpb24uXG4gICAgY29uc3QgZG9VcGRhdGVJbXBsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGlucHV0OiBVcGRhdGVJbnB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChydW5WYWxpZGF0b3IgJiYgZW50cnkudmFsaWRhdG9yKSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZCxcbiAgICAgICAgICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlVXBkYXRlTmV4dEhhbmRsZXIuYmluZCh0aGlzLCBlbnRyeS52YWxpZGF0b3IpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB2YWxpZGF0ZShtYWtlSW5wdXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBtYWtlSW5wdXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFjY2VwdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQpO1xuICAgICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQsXG4gICAgICAgICdoYW5kbGVVcGRhdGUnLFxuICAgICAgICB0aGlzLnVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkuaGFuZGxlcilcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHVuZmluaXNoZWRQb2xpY3kgfSA9IGVudHJ5O1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5zZXQodXBkYXRlSWQsIHsgbmFtZSwgdW5maW5pc2hlZFBvbGljeSwgaWQ6IHVwZGF0ZUlkIH0pO1xuICAgICAgY29uc3QgcmVzID0gZXhlY3V0ZShpbnB1dClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIHJlc3VsdCkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMuZGVsZXRlKHVwZGF0ZUlkKSk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShyZXMpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIHVudHJhY2tQcm9taXNlKFVwZGF0ZVNjb3BlLnVwZGF0ZVdpdGhJbmZvKHVwZGF0ZUlkLCBuYW1lLCBkb1VwZGF0ZUltcGwpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyB1cGRhdGVOZXh0SGFuZGxlcihoYW5kbGVyOiBXb3JrZmxvd1VwZGF0ZVR5cGUsIHsgYXJncyB9OiBVcGRhdGVJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVXBkYXRlTmV4dEhhbmRsZXIodmFsaWRhdG9yOiBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUgfCB1bmRlZmluZWQsIHsgYXJncyB9OiBVcGRhdGVJbnB1dCk6IHZvaWQge1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIHZhbGlkYXRvciguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGlzcGF0Y2hCdWZmZXJlZFVwZGF0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgYnVmZmVyZWRVcGRhdGVzID0gdGhpcy5idWZmZXJlZFVwZGF0ZXM7XG4gICAgd2hpbGUgKGJ1ZmZlcmVkVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFVwZGF0ZXMuZmluZEluZGV4KCh1cGRhdGUpID0+IHRoaXMudXBkYXRlSGFuZGxlcnMuaGFzKHVwZGF0ZS5uYW1lIGFzIHN0cmluZykpO1xuICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSB7XG4gICAgICAgIC8vIE5vIGJ1ZmZlcmVkIFVwZGF0ZXMgaGF2ZSBhIGhhbmRsZXIgeWV0LlxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnN0IFt1cGRhdGVdID0gYnVmZmVyZWRVcGRhdGVzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcbiAgICAgIHRoaXMuZG9VcGRhdGUodXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzLnNoaWZ0KCk7XG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKFxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb24gKi9cbiAgICAgICAgICB1cGRhdGUucHJvdG9jb2xJbnN0YW5jZUlkISxcbiAgICAgICAgICBBcHBsaWNhdGlvbkZhaWx1cmUubm9uUmV0cnlhYmxlKGBObyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIHVwZGF0ZTogJHt1cGRhdGUubmFtZX1gKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduYWxXb3JrZmxvd05leHRIYW5kbGVyKHsgc2lnbmFsTmFtZSwgYXJncyB9OiBTaWduYWxJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5zaWduYWxIYW5kbGVycy5nZXQoc2lnbmFsTmFtZSk/LmhhbmRsZXI7XG4gICAgaWYgKGZuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcihzaWduYWxOYW1lLCAuLi5hcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyByZWdpc3RlcmVkIHNpZ25hbCBoYW5kbGVyIGZvciBzaWduYWw6ICR7c2lnbmFsTmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2lnbmFsV29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklTaWduYWxXb3JrZmxvdyk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2lnbmFsTmFtZSwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXNpZ25hbE5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZhdGlvbiBzaWduYWxOYW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWxOYW1lKSAmJiAhdGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgdGhpcy5idWZmZXJlZFNpZ25hbHMucHVzaChhY3RpdmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgc2lnbmFsIGhhbmRsZXIgdGhlbiB0aGUgdW5maW5pc2hlZFxuICAgIC8vIHBvbGljeSBpcyBXQVJOX0FORF9BQkFORE9OOyB1c2VycyBjdXJyZW50bHkgaGF2ZSBubyB3YXkgdG8gc2lsZW5jZSBhbnlcbiAgICAvLyBlbnN1aW5nIHdhcm5pbmdzLlxuICAgIGNvbnN0IHVuZmluaXNoZWRQb2xpY3kgPVxuICAgICAgdGhpcy5zaWduYWxIYW5kbGVycy5nZXQoc2lnbmFsTmFtZSk/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcblxuICAgIGNvbnN0IHNpZ25hbEV4ZWN1dGlvbk51bSA9IHRoaXMuc2lnbmFsSGFuZGxlckV4ZWN1dGlvblNlcSsrO1xuICAgIHRoaXMuaW5Qcm9ncmVzc1NpZ25hbHMuc2V0KHNpZ25hbEV4ZWN1dGlvbk51bSwgeyBuYW1lOiBzaWduYWxOYW1lLCB1bmZpbmlzaGVkUG9saWN5IH0pO1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZCxcbiAgICAgICdoYW5kbGVTaWduYWwnLFxuICAgICAgdGhpcy5zaWduYWxXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcylcbiAgICApO1xuICAgIGV4ZWN1dGUoe1xuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmlucHV0KSxcbiAgICAgIHNpZ25hbE5hbWUsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuaW5Qcm9ncmVzc1NpZ25hbHMuZGVsZXRlKHNpZ25hbEV4ZWN1dGlvbk51bSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkU2lnbmFscyA9IHRoaXMuYnVmZmVyZWRTaWduYWxzO1xuICAgIHdoaWxlIChidWZmZXJlZFNpZ25hbHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCBzaWduYWwgaGFuZGxlciwgc28gYWxsIHNpZ25hbHMgYXJlIGRpc3BhdGNoYWJsZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KGJ1ZmZlcmVkU2lnbmFscy5zaGlmdCgpISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3VuZEluZGV4ID0gYnVmZmVyZWRTaWduYWxzLmZpbmRJbmRleCgoc2lnbmFsKSA9PiB0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWwuc2lnbmFsTmFtZSBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBicmVhaztcbiAgICAgICAgY29uc3QgW3NpZ25hbF0gPSBidWZmZXJlZFNpZ25hbHMuc3BsaWNlKGZvdW5kSW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnNpZ25hbFdvcmtmbG93KHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVNpZ25hbEV4dGVybmFsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignc2lnbmFsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVSZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvdyhcbiAgICBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVSZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvd1xuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2FuY2VsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBjb25zdCBnZXRXYXJuYWJsZSA9IChoYW5kbGVyRXhlY3V0aW9uczogSXRlcmFibGU8TWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KTogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSA9PiB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShoYW5kbGVyRXhlY3V0aW9ucykuZmlsdGVyKFxuICAgICAgICAoZXgpID0+IGV4LnVuZmluaXNoZWRQb2xpY3kgPT09IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LldBUk5fQU5EX0FCQU5ET05cbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdhcm5hYmxlVXBkYXRlcyA9IGdldFdhcm5hYmxlKHRoaXMuaW5Qcm9ncmVzc1VwZGF0ZXMudmFsdWVzKCkpO1xuICAgIGlmICh3YXJuYWJsZVVwZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLndhcm4obWFrZVVuZmluaXNoZWRVcGRhdGVIYW5kbGVyTWVzc2FnZSh3YXJuYWJsZVVwZGF0ZXMpKTtcbiAgICB9XG5cbiAgICBjb25zdCB3YXJuYWJsZVNpZ25hbHMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NTaWduYWxzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVTaWduYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2Uod2FybmFibGVTaWduYWxzKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJhbmRvbVNlZWQoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklVcGRhdGVSYW5kb21TZWVkKTogdm9pZCB7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnJhbmRvbW5lc3NTZWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhY3RpdmF0aW9uIHdpdGggcmFuZG9tbmVzc1NlZWQgYXR0cmlidXRlJyk7XG4gICAgfVxuICAgIHRoaXMucmFuZG9tID0gYWxlYShhY3RpdmF0aW9uLnJhbmRvbW5lc3NTZWVkLnRvQnl0ZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgbm90aWZ5SGFzUGF0Y2goYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklOb3RpZnlIYXNQYXRjaCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZylcbiAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignVW5leHBlY3RlZCBub3RpZnlIYXNQYXRjaCBqb2Igb24gbm9uLXJlcGxheSBhY3RpdmF0aW9uJyk7XG4gICAgaWYgKCFhY3RpdmF0aW9uLnBhdGNoSWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdGlmeUhhc1BhdGNoIG1pc3NpbmcgcGF0Y2ggaWQnKTtcbiAgICB0aGlzLmtub3duUHJlc2VudFBhdGNoZXMuYWRkKGFjdGl2YXRpb24ucGF0Y2hJZCk7XG4gIH1cblxuICBwdWJsaWMgcGF0Y2hJbnRlcm5hbChwYXRjaElkOiBzdHJpbmcsIGRlcHJlY2F0ZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53b3JrZmxvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1BhdGNoZXMgY2Fubm90IGJlIHVzZWQgYmVmb3JlIFdvcmtmbG93IHN0YXJ0cycpO1xuICAgIH1cbiAgICBjb25zdCB1c2VQYXRjaCA9ICF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nIHx8IHRoaXMua25vd25QcmVzZW50UGF0Y2hlcy5oYXMocGF0Y2hJZCk7XG4gICAgLy8gQXZvaWQgc2VuZGluZyBjb21tYW5kcyBmb3IgcGF0Y2hlcyBjb3JlIGFscmVhZHkga25vd3MgYWJvdXQuXG4gICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gZW5hYmxlcyBkZXZlbG9wbWVudCBvZiBhdXRvbWF0aWMgcGF0Y2hpbmcgdG9vbHMuXG4gICAgaWYgKHVzZVBhdGNoICYmICF0aGlzLnNlbnRQYXRjaGVzLmhhcyhwYXRjaElkKSkge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICAgIHNldFBhdGNoTWFya2VyOiB7IHBhdGNoSWQsIGRlcHJlY2F0ZWQgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZW50UGF0Y2hlcy5hZGQocGF0Y2hJZCk7XG4gICAgfVxuICAgIHJldHVybiB1c2VQYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgZWFybHkgd2hpbGUgaGFuZGxpbmcgYW4gYWN0aXZhdGlvbiB0byByZWdpc3RlciBrbm93biBmbGFncy5cbiAgICogTWF5IGJlIGludm9rZWQgZnJvbSBvdXRzaWRlIHRoZSBWTS5cbiAgICovXG4gIHB1YmxpYyBhZGRLbm93bkZsYWdzKGZsYWdzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBmbGFncykge1xuICAgICAgYXNzZXJ0VmFsaWRGbGFnKGZsYWcpO1xuICAgICAgdGhpcy5rbm93bkZsYWdzLmFkZChmbGFnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gU0RLIEZsYWcgbWF5IGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzay5cbiAgICpcbiAgICogU0RLIGZsYWdzIHBsYXkgYSByb2xlIHNpbWlsYXIgdG8gdGhlIGBwYXRjaGVkKClgIEFQSSwgYnV0IGFyZSBtZWFudCBmb3IgaW50ZXJuYWwgdXNhZ2UgYnkgdGhlXG4gICAqIFNESyBpdHNlbGYuIFRoZXkgbWFrZSBpdCBwb3NzaWJsZSBmb3IgdGhlIFNESyB0byBldm9sdmUgaXRzIGJlaGF2aW9ycyBvdmVyIHRpbWUsIHdoaWxlIHN0aWxsXG4gICAqIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBXb3JrZmxvdyBoaXN0b3JpZXMgcHJvZHVjZWQgYnkgb2xkZXIgU0RLcywgd2l0aG91dCBjYXVzaW5nXG4gICAqIGRldGVybWluaXNtIHZpb2xhdGlvbnMuXG4gICAqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgaGFzRmxhZyhmbGFnOiBTZGtGbGFnKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMua25vd25GbGFncy5oYXMoZmxhZy5pZCkpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gSWYgbm90IHJlcGxheWluZywgZW5hYmxlIHRoZSBmbGFnIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gYmUgZW5hYmxlZCBieSBkZWZhdWx0LiBTZXR0aW5nIGFcbiAgICAvLyBmbGFnJ3MgZGVmYXVsdCB0byBmYWxzZSBhbGxvd3MgcHJvZ3Jlc3NpdmUgcm9sbG91dCBvZiBuZXcgZmVhdHVyZSBmbGFncywgd2l0aCB0aGUgcG9zc2liaWxpdHlcbiAgICAvLyBvZiByZXZlcnRpbmcgYmFjayB0byBhIHZlcnNpb24gb2YgdGhlIFNESyB3aGVyZSB0aGUgZmxhZyBpcyBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAgLy8gSXQgaXMgYWxzbyB1c2VmdWwgZm9yIHRlc3RpbmcgcHVycG9zZS5cbiAgICBpZiAoIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgZmxhZy5kZWZhdWx0KSB7XG4gICAgICB0aGlzLmtub3duRmxhZ3MuYWRkKGZsYWcuaWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gV2hlbiByZXBsYXlpbmcsIGEgZmxhZyBpcyBjb25zaWRlcmVkIGVuYWJsZWQgaWYgaXQgd2FzIGVuYWJsZWQgZHVyaW5nIHRoZSBvcmlnaW5hbCBleGVjdXRpb24gb2ZcbiAgICAvLyB0aGF0IFdvcmtmbG93IFRhc2s7IHRoaXMgaXMgbm9ybWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGZsYWcgSUQgaW4gdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBXRlQgQ29tcGxldGVkJ3MgYHNka01ldGFkYXRhLmxhbmdVc2VkRmxhZ3NgLlxuICAgIC8vXG4gICAgLy8gU0RLIEZsYWcgQWx0ZXJuYXRlIENvbmRpdGlvbiBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBhIGZsYWcgc2hvdWxkXG4gICAgLy8gYmUgY29uc2lkZXJlZCBhcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCBXRlQ7IGUuZy4gYnkgbG9va2luZyBhdCB0aGUgdmVyc2lvbiBvZiB0aGUgU0RLIHRoYXRcbiAgICAvLyBlbWl0dGVkIGEgV0ZULiBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byByZXRyb2FjdGl2ZWx5IHR1cm4gb24gc29tZSBmbGFncyBmb3IgV0ZUIGVtaXR0ZWRcbiAgICAvLyBieSBwcmV2aW91cyBTREtzIHRoYXQgY29udGFpbmVkIGEgYnVnLiBBbHQgQ29uZGl0aW9ucyBzaG91bGQgb25seSBiZSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgY29uZGl0aW9ucyBhcmUgb25seSBldmFsdWF0ZWQgd2hpbGUgcmVwbGF5aW5nLiBBbHNvLCBhbHRlcm5hdGUgY29uZGl0aW9ucyB3aWxsIG5vdFxuICAgIC8vIGNhdXNlIHRoZSBmbGFnIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgXCJ1c2VkIGZsYWdzXCIgc2V0LCB3aGljaCBtZWFucyB0aGF0IGZ1cnRoZXIgV29ya2Zsb3cgVGFza3NcbiAgICAvLyBtYXkgbm90IHJlZmxlY3QgdGhpcyBmbGFnIGlmIHRoZSBjb25kaXRpb24gbm8gbG9uZ2VyIGhvbGRzLiBUaGlzIGlzIHNvIHRvIGF2b2lkIGluY29ycmVjdFxuICAgIC8vIGJlaGF2aW9ycyBpbiBjYXNlIHdoZXJlIGEgV29ya2Zsb3cgRXhlY3V0aW9uIGhhcyBnb25lIHRocm91Z2ggYSBuZXdlciBTREsgdmVyc2lvbiB0aGVuIGFnYWluXG4gICAgLy8gdGhyb3VnaCBhbiBvbGRlciBvbmUuXG4gICAgaWYgKHRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgZmxhZy5hbHRlcm5hdGl2ZUNvbmRpdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZCBvZiBmbGFnLmFsdGVybmF0aXZlQ29uZGl0aW9ucykge1xuICAgICAgICBpZiAoY29uZCh7IGluZm86IHRoaXMuaW5mbyB9KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUZyb21DYWNoZSgpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ3JlbW92ZUZyb21DYWNoZSBhY3RpdmF0aW9uIGpvYiBzaG91bGQgbm90IHJlYWNoIHdvcmtmbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBmYWlsdXJlcyBpbnRvIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFVzZWQgdG8gaGFuZGxlIGFueSBmYWlsdXJlIGVtaXR0ZWQgYnkgdGhlIFdvcmtmbG93LlxuICAgKi9cbiAgYXN5bmMgaGFuZGxlV29ya2Zsb3dGYWlsdXJlKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkICYmIGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNhbmNlbFdvcmtmbG93RXhlY3V0aW9uOiB7fSB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbjogZXJyb3IuY29tbWFuZCB9LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpKSB7XG4gICAgICAgIC8vIFRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIHdoaWNoIHdpbGwgZmFpbCB0aGUgYWN0aXZhdGlvblxuICAgICAgICAvLyBwcmV2ZW50aW5nIGl0IGZyb20gY29tcGxldGluZy5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdy4gV2UgZG8gbm90IHdhbnQgdG8gaXNzdWUgdW5maW5pc2hlZEhhbmRsZXJzIHdhcm5pbmdzLiBUbyBhY2hpZXZlIHRoYXQsIHdlXG4gICAgICAvLyBtYXJrIGFsbCBoYW5kbGVycyBhcyBjb21wbGV0ZWQgbm93LlxuICAgICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5jbGVhcigpO1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5jbGVhcigpO1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5lcnJvclRvRmFpbHVyZShlcnJvciksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlUXVlcnkocXVlcnlJZDogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7IHF1ZXJ5SWQsIHN1Y2NlZWRlZDogeyByZXNwb25zZTogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQpIH0gfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmFpbFF1ZXJ5KHF1ZXJ5SWQ6IHN0cmluZywgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHJlc3BvbmRUb1F1ZXJ5OiB7XG4gICAgICAgIHF1ZXJ5SWQsXG4gICAgICAgIGZhaWxlZDogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFjY2VwdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoeyB1cGRhdGVSZXNwb25zZTogeyBwcm90b2NvbEluc3RhbmNlSWQsIGFjY2VwdGVkOiB7fSB9IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7XG4gICAgICB1cGRhdGVSZXNwb25zZTogeyBwcm90b2NvbEluc3RhbmNlSWQsIGNvbXBsZXRlZDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQpIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQ6IHN0cmluZywgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHVwZGF0ZVJlc3BvbnNlOiB7XG4gICAgICAgIHByb3RvY29sSW5zdGFuY2VJZCxcbiAgICAgICAgcmVqZWN0ZWQ6IHRoaXMuZXJyb3JUb0ZhaWx1cmUoZW5zdXJlVGVtcG9yYWxGYWlsdXJlKGVycm9yKSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbnN1bWUgYSBjb21wbGV0aW9uIGlmIGl0IGV4aXN0cyBpbiBXb3JrZmxvdyBzdGF0ZSAqL1xuICBwcml2YXRlIG1heWJlQ29uc3VtZUNvbXBsZXRpb24odHlwZToga2V5b2YgQWN0aXZhdG9yWydjb21wbGV0aW9ucyddLCB0YXNrU2VxOiBudW1iZXIpOiBDb21wbGV0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5jb21wbGV0aW9uc1t0eXBlXS5nZXQodGFza1NlcSk7XG4gICAgaWYgKGNvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb21wbGV0aW9uc1t0eXBlXS5kZWxldGUodGFza1NlcSk7XG4gICAgfVxuICAgIHJldHVybiBjb21wbGV0aW9uO1xuICB9XG5cbiAgLyoqIENvbnN1bWUgYSBjb21wbGV0aW9uIGlmIGl0IGV4aXN0cyBpbiBXb3JrZmxvdyBzdGF0ZSwgdGhyb3dzIGlmIGl0IGRvZXNuJ3QgKi9cbiAgcHJpdmF0ZSBjb25zdW1lQ29tcGxldGlvbih0eXBlOiBrZXlvZiBBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ10sIHRhc2tTZXE6IG51bWJlcik6IENvbXBsZXRpb24ge1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24odHlwZSwgdGFza1NlcSk7XG4gICAgaWYgKGNvbXBsZXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyBjb21wbGV0aW9uIGZvciB0YXNrU2VxICR7dGFza1NlcX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBsZXRpb247XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlV29ya2Zsb3cocmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgIHJlc3VsdDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duKTogUHJvdG9GYWlsdXJlIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmVycm9yVG9GYWlsdXJlKGVyciwgdGhpcy5wYXlsb2FkQ29udmVydGVyKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSk6IEVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VxPFQgZXh0ZW5kcyB7IHNlcT86IG51bWJlciB8IG51bGwgfT4oYWN0aXZhdGlvbjogVCk6IG51bWJlciB7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRpb24uc2VxO1xuICBpZiAoc2VxID09PSB1bmRlZmluZWQgfHwgc2VxID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgR290IGFjdGl2YXRpb24gd2l0aCBubyBzZXEgYXR0cmlidXRlYCk7XG4gIH1cbiAgcmV0dXJuIHNlcTtcbn1cblxuZnVuY3Rpb24gbWFrZVVuZmluaXNoZWRVcGRhdGVIYW5kbGVyTWVzc2FnZShoYW5kbGVyRXhlY3V0aW9uczogTWVzc2FnZUhhbmRsZXJFeGVjdXRpb25bXSk6IHN0cmluZyB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgXG5bVE1QUkwxMTAyXSBXb3JrZmxvdyBmaW5pc2hlZCB3aGlsZSBhbiB1cGRhdGUgaGFuZGxlciB3YXMgc3RpbGwgcnVubmluZy4gVGhpcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB3b3JrIHRoYXQgdGhlXG51cGRhdGUgaGFuZGxlciB3YXMgZG9pbmcsIGFuZCB0aGUgY2xpZW50IHRoYXQgc2VudCB0aGUgdXBkYXRlIHdpbGwgcmVjZWl2ZSBhICd3b3JrZmxvdyBleGVjdXRpb25cbmFscmVhZHkgY29tcGxldGVkJyBSUENFcnJvciBpbnN0ZWFkIG9mIHRoZSB1cGRhdGUgcmVzdWx0LiBZb3UgY2FuIHdhaXQgZm9yIGFsbCB1cGRhdGUgYW5kIHNpZ25hbFxuaGFuZGxlcnMgdG8gY29tcGxldGUgYnkgdXNpbmcgXFxgYXdhaXQgd29ya2Zsb3cuY29uZGl0aW9uKHdvcmtmbG93LmFsbEhhbmRsZXJzRmluaXNoZWQpXFxgLlxuQWx0ZXJuYXRpdmVseSwgaWYgYm90aCB5b3UgYW5kIHRoZSBjbGllbnRzIHNlbmRpbmcgdGhlIHVwZGF0ZSBhcmUgb2theSB3aXRoIGludGVycnVwdGluZyBydW5uaW5nIGhhbmRsZXJzXG53aGVuIHRoZSB3b3JrZmxvdyBmaW5pc2hlcywgYW5kIGNhdXNpbmcgY2xpZW50cyB0byByZWNlaXZlIGVycm9ycywgdGhlbiB5b3UgY2FuIGRpc2FibGUgdGhpcyB3YXJuaW5nIGJ5XG5wYXNzaW5nIGFuIG9wdGlvbiB3aGVuIHNldHRpbmcgdGhlIGhhbmRsZXI6XG5cXGB3b3JrZmxvdy5zZXRIYW5kbGVyKG15VXBkYXRlLCBteVVwZGF0ZUhhbmRsZXIsIHt1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5BQkFORE9OfSk7XFxgLmBcbiAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIHJldHVybiBgJHttZXNzYWdlfSBUaGUgZm9sbG93aW5nIHVwZGF0ZXMgd2VyZSB1bmZpbmlzaGVkIChhbmQgd2FybmluZ3Mgd2VyZSBub3QgZGlzYWJsZWQgZm9yIHRoZWlyIGhhbmRsZXIpOiAke0pTT04uc3RyaW5naWZ5KFxuICAgIGhhbmRsZXJFeGVjdXRpb25zLm1hcCgoZXgpID0+ICh7IG5hbWU6IGV4Lm5hbWUsIGlkOiBleC5pZCB9KSlcbiAgKX1gO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKGhhbmRsZXJFeGVjdXRpb25zOiBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbltdKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBcbltUTVBSTDExMDJdIFdvcmtmbG93IGZpbmlzaGVkIHdoaWxlIGEgc2lnbmFsIGhhbmRsZXIgd2FzIHN0aWxsIHJ1bm5pbmcuIFRoaXMgbWF5IGhhdmUgaW50ZXJydXB0ZWQgd29yayB0aGF0IHRoZVxuc2lnbmFsIGhhbmRsZXIgd2FzIGRvaW5nLiBZb3UgY2FuIHdhaXQgZm9yIGFsbCB1cGRhdGUgYW5kIHNpZ25hbCBoYW5kbGVycyB0byBjb21wbGV0ZSBieSB1c2luZ1xuXFxgYXdhaXQgd29ya2Zsb3cuY29uZGl0aW9uKHdvcmtmbG93LmFsbEhhbmRsZXJzRmluaXNoZWQpXFxgLiBBbHRlcm5hdGl2ZWx5LCBpZiBib3RoIHlvdSBhbmQgdGhlXG5jbGllbnRzIHNlbmRpbmcgdGhlIHVwZGF0ZSBhcmUgb2theSB3aXRoIGludGVycnVwdGluZyBydW5uaW5nIGhhbmRsZXJzIHdoZW4gdGhlIHdvcmtmbG93IGZpbmlzaGVzLFxudGhlbiB5b3UgY2FuIGRpc2FibGUgdGhpcyB3YXJuaW5nIGJ5IHBhc3NpbmcgYW4gb3B0aW9uIHdoZW4gc2V0dGluZyB0aGUgaGFuZGxlcjpcblxcYHdvcmtmbG93LnNldEhhbmRsZXIobXlTaWduYWwsIG15U2lnbmFsSGFuZGxlciwge3VuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LkFCQU5ET059KTtcXGAuYFxuXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnICcpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBuYW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgZXggb2YgaGFuZGxlckV4ZWN1dGlvbnMpIHtcbiAgICBjb25zdCBjb3VudCA9IG5hbWVzLmdldChleC5uYW1lKSB8fCAwO1xuICAgIG5hbWVzLnNldChleC5uYW1lLCBjb3VudCArIDEpO1xuICB9XG5cbiAgcmV0dXJuIGAke21lc3NhZ2V9IFRoZSBmb2xsb3dpbmcgc2lnbmFscyB3ZXJlIHVuZmluaXNoZWQgKGFuZCB3YXJuaW5ncyB3ZXJlIG5vdCBkaXNhYmxlZCBmb3IgdGhlaXIgaGFuZGxlcik6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgQXJyYXkuZnJvbShuYW1lcy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIGNvdW50XSkgPT4gKHsgbmFtZSwgY291bnQgfSkpXG4gICl9YDtcbn1cbiIsImltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyBTZGtDb21wb25lbnQgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgdHlwZSBTaW5rLCB0eXBlIFNpbmtzLCBwcm94eVNpbmtzIH0gZnJvbSAnLi9zaW5rcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxhdGlvbiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IFdvcmtmbG93SW5mbywgQ29udGludWVBc05ldyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TG9nZ2VyIGV4dGVuZHMgU2luayB7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xufVxuXG4vKipcbiAqIFNpbmsgaW50ZXJmYWNlIGZvciBmb3J3YXJkaW5nIGxvZ3MgZnJvbSB0aGUgV29ya2Zsb3cgc2FuZGJveCB0byB0aGUgV29ya2VyXG4gKlxuICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSBMb2dnZXJTaW5rcyBkaXJlY3RseS4gVG8gbG9nIGZyb20gV29ya2Zsb3cgY29kZSwgdXNlIHRoZSBgbG9nYCBvYmplY3RcbiAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJTaW5rc0RlcHJlY2F0ZWQgZXh0ZW5kcyBTaW5rcyB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICAgKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gICAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAgICovXG4gIGRlZmF1bHRXb3JrZXJMb2dnZXI6IFdvcmtmbG93TG9nZ2VyO1xufVxuXG4vKipcbiAqIFNpbmsgaW50ZXJmYWNlIGZvciBmb3J3YXJkaW5nIGxvZ3MgZnJvbSB0aGUgV29ya2Zsb3cgc2FuZGJveCB0byB0aGUgV29ya2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyU2lua3NJbnRlcm5hbCBleHRlbmRzIFNpbmtzIHtcbiAgX190ZW1wb3JhbF9sb2dnZXI6IFdvcmtmbG93TG9nZ2VyO1xufVxuXG5jb25zdCBsb2dnZXJTaW5rID0gcHJveHlTaW5rczxMb2dnZXJTaW5rc0ludGVybmFsPigpLl9fdGVtcG9yYWxfbG9nZ2VyO1xuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGJ5IHRoZSBTREsgbG9nZ2VyIHRvIGV4dHJhY3QgYSB0aW1lc3RhbXAgZnJvbSBsb2cgYXR0cmlidXRlcy5cbiAqIEFsc28gZGVmaW5lZCBpbiBgd29ya2VyL2xvZ2dlci50c2AgLSBpbnRlbnRpb25hbGx5IG5vdCBzaGFyZWQuXG4gKi9cbmNvbnN0IExvZ1RpbWVzdGFtcCA9IFN5bWJvbC5mb3IoJ2xvZ190aW1lc3RhbXAnKTtcblxuLyoqXG4gKiBEZWZhdWx0IHdvcmtmbG93IGxvZ2dlci5cbiAqXG4gKiBUaGlzIGxvZ2dlciBpcyByZXBsYXktYXdhcmUgYW5kIHdpbGwgb21pdCBsb2cgbWVzc2FnZXMgb24gd29ya2Zsb3cgcmVwbGF5LiBNZXNzYWdlcyBlbWl0dGVkIGJ5IHRoaXMgbG9nZ2VyIGFyZVxuICogZnVubmVsbGVkIHRocm91Z2ggYSBzaW5rIHRoYXQgZm9yd2FyZHMgdGhlbSB0byB0aGUgbG9nZ2VyIHJlZ2lzdGVyZWQgb24ge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfS5cbiAqXG4gKiBBdHRyaWJ1dGVzIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgRXhlY3V0aW9uIGNvbnRleHQgYXJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYXMgbWV0YWRhdGEgb24gZXZlcnkgbG9nXG4gKiBlbnRyaWVzLiBBbiBleHRyYSBgc2RrQ29tcG9uZW50YCBtZXRhZGF0YSBhdHRyaWJ1dGUgaXMgYWxzbyBhZGRlZCwgd2l0aCB2YWx1ZSBgd29ya2Zsb3dgOyB0aGlzIGNhbiBiZSB1c2VkIGZvclxuICogZmluZS1ncmFpbmVkIGZpbHRlcmluZyBvZiBsb2cgZW50cmllcyBmdXJ0aGVyIGRvd25zdHJlYW0uXG4gKlxuICogVG8gY3VzdG9taXplIGxvZyBhdHRyaWJ1dGVzLCByZWdpc3RlciBhIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvcn0gdGhhdCBpbnRlcmNlcHRzIHRoZVxuICogYGdldExvZ0F0dHJpYnV0ZXMoKWAgbWV0aG9kLlxuICpcbiAqIE5vdGljZSB0aGF0IHNpbmNlIHNpbmtzIGFyZSB1c2VkIHRvIHBvd2VyIHRoaXMgbG9nZ2VyLCBhbnkgbG9nIGF0dHJpYnV0ZXMgbXVzdCBiZSB0cmFuc2ZlcmFibGUgdmlhIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbCN3b3JrZXJfdGhyZWFkc19wb3J0X3Bvc3RtZXNzYWdlX3ZhbHVlX3RyYW5zZmVybGlzdCB8IHBvc3RNZXNzYWdlfVxuICogQVBJLlxuICpcbiAqIE5PVEU6IFNwZWNpZnlpbmcgYSBjdXN0b20gbG9nZ2VyIHRocm91Z2gge0BsaW5rIGRlZmF1bHRTaW5rfSBvciBieSBtYW51YWxseSByZWdpc3RlcmluZyBhIHNpbmsgbmFtZWRcbiAqIGBkZWZhdWx0V29ya2VyTG9nZ2VyYCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHtAbGluayBSdW50aW1lLmxvZ2dlcn0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZzogV29ya2Zsb3dMb2dnZXIgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIChbJ3RyYWNlJywgJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddIGFzIEFycmF5PGtleW9mIFdvcmtmbG93TG9nZ2VyPikubWFwKChsZXZlbCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBsZXZlbCxcbiAgICAgIChtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LmxvZyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICAgICAgICBjb25zdCBnZXRMb2dBdHRyaWJ1dGVzID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnZ2V0TG9nQXR0cmlidXRlcycsIChhKSA9PiBhKTtcbiAgICAgICAgcmV0dXJuIGxvZ2dlclNpbmtbbGV2ZWxdKG1lc3NhZ2UsIHtcbiAgICAgICAgICAvLyBJbmplY3QgdGhlIGNhbGwgdGltZSBpbiBuYW5vc2Vjb25kIHJlc29sdXRpb24gYXMgZXhwZWN0ZWQgYnkgdGhlIHdvcmtlciBsb2dnZXIuXG4gICAgICAgICAgW0xvZ1RpbWVzdGFtcF06IGFjdGl2YXRvci5nZXRUaW1lT2ZEYXkoKSxcbiAgICAgICAgICBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZmxvdyxcbiAgICAgICAgICAuLi5nZXRMb2dBdHRyaWJ1dGVzKHdvcmtmbG93TG9nQXR0cmlidXRlcyhhY3RpdmF0b3IuaW5mbykpLFxuICAgICAgICAgIC4uLmF0dHJzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgXTtcbiAgfSlcbikgYXMgYW55O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nKGZuOiAoKSA9PiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGxvZy5kZWJ1ZygnV29ya2Zsb3cgc3RhcnRlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICBjb25zdCBwID0gZm4oKS50aGVuKFxuICAgIChyZXMpID0+IHtcbiAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29tcGxldGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICAvLyBBdm9pZCB1c2luZyBpbnN0YW5jZW9mIGNoZWNrcyBpbiBjYXNlIHRoZSBtb2R1bGVzIHRoZXkncmUgZGVmaW5lZCBpbiBsb2FkZWQgbW9yZSB0aGFuIG9uY2UsXG4gICAgICAvLyBlLmcuIGJ5IGplc3Qgb3Igd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBhcmUgaW5zdGFsbGVkLlxuICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb21wbGV0ZWQgYXMgY2FuY2VsbGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb250aW51ZUFzTmV3KSB7XG4gICAgICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3JywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKCdXb3JrZmxvdyBmYWlsZWQnLCB7IGVycm9yLCBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICk7XG4gIC8vIEF2b2lkIHNob3dpbmcgdGhpcyBpbnRlcmNlcHRvciBpbiBzdGFjayB0cmFjZSBxdWVyeVxuICB1bnRyYWNrUHJvbWlzZShwKTtcbiAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG1hcCBvZiBhdHRyaWJ1dGVzIHRvIGJlIHNldCBfYnkgZGVmYXVsdF8gb24gbG9nIG1lc3NhZ2VzIGZvciBhIGdpdmVuIFdvcmtmbG93LlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFdvcmtmbG93IGNvbnRleHQgKGVnLiBieSB0aGUgd29ya2VyIGl0c2VsZikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0xvZ0F0dHJpYnV0ZXMoaW5mbzogV29ya2Zsb3dJbmZvKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWVzcGFjZTogaW5mby5uYW1lc3BhY2UsXG4gICAgdGFza1F1ZXVlOiBpbmZvLnRhc2tRdWV1ZSxcbiAgICB3b3JrZmxvd0lkOiBpbmZvLndvcmtmbG93SWQsXG4gICAgcnVuSWQ6IGluZm8ucnVuSWQsXG4gICAgd29ya2Zsb3dUeXBlOiBpbmZvLndvcmtmbG93VHlwZSxcbiAgfTtcbn1cbiIsIi8vIC4uL3BhY2thZ2UuanNvbiBpcyBvdXRzaWRlIG9mIHRoZSBUUyBwcm9qZWN0IHJvb3REaXIgd2hpY2ggY2F1c2VzIFRTIHRvIGNvbXBsYWluIGFib3V0IHRoaXMgaW1wb3J0LlxuLy8gV2UgZG8gbm90IHdhbnQgdG8gY2hhbmdlIHRoZSByb290RGlyIGJlY2F1c2UgaXQgbWVzc2VzIHVwIHRoZSBvdXRwdXQgc3RydWN0dXJlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHBrZyBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBwa2cgYXMgeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9O1xuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgV29ya2Zsb3cgZW5kIG9mIHRoZSBzaW5rcyBtZWNoYW5pc20uXG4gKlxuICogU2lua3MgYXJlIGEgbWVjaGFuaXNtIGZvciBleHBvcnRpbmcgZGF0YSBmcm9tIHRoZSBXb3JrZmxvdyBpc29sYXRlIHRvIHRoZVxuICogTm9kZS5qcyBlbnZpcm9ubWVudCwgdGhleSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFdvcmtmbG93IGhhcyBubyB3YXkgdG9cbiAqIGNvbW11bmljYXRlIHdpdGggdGhlIG91dHNpZGUgV29ybGQuXG4gKlxuICogU2lua3MgYXJlIHR5cGljYWxseSB1c2VkIGZvciBleHBvcnRpbmcgbG9ncywgbWV0cmljcyBhbmQgdHJhY2VzIG91dCBmcm9tIHRoZVxuICogV29ya2Zsb3cuXG4gKlxuICogU2luayBmdW5jdGlvbnMgbWF5IG5vdCByZXR1cm4gdmFsdWVzIHRvIHRoZSBXb3JrZmxvdyBpbiBvcmRlciB0byBwcmV2ZW50XG4gKiBicmVha2luZyBkZXRlcm1pbmlzbS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQW55IGZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmUgdXNlZCBmb3IgU2luayBmdW5jdGlvbnMgYXMgbG9uZyBhcyB0aGUgcmV0dXJuIHR5cGUgaXMgYHZvaWRgLlxuICpcbiAqIFdoZW4gY2FsbGluZyBhIFNpbmsgZnVuY3Rpb24sIGFyZ3VtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIFdvcmtmbG93IGlzb2xhdGUgdG8gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQgdXNpbmdcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX0uXG5cbiAqIFRoaXMgY29uc3RyYWlucyB0aGUgYXJndW1lbnQgdHlwZXMgdG8gcHJpbWl0aXZlcyAoZXhjbHVkaW5nIFN5bWJvbHMpLlxuICovXG5leHBvcnQgdHlwZSBTaW5rRnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbi8qKiBBIG1hcHBpbmcgb2YgbmFtZSB0byBmdW5jdGlvbiwgZGVmaW5lcyBhIHNpbmdsZSBzaW5rIChlLmcuIGxvZ2dlcikgKi9cbmV4cG9ydCB0eXBlIFNpbmsgPSBSZWNvcmQ8c3RyaW5nLCBTaW5rRnVuY3Rpb24+O1xuLyoqXG4gKiBXb3JrZmxvdyBTaW5rIGFyZSBhIG1hcHBpbmcgb2YgbmFtZSB0byB7QGxpbmsgU2lua31cbiAqL1xuZXhwb3J0IHR5cGUgU2lua3MgPSBSZWNvcmQ8c3RyaW5nLCBTaW5rPjtcblxuLyoqXG4gKiBDYWxsIGluZm9ybWF0aW9uIGZvciBhIFNpbmtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5rQ2FsbCB7XG4gIGlmYWNlTmFtZTogc3RyaW5nO1xuICBmbk5hbWU6IHN0cmluZztcbiAgYXJnczogYW55W107XG4gIHdvcmtmbG93SW5mbzogV29ya2Zsb3dJbmZvO1xufVxuXG4vKipcbiAqIEdldCBhIHJlZmVyZW5jZSB0byBTaW5rcyBmb3IgZXhwb3J0aW5nIGRhdGEgb3V0IG9mIHRoZSBXb3JrZmxvdy5cbiAqXG4gKiBUaGVzZSBTaW5rcyAqKm11c3QqKiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIFdvcmtlciBpbiBvcmRlciBmb3IgdGhpc1xuICogbWVjaGFuaXNtIHRvIHdvcmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eVNpbmtzLCBTaW5rcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqXG4gKiBpbnRlcmZhY2UgTXlTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAqICAgbG9nZ2VyOiB7XG4gKiAgICAgaW5mbyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICogICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gKiAgIH07XG4gKiB9XG4gKlxuICogY29uc3QgeyBsb2dnZXIgfSA9IHByb3h5U2lua3M8TXlEZXBlbmRlbmNpZXM+KCk7XG4gKiBsb2dnZXIuaW5mbygnc2V0dGluZyB1cCcpO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICByZXR1cm4ge1xuICogICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gKiAgICAgICBsb2dnZXIuaW5mbyhcImhleSBob1wiKTtcbiAqICAgICAgIGxvZ2dlci5lcnJvcihcImxldHMgZ29cIik7XG4gKiAgICAgfVxuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eVNpbmtzPFQgZXh0ZW5kcyBTaW5rcz4oKTogVCB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAge30sXG4gICAge1xuICAgICAgZ2V0KF8sIGlmYWNlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGdldChfLCBmbk5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICAgICAgICAgICAgICAgJ1Byb3hpZWQgc2lua3MgZnVuY3Rpb25zIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhY3RpdmF0b3Iuc2lua0NhbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaWZhY2VOYW1lOiBpZmFjZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgZm5OYW1lOiBmbk5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgLy8gU2luayBmdW5jdGlvbiBkb2Vzbid0IGdldCBjYWxsZWQgaW1tZWRpYXRlbHkuIE1ha2UgYSBjbG9uZSBvZiB0aGUgc2luaydzIGFyZ3MsIHNvIHRoYXQgZnVydGhlciBtdXRhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZXNlIG9iamVjdHMgZG9uJ3QgY29ycnVwdCB0aGUgYXJncyB0aGF0IHRoZSBzaW5rIGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZS4gT25seSBhdmFpbGFibGUgZnJvbSBub2RlIDE3LlxuICAgICAgICAgICAgICAgICAgYXJnczogKGdsb2JhbFRoaXMgYXMgYW55KS5zdHJ1Y3R1cmVkQ2xvbmUgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZShhcmdzKSA6IGFyZ3MsXG4gICAgICAgICAgICAgICAgICAvLyBhY3RpdmF0b3IuaW5mbyBpcyBpbnRlcm5hbGx5IGNvcHktb24td3JpdGUuIFRoaXMgZW5zdXJlIHRoYXQgYW55IGZ1cnRoZXIgbXV0YXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB0byB0aGUgd29ya2Zsb3cgc3RhdGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByZXNlbnQgYWN0aXZhdGlvbiB3aWxsIG5vdCBjb3JydXB0IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3dJbmZvIHN0YXRlIHRoYXQgZ2V0cyBwYXNzZWQgd2hlbiB0aGUgc2luayBmdW5jdGlvbiBhY3R1YWxseSBnZXRzIGNhbGxlZC5cbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93SW5mbzogYWN0aXZhdG9yLmluZm8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfVxuICApIGFzIGFueTtcbn1cbiIsImltcG9ydCB7IG1heWJlR2V0QWN0aXZhdG9yVW50eXBlZCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNlU3RhY2tTdG9yZSB9IGZyb20gJy4vaW50ZXJuYWxzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgcHJvbWlzZSBmcm9tIGJlaW5nIHRyYWNrZWQgZm9yIHN0YWNrIHRyYWNlIHF1ZXJ5IHB1cnBvc2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnRyYWNrUHJvbWlzZShwcm9taXNlOiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IHN0b3JlID0gKG1heWJlR2V0QWN0aXZhdG9yVW50eXBlZCgpIGFzIGFueSk/LnByb21pc2VTdGFja1N0b3JlIGFzIFByb21pc2VTdGFja1N0b3JlIHwgdW5kZWZpbmVkO1xuICBpZiAoIXN0b3JlKSByZXR1cm47XG4gIHN0b3JlLmNoaWxkVG9QYXJlbnQuZGVsZXRlKHByb21pc2UpO1xuICBzdG9yZS5wcm9taXNlVG9TdGFjay5kZWxldGUocHJvbWlzZSk7XG59XG4iLCJpbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuLyoqXG4gKiBBIGBQcm9taXNlTGlrZWAgaGVscGVyIHdoaWNoIGV4cG9zZXMgaXRzIGByZXNvbHZlYCBhbmQgYHJlamVjdGAgbWV0aG9kcy5cbiAqXG4gKiBUcmlnZ2VyIGlzIENhbmNlbGxhdGlvblNjb3BlLWF3YXJlOiBpdCBpcyBsaW5rZWQgdG8gdGhlIGN1cnJlbnQgc2NvcGUgb25cbiAqIGNvbnN0cnVjdGlvbiBhbmQgdGhyb3dzIHdoZW4gdGhhdCBzY29wZSBpcyBjYW5jZWxsZWQuXG4gKlxuICogVXNlZnVsIGZvciBlLmcuIHdhaXRpbmcgZm9yIHVuYmxvY2tpbmcgYSBXb3JrZmxvdyBmcm9tIGEgU2lnbmFsLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8IS0tU05JUFNUQVJUIHR5cGVzY3JpcHQtdHJpZ2dlci13b3JrZmxvdy0tPlxuICogPCEtLVNOSVBFTkQtLT5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXI8VD4gaW1wbGVtZW50cyBQcm9taXNlTGlrZTxUPiB7XG4gIC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgcmVhbGl6ZSB0aGF0IHRoZSBwcm9taXNlIGV4ZWN1dG9yIGlzIHJ1biBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlc29sdmU6ICh2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcHVibGljIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8VD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICAgIC8vIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb25zXG4gICAgdW50cmFja1Byb21pc2UodGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCkpO1xuICB9XG5cbiAgdGhlbjxUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KFxuICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbFxuICApOiBQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBBc3luY0xvY2FsU3RvcmFnZSBhcyBBTFMgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLyoqXG4gKiBPcHRpb24gZm9yIGNvbnN0cnVjdGluZyBhIFVwZGF0ZVNjb3BlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlU2NvcGVPcHRpb25zIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLy8gQXN5bmNMb2NhbFN0b3JhZ2UgaXMgaW5qZWN0ZWQgdmlhIHZtIG1vZHVsZSBpbnRvIGdsb2JhbCBzY29wZS5cbi8vIEluIGNhc2UgV29ya2Zsb3cgY29kZSBpcyBpbXBvcnRlZCBpbiBOb2RlLmpzIGNvbnRleHQsIHJlcGxhY2Ugd2l0aCBhbiBlbXB0eSBjbGFzcy5cbmV4cG9ydCBjb25zdCBBc3luY0xvY2FsU3RvcmFnZTogbmV3IDxUPigpID0+IEFMUzxUPiA9IChnbG9iYWxUaGlzIGFzIGFueSkuQXN5bmNMb2NhbFN0b3JhZ2UgPz8gY2xhc3Mge307XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVTY29wZSB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogIFRoZSB1cGRhdGUgdHlwZSBuYW1lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBVcGRhdGVTY29wZU9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHNjb3BlIGFzIGN1cnJlbnQgYW5kIHJ1biB0aGUgdXBkYXRlIGhhbmRsZXIgYGZuYC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGBmbmBcbiAgICovXG4gIHJ1bjxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBzdG9yYWdlLnJ1bih0aGlzLCBmbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IFwiYWN0aXZlXCIgdXBkYXRlIHNjb3BlLlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKTogVXBkYXRlU2NvcGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBzdG9yYWdlLmdldFN0b3JlKCk7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBVcGRhdGVTY29wZSh7IGlkLCBuYW1lIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyB1cGRhdGVXaXRoSW5mbzxUPihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKHsgaWQsIG5hbWUgfSkucnVuKGZuKTtcbiAgfVxufVxuXG5jb25zdCBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFVwZGF0ZVNjb3BlPigpO1xuXG4vKipcbiAqIERpc2FibGUgdGhlIGFzeW5jIGxvY2FsIHN0b3JhZ2UgZm9yIHVwZGF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlVXBkYXRlU3RvcmFnZSgpOiB2b2lkIHtcbiAgc3RvcmFnZS5kaXNhYmxlKCk7XG59XG4iLCIvKipcbiAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBmb3IgdGhlIFdvcmtlciB0byBpbnRlcmFjdCB3aXRoIHRoZSBXb3JrZmxvdyBpc29sYXRlXG4gKlxuICogQG1vZHVsZVxuICovXG5pbXBvcnQgeyBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IGRpc2FibGVTdG9yYWdlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgZGlzYWJsZVVwZGF0ZVN0b3JhZ2UgfSBmcm9tICcuL3VwZGF0ZS1zY29wZSc7XG5pbXBvcnQgeyBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgeyBzZXRBY3RpdmF0b3JVbnR5cGVkLCBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcblxuLy8gRXhwb3J0IHRoZSB0eXBlIGZvciB1c2Ugb24gdGhlIFwid29ya2VyXCIgc2lkZVxuZXhwb3J0IHsgUHJvbWlzZVN0YWNrU3RvcmUgfSBmcm9tICcuL2ludGVybmFscyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXMgYXMgYW55O1xuY29uc3QgT3JpZ2luYWxEYXRlID0gZ2xvYmFsVGhpcy5EYXRlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGlzb2xhdGUgcnVudGltZS5cbiAqXG4gKiBTZXRzIHJlcXVpcmVkIGludGVybmFsIHN0YXRlIGFuZCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtmbG93IGFuZCBpbnRlcmNlcHRvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0UnVudGltZShvcHRpb25zOiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBuZXcgQWN0aXZhdG9yKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGluZm86IGZpeFByb3RvdHlwZXMoe1xuICAgICAgLi4ub3B0aW9ucy5pbmZvLFxuICAgICAgdW5zYWZlOiB7IC4uLm9wdGlvbnMuaW5mby51bnNhZmUsIG5vdzogT3JpZ2luYWxEYXRlLm5vdyB9LFxuICAgIH0pLFxuICB9KTtcbiAgLy8gVGhlcmUncyBvbmUgYWN0aXZhdG9yIHBlciB3b3JrZmxvdyBpbnN0YW5jZSwgc2V0IGl0IGdsb2JhbGx5IG9uIHRoZSBjb250ZXh0LlxuICAvLyBXZSBkbyB0aGlzIGJlZm9yZSBpbXBvcnRpbmcgYW55IHVzZXIgY29kZSBzbyB1c2VyIGNvZGUgY2FuIHN0YXRpY2FsbHkgcmVmZXJlbmNlIEB0ZW1wb3JhbGlvL3dvcmtmbG93IGZ1bmN0aW9uc1xuICAvLyBhcyB3ZWxsIGFzIERhdGUgYW5kIE1hdGgucmFuZG9tLlxuICBzZXRBY3RpdmF0b3JVbnR5cGVkKGFjdGl2YXRvcik7XG5cbiAgLy8gd2VicGFjayBhbGlhcyB0byBwYXlsb2FkQ29udmVydGVyUGF0aFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICBjb25zdCBjdXN0b21QYXlsb2FkQ29udmVydGVyID0gcmVxdWlyZSgnX190ZW1wb3JhbF9jdXN0b21fcGF5bG9hZF9jb252ZXJ0ZXInKS5wYXlsb2FkQ29udmVydGVyO1xuICAvLyBUaGUgYHBheWxvYWRDb252ZXJ0ZXJgIGV4cG9ydCBpcyB2YWxpZGF0ZWQgaW4gdGhlIFdvcmtlclxuICBpZiAoY3VzdG9tUGF5bG9hZENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIgPSBjdXN0b21QYXlsb2FkQ29udmVydGVyO1xuICB9XG4gIC8vIHdlYnBhY2sgYWxpYXMgdG8gZmFpbHVyZUNvbnZlcnRlclBhdGhcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgY3VzdG9tRmFpbHVyZUNvbnZlcnRlciA9IHJlcXVpcmUoJ19fdGVtcG9yYWxfY3VzdG9tX2ZhaWx1cmVfY29udmVydGVyJykuZmFpbHVyZUNvbnZlcnRlcjtcbiAgLy8gVGhlIGBmYWlsdXJlQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgaWYgKGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgIGFjdGl2YXRvci5mYWlsdXJlQ29udmVydGVyID0gY3VzdG9tRmFpbHVyZUNvbnZlcnRlcjtcbiAgfVxuXG4gIGNvbnN0IHsgaW1wb3J0V29ya2Zsb3dzLCBpbXBvcnRJbnRlcmNlcHRvcnMgfSA9IGdsb2JhbC5fX1RFTVBPUkFMX187XG4gIGlmIChpbXBvcnRXb3JrZmxvd3MgPT09IHVuZGVmaW5lZCB8fCBpbXBvcnRJbnRlcmNlcHRvcnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgYnVuZGxlIGRpZCBub3QgcmVnaXN0ZXIgaW1wb3J0IGhvb2tzJyk7XG4gIH1cblxuICBjb25zdCBpbnRlcmNlcHRvcnMgPSBpbXBvcnRJbnRlcmNlcHRvcnMoKTtcbiAgZm9yIChjb25zdCBtb2Qgb2YgaW50ZXJjZXB0b3JzKSB7XG4gICAgY29uc3QgZmFjdG9yeTogV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5ID0gbW9kLmludGVyY2VwdG9ycztcbiAgICBpZiAoZmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3dzIGludGVyY2VwdG9yczogZXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IGdvdDogJyR7ZmFjdG9yeX0nYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBmYWN0b3J5KCk7XG4gICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmluYm91bmQucHVzaCguLi4oaW50ZXJjZXB0b3JzLmluYm91bmQgPz8gW10pKTtcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQucHVzaCguLi4oaW50ZXJjZXB0b3JzLm91dGJvdW5kID8/IFtdKSk7XG4gICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscy5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW50ZXJuYWxzID8/IFtdKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbW9kID0gaW1wb3J0V29ya2Zsb3dzKCk7XG4gIGNvbnN0IHdvcmtmbG93Rm4gPSBtb2RbYWN0aXZhdG9yLmluZm8ud29ya2Zsb3dUeXBlXTtcbiAgY29uc3QgZGVmYXVsdFdvcmtmbG93Rm4gPSBtb2RbJ2RlZmF1bHQnXTtcblxuICBpZiAodHlwZW9mIHdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBhY3RpdmF0b3Iud29ya2Zsb3cgPSB3b3JrZmxvd0ZuO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZhdWx0V29ya2Zsb3dGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IGRlZmF1bHRXb3JrZmxvd0ZuO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRldGFpbHMgPVxuICAgICAgd29ya2Zsb3dGbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gJ25vIHN1Y2ggZnVuY3Rpb24gaXMgZXhwb3J0ZWQgYnkgdGhlIHdvcmtmbG93IGJ1bmRsZSdcbiAgICAgICAgOiBgZXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IGdvdDogJyR7dHlwZW9mIHdvcmtmbG93Rm59J2A7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3cgb2YgdHlwZSAnJHthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGV9JzogJHtkZXRhaWxzfWApO1xuICB9XG59XG5cbi8qKlxuICogT2JqZWN0cyB0cmFuc2ZlcmVkIHRvIHRoZSBWTSBmcm9tIG91dHNpZGUgaGF2ZSBwcm90b3R5cGVzIGJlbG9uZ2luZyB0byB0aGVcbiAqIG91dGVyIGNvbnRleHQsIHdoaWNoIG1lYW5zIHRoYXQgaW5zdGFuY2VvZiB3b24ndCB3b3JrIGluc2lkZSB0aGUgVk0uIFRoaXNcbiAqIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHdhbGtzIG92ZXIgdGhlIGNvbnRlbnQgb2YgYW4gb2JqZWN0LCBhbmQgcmVjcmVhdGUgc29tZVxuICogb2YgdGhlc2Ugb2JqZWN0cyAobm90YWJseSBBcnJheSwgRGF0ZSBhbmQgT2JqZWN0cykuXG4gKi9cbmZ1bmN0aW9uIGZpeFByb3RvdHlwZXM8WD4ob2JqOiBYKTogWCB7XG4gIGlmIChvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik/LmNvbnN0cnVjdG9yPy5uYW1lKSB7XG4gICAgICBjYXNlICdBcnJheSc6XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKChvYmogYXMgQXJyYXk8dW5rbm93bj4pLm1hcChmaXhQcm90b3R5cGVzKSkgYXMgWDtcbiAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICByZXR1cm4gbmV3IERhdGUob2JqIGFzIHVua25vd24gYXMgRGF0ZSkgYXMgWDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoKFtrLCB2XSk6IFtzdHJpbmcsIGFueV0gPT4gW2ssIGZpeFByb3RvdHlwZXModildKSkgYXMgWDtcbiAgICB9XG4gIH0gZWxzZSByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHdvcmtmbG93LiBPciB0byBiZSBleGFjdCwgX2NvbXBsZXRlXyBpbml0aWFsaXphdGlvbiwgYXMgbW9zdCBwYXJ0IGhhcyBiZWVuIGRvbmUgaW4gY29uc3RydWN0b3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZShpbml0aWFsaXplV29ya2Zsb3dKb2I6IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JSW5pdGlhbGl6ZVdvcmtmbG93KTogdm9pZCB7XG4gIGdldEFjdGl2YXRvcigpLmluaXRpYWxpemVXb3JrZmxvdyhpbml0aWFsaXplV29ya2Zsb3dKb2IpO1xufVxuXG4vKipcbiAqIFJ1biBhIGNodW5rIG9mIGFjdGl2YXRpb24gam9ic1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb24sIGJhdGNoSW5kZXggPSAwKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCBpbnRlcmNlcHQgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW50ZXJuYWxzLCAnYWN0aXZhdGUnLCAoeyBhY3RpdmF0aW9uIH0pID0+IHtcbiAgICAvLyBDYXN0IGZyb20gdGhlIGludGVyZmFjZSB0byB0aGUgY2xhc3Mgd2hpY2ggaGFzIHRoZSBgdmFyaWFudGAgYXR0cmlidXRlLlxuICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBhY3RpdmF0aW9uIGlzIGEgcHJvdG8gY2xhc3MuXG4gICAgY29uc3Qgam9icyA9IGFjdGl2YXRpb24uam9icyBhcyBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iW107XG5cbiAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHksIGJ1dCB3ZSBtaWdodCBzdGlsbCBuZWVkIHRvIHN0YXJ0IHRoZSB3b3JrZmxvdyBmdW5jdGlvblxuICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dKb2IgPSBqb2JzWzBdLnZhcmlhbnQgPT09ICdpbml0aWFsaXplV29ya2Zsb3cnID8gam9icy5zaGlmdCgpPy5pbml0aWFsaXplV29ya2Zsb3cgOiB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICBpZiAoam9iLnZhcmlhbnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgam9iLnZhcmlhbnQgdG8gYmUgZGVmaW5lZCcpO1xuXG4gICAgICBjb25zdCB2YXJpYW50ID0gam9iW2pvYi52YXJpYW50XTtcbiAgICAgIGlmICghdmFyaWFudCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgam9iLiR7am9iLnZhcmlhbnR9IHRvIGJlIHNldGApO1xuXG4gICAgICBhY3RpdmF0b3Jbam9iLnZhcmlhbnRdKHZhcmlhbnQgYXMgYW55IC8qIFRTIGNhbid0IGluZmVyIHRoaXMgdHlwZSAqLyk7XG5cbiAgICAgIGlmIChqb2IudmFyaWFudCAhPT0gJ3F1ZXJ5V29ya2Zsb3cnKSB0cnlVbmJsb2NrQ29uZGl0aW9ucygpO1xuICAgIH1cblxuICAgIGlmIChzdGFydFdvcmtmbG93Sm9iKSB7XG4gICAgICBjb25zdCBzYWZlSm9iVHlwZXM6IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbJ3ZhcmlhbnQnXVtdID0gW1xuICAgICAgICAnaW5pdGlhbGl6ZVdvcmtmbG93JyxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgJ2RvVXBkYXRlJyxcbiAgICAgICAgJ2NhbmNlbFdvcmtmbG93JyxcbiAgICAgICAgJ3VwZGF0ZVJhbmRvbVNlZWQnLFxuICAgICAgXTtcbiAgICAgIGlmIChqb2JzLnNvbWUoKGpvYikgPT4gIXNhZmVKb2JUeXBlcy5pbmNsdWRlcyhqb2IudmFyaWFudCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1JlY2VpdmVkIGJvdGggaW5pdGlhbGl6ZVdvcmtmbG93IGFuZCBub24tc2lnbmFsL25vbi11cGRhdGUgam9icyBpbiB0aGUgc2FtZSBhY3RpdmF0aW9uOiAnICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGpvYnMubWFwKChqb2IpID0+IGpvYi52YXJpYW50KSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYWN0aXZhdG9yLnN0YXJ0V29ya2Zsb3coc3RhcnRXb3JrZmxvd0pvYik7XG4gICAgICB0cnlVbmJsb2NrQ29uZGl0aW9ucygpO1xuICAgIH1cbiAgfSk7XG4gIGludGVyY2VwdCh7IGFjdGl2YXRpb24sIGJhdGNoSW5kZXggfSk7XG59XG5cbi8qKlxuICogQ29uY2x1ZGUgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYWN0aXZhdGlvbiBqb2JzIGFuZCBxdWV1ZWQgbWljcm90YXNrcy5cbiAqXG4gKiBBY3RpdmF0aW9uIGZhaWx1cmVzIGFyZSBoYW5kbGVkIGluIHRoZSBtYWluIE5vZGUuanMgaXNvbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBjb3Jlc2RrLndvcmtmbG93X2NvbXBsZXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJlamVjdEJ1ZmZlcmVkVXBkYXRlcygpO1xuICBjb25zdCBpbnRlcmNlcHQgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW50ZXJuYWxzLCAnY29uY2x1ZGVBY3RpdmF0aW9uJywgKGlucHV0KSA9PiBpbnB1dCk7XG4gIGNvbnN0IGFjdGl2YXRpb25Db21wbGV0aW9uID0gYWN0aXZhdG9yLmNvbmNsdWRlQWN0aXZhdGlvbigpO1xuICBjb25zdCB7IGNvbW1hbmRzIH0gPSBpbnRlcmNlcHQoeyBjb21tYW5kczogYWN0aXZhdGlvbkNvbXBsZXRpb24uY29tbWFuZHMgfSk7XG4gIGlmIChhY3RpdmF0b3IuY29tcGxldGVkKSB7XG4gICAgYWN0aXZhdG9yLndhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBydW5JZDogYWN0aXZhdG9yLmluZm8ucnVuSWQsXG4gICAgc3VjY2Vzc2Z1bDogeyAuLi5hY3RpdmF0aW9uQ29tcGxldGlvbiwgY29tbWFuZHMgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMb29wIHRocm91Z2ggYWxsIGJsb2NrZWQgY29uZGl0aW9ucywgZXZhbHVhdGUgYW5kIHVuYmxvY2sgaWYgcG9zc2libGUuXG4gKlxuICogQHJldHVybnMgbnVtYmVyIG9mIHVuYmxvY2tlZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTogbnVtYmVyIHtcbiAgbGV0IG51bVVuYmxvY2tlZCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBwcmV2VW5ibG9ja2VkID0gbnVtVW5ibG9ja2VkO1xuICAgIGZvciAoY29uc3QgW3NlcSwgY29uZF0gb2YgZ2V0QWN0aXZhdG9yKCkuYmxvY2tlZENvbmRpdGlvbnMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY29uZC5mbigpKSB7XG4gICAgICAgIGNvbmQucmVzb2x2ZSgpO1xuICAgICAgICBudW1VbmJsb2NrZWQrKztcbiAgICAgICAgLy8gSXQgaXMgc2FmZSB0byBkZWxldGUgZWxlbWVudHMgZHVyaW5nIG1hcCBpdGVyYXRpb25cbiAgICAgICAgZ2V0QWN0aXZhdG9yKCkuYmxvY2tlZENvbmRpdGlvbnMuZGVsZXRlKHNlcSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2VW5ibG9ja2VkID09PSBudW1VbmJsb2NrZWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVtVW5ibG9ja2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZSgpOiB2b2lkIHtcbiAgY29uc3QgZGlzcG9zZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoZ2V0QWN0aXZhdG9yKCkuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2Rpc3Bvc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgZGlzYWJsZVN0b3JhZ2UoKTtcbiAgICBkaXNhYmxlVXBkYXRlU3RvcmFnZSgpO1xuICB9KTtcbiAgZGlzcG9zZSh7fSk7XG59XG4iLCJpbXBvcnQge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIGNvbXBpbGVSZXRyeVBvbGljeSxcbiAgZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICBlbmNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIGV4dHJhY3RXb3JrZmxvd1R5cGUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgbWFwVG9QYXlsb2FkcyxcbiAgUXVlcnlEZWZpbml0aW9uLFxuICBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyLFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICB0b1BheWxvYWRzLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgV2l0aFdvcmtmbG93QXJncyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdmVyc2lvbmluZy1pbnRlbnQtZW51bSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9UcywgcmVxdWlyZWRUc1RvTXMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUsIHJlZ2lzdGVyU2xlZXBJbXBsZW1lbnRhdGlvbiB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IFVwZGF0ZVNjb3BlIH0gZnJvbSAnLi91cGRhdGUtc2NvcGUnO1xuaW1wb3J0IHtcbiAgQWN0aXZpdHlJbnB1dCxcbiAgTG9jYWxBY3Rpdml0eUlucHV0LFxuICBTaWduYWxXb3JrZmxvd0lucHV0LFxuICBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25JbnB1dCxcbiAgVGltZXJJbnB1dCxcbn0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zLFxuICBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgQ29udGludWVBc05ldyxcbiAgQ29udGludWVBc05ld09wdGlvbnMsXG4gIERlZmF1bHRTaWduYWxIYW5kbGVyLFxuICBFbmhhbmNlZFN0YWNrVHJhY2UsXG4gIEhhbmRsZXIsXG4gIFF1ZXJ5SGFuZGxlck9wdGlvbnMsXG4gIFNpZ25hbEhhbmRsZXJPcHRpb25zLFxuICBVcGRhdGVIYW5kbGVyT3B0aW9ucyxcbiAgV29ya2Zsb3dJbmZvLFxuICBVcGRhdGVJbmZvLFxuICBlbmNvZGVDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgZW5jb2RlUGFyZW50Q2xvc2VQb2xpY3ksXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMb2NhbEFjdGl2aXR5RG9CYWNrb2ZmIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQsIGdldEFjdGl2YXRvciwgbWF5YmVHZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuLyoqXG4gKiBBZGRzIGRlZmF1bHQgdmFsdWVzIG9mIGB3b3JrZmxvd0lkYCBhbmQgYGNhbmNlbGxhdGlvblR5cGVgIHRvIGdpdmVuIHdvcmtmbG93IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdHM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyB7XG4gIGNvbnN0IHsgYXJncywgd29ya2Zsb3dJZCwgLi4ucmVzdCB9ID0gb3B0cztcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkOiB3b3JrZmxvd0lkID8/IHV1aWQ0KCksXG4gICAgYXJnczogKGFyZ3MgPz8gW10pIGFzIHVua25vd25bXSxcbiAgICBjYW5jZWxsYXRpb25UeXBlOiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc3RhcnRUaW1lciBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuZnVuY3Rpb24gdGltZXJOZXh0SGFuZGxlcihpbnB1dDogVGltZXJJbnB1dCkge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLmRlbGV0ZShpbnB1dC5zZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICBjYW5jZWxUaW1lcjoge1xuICAgICAgICAgICAgICBzZXE6IGlucHV0LnNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICBzZXE6IGlucHV0LnNlcSxcbiAgICAgICAgc3RhcnRUb0ZpcmVUaW1lb3V0OiBtc1RvVHMoaW5wdXQuZHVyYXRpb25NcyksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoaW5wdXQuc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXMgc2xlZXAuXG4gKlxuICogU2NoZWR1bGVzIGEgdGltZXIgb24gdGhlIFRlbXBvcmFsIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyIG9yIDAsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogRHVyYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNsZWVwKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJyk7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuXG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBNYXRoLm1heCgxLCBtc1RvTnVtYmVyKG1zKSk7XG5cbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ3N0YXJ0VGltZXInLCB0aW1lck5leHRIYW5kbGVyKTtcblxuICByZXR1cm4gZXhlY3V0ZSh7XG4gICAgZHVyYXRpb25NcyxcbiAgICBzZXEsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKG9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dCA9PT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuc3RhcnRUb0Nsb3NlVGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWlyZWQgZWl0aGVyIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgb3Igc3RhcnRUb0Nsb3NlVGltZW91dCcpO1xuICB9XG59XG5cbi8vIFVzZSBzYW1lIHZhbGlkYXRpb24gd2UgdXNlIGZvciBub3JtYWwgYWN0aXZpdGllc1xuY29uc3QgdmFsaWRhdGVMb2NhbEFjdGl2aXR5T3B0aW9ucyA9IHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zO1xuXG4vKipcbiAqIFB1c2ggYSBzY2hlZHVsZUFjdGl2aXR5IGNvbW1hbmQgaW50byBhY3RpdmF0b3IgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuZnVuY3Rpb24gc2NoZWR1bGVBY3Rpdml0eU5leHRIYW5kbGVyKHsgb3B0aW9ucywgYXJncywgaGVhZGVycywgc2VxLCBhY3Rpdml0eVR5cGUgfTogQWN0aXZpdHlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5oYXMoc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IHJlc29sdmVkIG9yIG5ldmVyIHNjaGVkdWxlZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgcmVxdWVzdENhbmNlbEFjdGl2aXR5OiB7XG4gICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2NoZWR1bGVBY3Rpdml0eToge1xuICAgICAgICBzZXEsXG4gICAgICAgIGFjdGl2aXR5SWQ6IG9wdGlvbnMuYWN0aXZpdHlJZCA/PyBgJHtzZXF9YCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLmFyZ3MpLFxuICAgICAgICByZXRyeVBvbGljeTogb3B0aW9ucy5yZXRyeSA/IGNvbXBpbGVSZXRyeVBvbGljeShvcHRpb25zLnJldHJ5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdGFza1F1ZXVlOiBvcHRpb25zLnRhc2tRdWV1ZSB8fCBhY3RpdmF0b3IuaW5mby50YXNrUXVldWUsXG4gICAgICAgIGhlYXJ0YmVhdFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc3RhcnRUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgICBkb05vdEVhZ2VybHlFeGVjdXRlOiAhKG9wdGlvbnMuYWxsb3dFYWdlckRpc3BhdGNoID8/IHRydWUpLFxuICAgICAgICB2ZXJzaW9uaW5nSW50ZW50OiB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byhvcHRpb25zLnZlcnNpb25pbmdJbnRlbnQpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUHVzaCBhIHNjaGVkdWxlQWN0aXZpdHkgY29tbWFuZCBpbnRvIHN0YXRlIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyKHtcbiAgb3B0aW9ucyxcbiAgYXJncyxcbiAgaGVhZGVycyxcbiAgc2VxLFxuICBhY3Rpdml0eVR5cGUsXG4gIGF0dGVtcHQsXG4gIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxufTogTG9jYWxBY3Rpdml0eUlucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAvLyBFYWdlcmx5IGZhaWwgdGhlIGxvY2FsIGFjdGl2aXR5ICh3aGljaCB3aWxsIGluIHR1cm4gZmFpbCB0aGUgd29ya2Zsb3cgdGFzay5cbiAgLy8gRG8gbm90IGZhaWwgb24gcmVwbGF5IHdoZXJlIHRoZSBsb2NhbCBhY3Rpdml0aWVzIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBvbiB0aGUgcmVwbGF5IHdvcmtlci5cbiAgaWYgKCFhY3RpdmF0b3IuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcgJiYgIWFjdGl2YXRvci5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcy5oYXMoYWN0aXZpdHlUeXBlKSkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgTG9jYWwgYWN0aXZpdHkgb2YgdHlwZSAnJHthY3Rpdml0eVR5cGV9JyBub3QgcmVnaXN0ZXJlZCBvbiB3b3JrZXJgKTtcbiAgfVxuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5oYXMoc2VxKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IHJlc29sdmVkIG9yIG5ldmVyIHNjaGVkdWxlZFxuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgICAgcmVxdWVzdENhbmNlbExvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZUxvY2FsQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBvcmlnaW5hbFNjaGVkdWxlVGltZSxcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBub3QgZXhwb3NpbmcgYWN0aXZpdHlJZCBhcyBhbiBvcHRpb25cbiAgICAgICAgYWN0aXZpdHlJZDogYCR7c2VxfWAsXG4gICAgICAgIGFjdGl2aXR5VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc2NoZWR1bGVUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc3RhcnRUb0Nsb3NlVGltZW91dCksXG4gICAgICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMuc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIGxvY2FsUmV0cnlUaHJlc2hvbGQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMubG9jYWxSZXRyeVRocmVzaG9sZCksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZShvcHRpb25zLmNhbmNlbGxhdGlvblR5cGUpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGUgPSAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNoaWxkV29ya2Zsb3dDb21wbGV0ZS5oYXMoc2VxKTtcblxuICAgICAgICAgIGlmICghY29tcGxldGUpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGNhbmNlbENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHsgY2hpbGRXb3JrZmxvd1NlcTogc2VxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgd29ya2Zsb3dJZCxcbiAgICAgICAgd29ya2Zsb3dUeXBlLFxuICAgICAgICBpbnB1dDogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4ub3B0aW9ucy5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLCAvLyBOb3QgY29uZmlndXJhYmxlXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIHdvcmtmbG93SWRSZXVzZVBvbGljeTogZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5KG9wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5KSxcbiAgICAgICAgcGFyZW50Q2xvc2VQb2xpY3k6IGVuY29kZVBhcmVudENsb3NlUG9saWN5KG9wdGlvbnMucGFyZW50Q2xvc2VQb2xpY3kpLFxuICAgICAgICBjcm9uU2NoZWR1bGU6IG9wdGlvbnMuY3JvblNjaGVkdWxlLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICA/IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBtZW1vOiBvcHRpb25zLm1lbW8gJiYgbWFwVG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5tZW1vKSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNoaWxkV29ya2Zsb3dTdGFydC5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBXZSBjb25zdHJ1Y3QgYSBQcm9taXNlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY2hpbGQgV29ya2Zsb3cgYmVmb3JlIHdlIGtub3dcbiAgLy8gaWYgdGhlIFdvcmtmbG93IGNvZGUgd2lsbCBhd2FpdCBpdCB0byBjYXB0dXJlIHRoZSByZXN1bHQgaW4gY2FzZSBpdCBkb2VzLlxuICBjb25zdCBjb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQ2hhaW4gc3RhcnQgUHJvbWlzZSByZWplY3Rpb24gdG8gdGhlIGNvbXBsZXRlIFByb21pc2UuXG4gICAgdW50cmFja1Byb21pc2Uoc3RhcnRQcm9taXNlLmNhdGNoKHJlamVjdCkpO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93Q29tcGxldGUuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG4gIHVudHJhY2tQcm9taXNlKHN0YXJ0UHJvbWlzZSk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZSk7XG4gIC8vIFByZXZlbnQgdW5oYW5kbGVkIHJlamVjdGlvbiBiZWNhdXNlIHRoZSBjb21wbGV0aW9uIG1pZ2h0IG5vdCBiZSBhd2FpdGVkXG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgY29uc3QgcmV0ID0gbmV3IFByb21pc2U8W1Byb21pc2U8c3RyaW5nPiwgUHJvbWlzZTx1bmtub3duPl0+KChyZXNvbHZlKSA9PiByZXNvbHZlKFtzdGFydFByb21pc2UsIGNvbXBsZXRlUHJvbWlzZV0pKTtcbiAgdW50cmFja1Byb21pc2UocmV0KTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlcih7IHNlcSwgc2lnbmFsTmFtZSwgYXJncywgdGFyZ2V0LCBoZWFkZXJzIH06IFNpZ25hbFdvcmtmbG93SW5wdXQpIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHsgY2FuY2VsU2lnbmFsV29ya2Zsb3c6IHsgc2VxIH0gfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc2lnbmFsRXh0ZXJuYWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIGFyZ3M6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLmFyZ3MpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBzaWduYWxOYW1lLFxuICAgICAgICAuLi4odGFyZ2V0LnR5cGUgPT09ICdleHRlcm5hbCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IGFjdGl2YXRvci5pbmZvLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICAuLi50YXJnZXQud29ya2Zsb3dFeGVjdXRpb24sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGNoaWxkV29ya2Zsb3dJZDogdGFyZ2V0LmNoaWxkV29ya2Zsb3dJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5zaWduYWxXb3JrZmxvdy5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU3ltYm9sIHVzZWQgaW4gdGhlIHJldHVybiB0eXBlIG9mIHByb3h5IG1ldGhvZHMgdG8gbWFyayB0aGF0IGFuIGF0dHJpYnV0ZSBvbiB0aGUgc291cmNlIHR5cGUgaXMgbm90IGEgbWV0aG9kLlxuICpcbiAqIEBzZWUge0BsaW5rIEFjdGl2aXR5SW50ZXJmYWNlRm9yfVxuICogQHNlZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfVxuICogQHNlZSB7QGxpbmsgcHJveHlMb2NhbEFjdGl2aXRpZXN9XG4gKi9cbmV4cG9ydCBjb25zdCBOb3RBbkFjdGl2aXR5TWV0aG9kID0gU3ltYm9sLmZvcignX19URU1QT1JBTF9OT1RfQU5fQUNUSVZJVFlfTUVUSE9EJyk7XG5cbi8qKlxuICogVHlwZSBoZWxwZXIgdGhhdCB0YWtlcyBhIHR5cGUgYFRgIGFuZCB0cmFuc2Zvcm1zIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IHtAbGluayBBY3Rpdml0eUZ1bmN0aW9ufSB0b1xuICoge0BsaW5rIE5vdEFuQWN0aXZpdHlNZXRob2R9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogVXNlZCBieSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBnZXQgdGhpcyBjb21waWxlLXRpbWUgZXJyb3I6XG4gKlxuICogYGBgdHNcbiAqIGludGVyZmFjZSBNeUFjdGl2aXRpZXMge1xuICogICB2YWxpZChpbnB1dDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+O1xuICogICBpbnZhbGlkKGlucHV0OiBudW1iZXIpOiBudW1iZXI7XG4gKiB9XG4gKlxuICogY29uc3QgYWN0ID0gcHJveHlBY3Rpdml0aWVzPE15QWN0aXZpdGllcz4oeyBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnNW0nIH0pO1xuICpcbiAqIGF3YWl0IGFjdC52YWxpZCh0cnVlKTtcbiAqIGF3YWl0IGFjdC5pbnZhbGlkKCk7XG4gKiAvLyBeIFRTIGNvbXBsYWlucyB3aXRoOlxuICogLy8gKHByb3BlcnR5KSBpbnZhbGlkRGVmaW5pdGlvbjogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2RcbiAqIC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBub3QgY2FsbGFibGUuXG4gKiAvLyBUeXBlICdTeW1ib2wnIGhhcyBubyBjYWxsIHNpZ25hdHVyZXMuKDIzNDkpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IFRbS10gOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZDtcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBBY3Rpdml0eU9wdGlvbnN9LlxuICpcbiAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gc2V0dXAgQWN0aXZpdGllcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkgfCBQcm94eX0gZm9yXG4gKiAgICAgICAgIHdoaWNoIGVhY2ggYXR0cmlidXRlIGlzIGEgY2FsbGFibGUgQWN0aXZpdHkgZnVuY3Rpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSAnLi4vYWN0aXZpdGllcyc7XG4gKlxuICogLy8gU2V0dXAgQWN0aXZpdGllcyBmcm9tIG1vZHVsZSBleHBvcnRzXG4gKiBjb25zdCB7IGh0dHBHZXQsIG90aGVyQWN0aXZpdHkgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oe1xuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMzAgbWludXRlcycsXG4gKiB9KTtcbiAqXG4gKiAvLyBTZXR1cCBBY3Rpdml0aWVzIGZyb20gYW4gZXhwbGljaXQgaW50ZXJmYWNlIChlLmcuIHdoZW4gZGVmaW5lZCBieSBhbm90aGVyIFNESylcbiAqIGludGVyZmFjZSBKYXZhQWN0aXZpdGllcyB7XG4gKiAgIGh0dHBHZXRGcm9tSmF2YSh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPlxuICogICBzb21lT3RoZXJKYXZhQWN0aXZpdHkoYXJnMTogbnVtYmVyLCBhcmcyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gKiB9XG4gKlxuICogY29uc3Qge1xuICogICBodHRwR2V0RnJvbUphdmEsXG4gKiAgIHNvbWVPdGhlckphdmFBY3Rpdml0eVxuICogfSA9IHByb3h5QWN0aXZpdGllczxKYXZhQWN0aXZpdGllcz4oe1xuICogICB0YXNrUXVldWU6ICdqYXZhLXdvcmtlci10YXNrUXVldWUnLFxuICogICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnNW0nLFxuICogfSk7XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cEdldChcImh0dHA6Ly9leGFtcGxlLmNvbVwiKTtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3h5QWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFByb3h5KFxuICAgIHt9LFxuICAgIHtcbiAgICAgIGdldChfLCBhY3Rpdml0eVR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT25seSBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIEFjdGl2aXR5IHR5cGVzLCBnb3Q6ICR7U3RyaW5nKGFjdGl2aXR5VHlwZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFjdGl2aXR5UHJveHlGdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgICByZXR1cm4gc2NoZWR1bGVBY3Rpdml0eShhY3Rpdml0eVR5cGUsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9XG4gICkgYXMgYW55O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSBMb2NhbCBBY3Rpdml0eSBmdW5jdGlvbnMgd2l0aCBnaXZlbiB7QGxpbmsgTG9jYWxBY3Rpdml0eU9wdGlvbnN9LlxuICpcbiAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gc2V0dXAgQWN0aXZpdGllcyB3aXRoIGRpZmZlcmVudCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4gYSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkgfCBQcm94eX1cbiAqICAgICAgICAgZm9yIHdoaWNoIGVhY2ggYXR0cmlidXRlIGlzIGEgY2FsbGFibGUgQWN0aXZpdHkgZnVuY3Rpb25cbiAqXG4gKiBAc2VlIHtAbGluayBwcm94eUFjdGl2aXRpZXN9IGZvciBleGFtcGxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJveHlMb2NhbEFjdGl2aXRpZXM8QSA9IFVudHlwZWRBY3Rpdml0aWVzPihvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucyk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+IHtcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIGltbWVkaWF0ZSB1c2VyIGZlZWRiYWNrXG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAge30sXG4gICAge1xuICAgICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGl2aXR5VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgQWN0aXZpdHkgdHlwZXMsIGdvdDogJHtTdHJpbmcoYWN0aXZpdHlUeXBlKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgICAgcmV0dXJuIHNjaGVkdWxlTG9jYWxBY3Rpdml0eShhY3Rpdml0eVR5cGUsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9XG4gICkgYXMgYW55O1xufVxuXG4vLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBwYXRjaCBhZnRlciBcImVub3VnaFwiIHRpbWUgaGFzIHBhc3NlZFxuY29uc3QgRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIID0gJ19fdGVtcG9yYWxfaW50ZXJuYWxfY29ubmVjdF9leHRlcm5hbF9oYW5kbGVfY2FuY2VsX3RvX3Njb3BlJztcbi8vIFRoZSBuYW1lIG9mIHRoaXMgcGF0Y2ggY29tZXMgZnJvbSBhbiBhdHRlbXB0IHRvIGJ1aWxkIGEgZ2VuZXJpYyBpbnRlcm5hbCBwYXRjaGluZyBtZWNoYW5pc20uXG4vLyBUaGF0IGVmZm9ydCBoYXMgYmVlbiBhYmFuZG9uZWQgaW4gZmF2b3Igb2YgYSBuZXdlciBXb3JrZmxvd1Rhc2tDb21wbGV0ZWRNZXRhZGF0YSBiYXNlZCBtZWNoYW5pc20uXG5jb25zdCBDT05ESVRJT05fMF9QQVRDSCA9ICdfX3Nka19pbnRlcm5hbF9wYXRjaF9udW1iZXI6MSc7XG5cbi8qKlxuICogUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBhbmQgY2FuY2VsIGFuIGV4aXN0aW5nIFdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqIEl0IHRha2VzIGEgV29ya2Zsb3cgSUQgYW5kIG9wdGlvbmFsIHJ1biBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsV29ya2Zsb3dIYW5kbGUod29ya2Zsb3dJZDogc3RyaW5nLCBydW5JZD86IHN0cmluZyk6IEV4dGVybmFsV29ya2Zsb3dIYW5kbGUge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4gQ29uc2lkZXIgdXNpbmcgQ2xpZW50LndvcmtmbG93LmdldEhhbmRsZSguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkLFxuICAgIHJ1bklkLFxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIENvbm5lY3QgdGhpcyBjYW5jZWwgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiBzY29wZS5cbiAgICAgICAgLy8gVGhpcyBpcyBiZWhhdmlvciB3YXMgaW50cm9kdWNlZCBhZnRlciB2MC4yMi4wIGFuZCBpcyBpbmNvbXBhdGlibGVcbiAgICAgICAgLy8gd2l0aCBoaXN0b3JpZXMgZ2VuZXJhdGVkIHdpdGggcHJldmlvdXMgU0RLIHZlcnNpb25zIGFuZCB0aHVzIHJlcXVpcmVzXG4gICAgICAgIC8vIHBhdGNoaW5nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSB0cnkgdG8gZGVsYXkgcGF0Y2hpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBhdm9pZCBwb2xsdXRpbmdcbiAgICAgICAgLy8gaGlzdG9yaWVzIHVubGVzcyBzdHJpY3RseSByZXF1aXJlZC5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHBhdGNoZWQoRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmNhbmNlbFdvcmtmbG93Kys7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgcmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jYW5jZWxXb3JrZmxvdy5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdleHRlcm5hbCcsXG4gICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHsgd29ya2Zsb3dJZCwgcnVuSWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqICoqT3ZlcnJpZGUgZm9yIFdvcmtmbG93cyB0aGF0IGFjY2VwdCBubyBhcmd1bWVudHMqKi5cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd1R5cGU6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoZSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGFueT4+KHdvcmtmbG93RnVuYzogVCk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnN0YXJ0Q2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5zdGFydCguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IGFkZERlZmF1bHRXb3JrZmxvd09wdGlvbnMob3B0aW9ucyA/PyAoe30gYXMgYW55KSk7XG4gIGNvbnN0IHdvcmtmbG93VHlwZSA9IGV4dHJhY3RXb3JrZmxvd1R5cGUod29ya2Zsb3dUeXBlT3JGdW5jKTtcbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJyxcbiAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlclxuICApO1xuICBjb25zdCBbc3RhcnRlZCwgY29tcGxldGVkXSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLmNoaWxkV29ya2Zsb3crKyxcbiAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIHdvcmtmbG93VHlwZSxcbiAgfSk7XG4gIGNvbnN0IGZpcnN0RXhlY3V0aW9uUnVuSWQgPSBhd2FpdCBzdGFydGVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgIGZpcnN0RXhlY3V0aW9uUnVuSWQsXG4gICAgYXN5bmMgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNvbXBsZXRlZCkgYXMgYW55O1xuICAgIH0sXG4gICAgYXN5bmMgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdjaGlsZCcsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiBvcHRpb25zV2l0aERlZmF1bHRzLndvcmtmbG93SWQsXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyAoKSA9PiBXb3JrZmxvd1JldHVyblR5cGU+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBULFxuICBvcHRpb25zPzogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5leGVjdXRlQ2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5leGVjdXRlKC4uLikgaW5zdGVhZC4nXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgZXhlY1Byb21pc2UgPSBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShleGVjUHJvbWlzZSk7XG4gIGNvbnN0IGNvbXBsZXRlZFByb21pc2UgPSBleGVjUHJvbWlzZS50aGVuKChbX3N0YXJ0ZWQsIGNvbXBsZXRlZF0pID0+IGNvbXBsZXRlZCk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlZFByb21pc2UpO1xuICByZXR1cm4gY29tcGxldGVkUHJvbWlzZSBhcyBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZyb3plbiBjb3B5IG9mIFdvcmtmbG93SW5mbywgYXQgdGhlIHBvaW50IHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAqIENoYW5nZXMgaGFwcGVuaW5nIGF0IGxhdGVyIHBvaW50IGluIHdvcmtmbG93IGV4ZWN1dGlvbiB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBGb3IgdGhpcyByZWFzb24sIHdlIHJlY29tbWVuZCBjYWxsaW5nIGB3b3JrZmxvd0luZm8oKWAgb24gZXZlcnkgYWNjZXNzIHRvIHtAbGluayBXb3JrZmxvd0luZm99J3MgZmllbGRzLFxuICogcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgYFdvcmtmbG93SW5mb2Agb2JqZWN0IChvciBwYXJ0IG9mIGl0KSBpbiBhIGxvY2FsIHZhcmlhYmxlLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogLy8gR09PRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgZG9Tb21ldGhpbmcod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZSh3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKlxuICogdnNcbiAqXG4gKiBgYGB0c1xuICogLy8gQkFEXG4gKiBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICBjb25zdCBhdHRyaWJ1dGVzID0gd29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlc1xuICogICBkb1NvbWV0aGluZyhhdHRyaWJ1dGVzKVxuICogICAuLi5cbiAqICAgZG9Tb21ldGhpbmdFbHNlKGF0dHJpYnV0ZXMpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93SW5mbygpOiBXb3JrZmxvd0luZm8ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dJbmZvKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmluZm87XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVwZGF0ZSBpZiBhbnkuXG4gKlxuICogQHJldHVybiBJbmZvIGZvciB0aGUgY3VycmVudCB1cGRhdGUgaGFuZGxlciB0aGUgY29kZSBjYWxsaW5nIHRoaXMgaXMgZXhlY3V0aW5nXG4gKiB3aXRoaW4gaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFVwZGF0ZUluZm8oKTogVXBkYXRlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5jdXJyZW50VXBkYXRlSW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIFVwZGF0ZVNjb3BlLmN1cnJlbnQoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNvZGUgaXMgZXhlY3V0aW5nIGluIHdvcmtmbG93IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluV29ya2Zsb3dDb250ZXh0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF5YmVHZXRBY3RpdmF0b3IoKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBgZmAgdGhhdCB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIENvbnRpbnVlQXNOZXcgd2hlbiBjYWxsZWQuXG4gKlxuICogYGZgIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgV29ya2Zsb3cgZnVuY3Rpb24gc3VwcGxpZWQgdG8gdHlwZXBhcmFtIGBGYC5cbiAqXG4gKiBPbmNlIGBmYCBpcyBjYWxsZWQsIFdvcmtmbG93IEV4ZWN1dGlvbiBpbW1lZGlhdGVseSBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29udGludWVBc05ld0Z1bmM8RiBleHRlbmRzIFdvcmtmbG93PihcbiAgb3B0aW9ucz86IENvbnRpbnVlQXNOZXdPcHRpb25zXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxGPikgPT4gUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuY29udGludWVBc05ldyguLi4pIGFuZCBXb3JrZmxvdy5tYWtlQ29udGludWVBc05ld0Z1bmMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBjb25zdCBpbmZvID0gYWN0aXZhdG9yLmluZm87XG4gIGNvbnN0IHsgd29ya2Zsb3dUeXBlLCB0YXNrUXVldWUsIC4uLnJlc3QgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJlcXVpcmVkT3B0aW9ucyA9IHtcbiAgICB3b3JrZmxvd1R5cGU6IHdvcmtmbG93VHlwZSA/PyBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB0YXNrUXVldWU6IHRhc2tRdWV1ZSA/PyBpbmZvLnRhc2tRdWV1ZSxcbiAgICAuLi5yZXN0LFxuICB9O1xuXG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICBjb25zdCBmbiA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2NvbnRpbnVlQXNOZXcnLCBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVhZGVycywgYXJncywgb3B0aW9ucyB9ID0gaW5wdXQ7XG4gICAgICB0aHJvdyBuZXcgQ29udGludWVBc05ldyh7XG4gICAgICAgIHdvcmtmbG93VHlwZTogb3B0aW9ucy53b3JrZmxvd1R5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4uYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUsXG4gICAgICAgIG1lbW86IG9wdGlvbnMubWVtbyAmJiBtYXBUb1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLm1lbW8pLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBvcHRpb25zLnNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgICAgICA/IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB3b3JrZmxvd1J1blRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dUYXNrVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy53b3JrZmxvd1Rhc2tUaW1lb3V0KSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBmbih7XG4gICAgICBhcmdzLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICBvcHRpb25zOiByZXF1aXJlZE9wdGlvbnMsXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICoge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9jb25jZXB0cy93aGF0LWlzLWNvbnRpbnVlLWFzLW5ldy8gfCBDb250aW51ZXMtQXMtTmV3fSB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb25cbiAqIHdpdGggZGVmYXVsdCBvcHRpb25zLlxuICpcbiAqIFNob3J0aGFuZCBmb3IgYG1ha2VDb250aW51ZUFzTmV3RnVuYzxGPigpKC4uLmFyZ3MpYC4gKFNlZToge0BsaW5rIG1ha2VDb250aW51ZUFzTmV3RnVuY30uKVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICpgYGB0c1xuICppbXBvcnQgeyBjb250aW51ZUFzTmV3IH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15V29ya2Zsb3cobjogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgLy8gLi4uIFdvcmtmbG93IGxvZ2ljXG4gKiAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICp9XG4gKmBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGludWVBc05ldzxGIGV4dGVuZHMgV29ya2Zsb3c+KC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pOiBQcm9taXNlPG5ldmVyPiB7XG4gIHJldHVybiBtYWtlQ29udGludWVBc05ld0Z1bmMoKSguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBSRkMgY29tcGxpYW50IFY0IHV1aWQuXG4gKiBVc2VzIHRoZSB3b3JrZmxvdydzIGRldGVybWluaXN0aWMgUFJORyBtYWtpbmcgaXQgc2FmZSBmb3IgdXNlIHdpdGhpbiBhIHdvcmtmbG93LlxuICogVGhpcyBmdW5jdGlvbiBpcyBjcnlwdG9ncmFwaGljYWxseSBpbnNlY3VyZS5cbiAqIFNlZSB0aGUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkIHwgc3RhY2tvdmVyZmxvdyBkaXNjdXNzaW9ufS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQ0KCk6IHN0cmluZyB7XG4gIC8vIFJldHVybiB0aGUgaGV4YWRlY2ltYWwgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBudW1iZXIgYG5gLCBwYWRkZWQgd2l0aCB6ZXJvZXMgdG8gYmUgb2YgbGVuZ3RoIGBwYFxuICBjb25zdCBobyA9IChuOiBudW1iZXIsIHA6IG51bWJlcikgPT4gbi50b1N0cmluZygxNikucGFkU3RhcnQocCwgJzAnKTtcbiAgLy8gQ3JlYXRlIGEgdmlldyBiYWNrZWQgYnkgYSAxNi1ieXRlIGJ1ZmZlclxuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxNikpO1xuICAvLyBGaWxsIGJ1ZmZlciB3aXRoIHJhbmRvbSB2YWx1ZXNcbiAgdmlldy5zZXRVaW50MzIoMCwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQzMig0LCAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDgsIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoMTIsIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgLy8gUGF0Y2ggdGhlIDZ0aCBieXRlIHRvIHJlZmxlY3QgYSB2ZXJzaW9uIDQgVVVJRFxuICB2aWV3LnNldFVpbnQ4KDYsICh2aWV3LmdldFVpbnQ4KDYpICYgMHhmKSB8IDB4NDApO1xuICAvLyBQYXRjaCB0aGUgOHRoIGJ5dGUgdG8gcmVmbGVjdCBhIHZhcmlhbnQgMSBVVUlEICh2ZXJzaW9uIDQgVVVJRHMgYXJlKVxuICB2aWV3LnNldFVpbnQ4KDgsICh2aWV3LmdldFVpbnQ4KDgpICYgMHgzZikgfCAweDgwKTtcbiAgLy8gQ29tcGlsZSB0aGUgY2Fub25pY2FsIHRleHR1YWwgZm9ybSBmcm9tIHRoZSBhcnJheSBkYXRhXG4gIHJldHVybiBgJHtobyh2aWV3LmdldFVpbnQzMigwKSwgOCl9LSR7aG8odmlldy5nZXRVaW50MTYoNCksIDQpfS0ke2hvKHZpZXcuZ2V0VWludDE2KDYpLCA0KX0tJHtobyhcbiAgICB2aWV3LmdldFVpbnQxNig4KSxcbiAgICA0XG4gICl9LSR7aG8odmlldy5nZXRVaW50MzIoMTApLCA4KX0ke2hvKHZpZXcuZ2V0VWludDE2KDE0KSwgNCl9YDtcbn1cblxuLyoqXG4gKiBQYXRjaCBvciB1cGdyYWRlIHdvcmtmbG93IGNvZGUgYnkgY2hlY2tpbmcgb3Igc3RhdGluZyB0aGF0IHRoaXMgd29ya2Zsb3cgaGFzIGEgY2VydGFpbiBwYXRjaC5cbiAqXG4gKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L3ZlcnNpb25pbmcgfCBkb2NzIHBhZ2V9IGZvciBpbmZvLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyByZXBsYXlpbmcgYW4gZXhpc3RpbmcgaGlzdG9yeSwgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGF0XG4gKiBoaXN0b3J5IHdhcyBwcm9kdWNlZCBieSBhIHdvcmtlciB3aGljaCBhbHNvIGhhZCBhIGBwYXRjaGVkYCBjYWxsIHdpdGggdGhlIHNhbWUgYHBhdGNoSWRgLlxuICogSWYgdGhlIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyICp3aXRob3V0KiBzdWNoIGEgY2FsbCwgdGhlbiBpdCB3aWxsIHJldHVybiBmYWxzZS5cbiAqXG4gKiBJZiB0aGUgd29ya2Zsb3cgaXMgbm90IGN1cnJlbnRseSByZXBsYXlpbmcsIHRoZW4gdGhpcyBjYWxsICphbHdheXMqIHJldHVybnMgdHJ1ZS5cbiAqXG4gKiBZb3VyIHdvcmtmbG93IGNvZGUgc2hvdWxkIHJ1biB0aGUgXCJuZXdcIiBjb2RlIGlmIHRoaXMgcmV0dXJucyB0cnVlLCBpZiBpdCByZXR1cm5zIGZhbHNlLCB5b3VcbiAqIHNob3VsZCBydW4gdGhlIFwib2xkXCIgY29kZS4gQnkgZG9pbmcgdGhpcywgeW91IGNhbiBtYWludGFpbiBkZXRlcm1pbmlzbS5cbiAqXG4gKiBAcGFyYW0gcGF0Y2hJZCBBbiBpZGVudGlmaWVyIHRoYXQgc2hvdWxkIGJlIHVuaXF1ZSB0byB0aGlzIHBhdGNoLiBJdCBpcyBPSyB0byB1c2UgbXVsdGlwbGVcbiAqIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQsIHdoaWNoIG1lYW5zIGFsbCBzdWNoIGNhbGxzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoZWQocGF0Y2hJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICByZXR1cm4gYWN0aXZhdG9yLnBhdGNoSW50ZXJuYWwocGF0Y2hJZCwgZmFsc2UpO1xufVxuXG4vKipcbiAqIEluZGljYXRlIHRoYXQgYSBwYXRjaCBpcyBiZWluZyBwaGFzZWQgb3V0LlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogV29ya2Zsb3dzIHdpdGggdGhpcyBjYWxsIG1heSBiZSBkZXBsb3llZCBhbG9uZ3NpZGUgd29ya2Zsb3dzIHdpdGggYSB7QGxpbmsgcGF0Y2hlZH0gY2FsbCwgYnV0XG4gKiB0aGV5IG11c3QgKm5vdCogYmUgZGVwbG95ZWQgd2hpbGUgYW55IHdvcmtlcnMgc3RpbGwgZXhpc3QgcnVubmluZyBvbGQgY29kZSB3aXRob3V0IGFcbiAqIHtAbGluayBwYXRjaGVkfSBjYWxsLCBvciBhbnkgcnVucyB3aXRoIGhpc3RvcmllcyBwcm9kdWNlZCBieSBzdWNoIHdvcmtlcnMgZXhpc3QuIElmIGVpdGhlciBraW5kXG4gKiBvZiB3b3JrZXIgZW5jb3VudGVycyBhIGhpc3RvcnkgcHJvZHVjZWQgYnkgdGhlIG90aGVyLCB0aGVpciBiZWhhdmlvciBpcyB1bmRlZmluZWQuXG4gKlxuICogT25jZSBhbGwgbGl2ZSB3b3JrZmxvdyBydW5zIGhhdmUgYmVlbiBwcm9kdWNlZCBieSB3b3JrZXJzIHdpdGggdGhpcyBjYWxsLCB5b3UgY2FuIGRlcGxveSB3b3JrZXJzXG4gKiB3aGljaCBhcmUgZnJlZSBvZiBlaXRoZXIga2luZCBvZiBwYXRjaCBjYWxsIGZvciB0aGlzIElELiBXb3JrZXJzIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBjYWxsXG4gKiBtYXkgY29leGlzdCwgYXMgbG9uZyBhcyB0aGV5IGFyZSBib3RoIHJ1bm5pbmcgdGhlIFwibmV3XCIgY29kZS5cbiAqXG4gKiBAcGFyYW0gcGF0Y2hJZCBBbiBpZGVudGlmaWVyIHRoYXQgc2hvdWxkIGJlIHVuaXF1ZSB0byB0aGlzIHBhdGNoLiBJdCBpcyBPSyB0byB1c2UgbXVsdGlwbGVcbiAqIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQsIHdoaWNoIG1lYW5zIGFsbCBzdWNoIGNhbGxzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcHJlY2F0ZVBhdGNoKHBhdGNoSWQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cucGF0Y2goLi4uKSBhbmQgV29ya2Zsb3cuZGVwcmVjYXRlUGF0Y2ggbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgYWN0aXZhdG9yLnBhdGNoSW50ZXJuYWwocGF0Y2hJZCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0KS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGlzIFdvcmtmbG93J3MgU2VhcmNoIEF0dHJpYnV0ZXMgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgYHNlYXJjaEF0dHJpYnV0ZXNgIHdpdGggdGhlIGV4aXN0aW5nIFNlYXJjaFxuICogQXR0cmlidXRlcywgYHdvcmtmbG93SW5mbygpLnNlYXJjaEF0dHJpYnV0ZXNgLlxuICpcbiAqIEZvciBleGFtcGxlLCB0aGlzIFdvcmtmbG93IGNvZGU6XG4gKlxuICogYGBgdHNcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoe1xuICogICBDdXN0b21JbnRGaWVsZDogWzFdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXVxuICogfSk7XG4gKiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKHtcbiAqICAgQ3VzdG9tSW50RmllbGQ6IFs0Ml0sXG4gKiAgIEN1c3RvbUtleXdvcmRGaWVsZDogWydkdXJhYmxlIGNvZGUnLCAnaXMgZ3JlYXQnXVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiB3b3VsZCByZXN1bHQgaW4gdGhlIFdvcmtmbG93IGhhdmluZyB0aGVzZSBTZWFyY2ggQXR0cmlidXRlczpcbiAqXG4gKiBgYGB0c1xuICoge1xuICogICBDdXN0b21JbnRGaWVsZDogWzQyXSxcbiAqICAgQ3VzdG9tQm9vbEZpZWxkOiBbdHJ1ZV0sXG4gKiAgIEN1c3RvbUtleXdvcmRGaWVsZDogWydkdXJhYmxlIGNvZGUnLCAnaXMgZ3JlYXQnXVxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHNlYXJjaEF0dHJpYnV0ZXMgVGhlIFJlY29yZCB0byBtZXJnZS4gVXNlIGEgdmFsdWUgb2YgYFtdYCB0byBjbGVhciBhIFNlYXJjaCBBdHRyaWJ1dGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRTZWFyY2hBdHRyaWJ1dGVzKHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXMpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuXG4gIGlmIChzZWFyY2hBdHRyaWJ1dGVzID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlYXJjaEF0dHJpYnV0ZXMgbXVzdCBiZSBhIG5vbi1udWxsIFNlYXJjaEF0dHJpYnV0ZXMnKTtcbiAgfVxuXG4gIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgdXBzZXJ0V29ya2Zsb3dTZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOiBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpLFxuICAgIH0sXG4gIH0pO1xuXG4gIGFjdGl2YXRvci5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm86IFdvcmtmbG93SW5mbyk6IFdvcmtmbG93SW5mbyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmluZm8sXG4gICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgIC4uLmluZm8uc2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLi4uc2VhcmNoQXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGlzIFdvcmtmbG93J3MgTWVtb3MgYnkgbWVyZ2luZyB0aGUgcHJvdmlkZWQgYG1lbW9gIHdpdGggZXhpc3RpbmdcbiAqIE1lbW9zIChhcyByZXR1cm5lZCBieSBgd29ya2Zsb3dJbmZvKCkubWVtb2ApLlxuICpcbiAqIE5ldyBtZW1vIGlzIG1lcmdlZCBieSByZXBsYWNpbmcgcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIF9hdCB0aGUgZmlyc3RcbiAqIGxldmVsIG9ubHlfLiBTZXR0aW5nIGEgcHJvcGVydHkgdG8gdmFsdWUgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGNsZWFycyB0aGF0XG4gKiBrZXkgZnJvbSB0aGUgTWVtby5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTE6IHZhbHVlIH1cbiAqICAga2V5NDogdmFsdWUsXG4gKiB9KTtcbiAqIHVwc2VydE1lbW8oe1xuICogICBrZXkyOiB2YWx1ZVxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH1cbiAqICAga2V5NDogdW5kZWZpbmVkLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiB3b3VsZCByZXN1bHQgaW4gdGhlIFdvcmtmbG93IGhhdmluZyB0aGVzZSBNZW1vOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIGtleTE6IHZhbHVlLFxuICogICBrZXkyOiB2YWx1ZSxcbiAqICAga2V5MzogeyBzdWJrZXkyOiB2YWx1ZSB9ICAvLyBOb3RlIHRoaXMgb2JqZWN0IHdhcyBjb21wbGV0ZWx5IHJlcGxhY2VkXG4gKiAgIC8vIE5vdGUgdGhhdCBrZXk0IHdhcyBjb21wbGV0ZWx5IHJlbW92ZWRcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtZW1vIFRoZSBSZWNvcmQgdG8gbWVyZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cHNlcnRNZW1vKG1lbW86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy51cHNlcnRNZW1vKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuXG4gIGlmIChtZW1vID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21lbW8gbXVzdCBiZSBhIG5vbi1udWxsIFJlY29yZCcpO1xuICB9XG5cbiAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICBtb2RpZnlXb3JrZmxvd1Byb3BlcnRpZXM6IHtcbiAgICAgIHVwc2VydGVkTWVtbzoge1xuICAgICAgICBmaWVsZHM6IG1hcFRvUGF5bG9hZHMoXG4gICAgICAgICAgYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgICAgLy8gQ29udmVydCBudWxsIHRvIHVuZGVmaW5lZFxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtZW1vKS5tYXAoKFtrLCB2XSkgPT4gW2ssIHYgPz8gdW5kZWZpbmVkXSkpXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGFjdGl2YXRvci5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm86IFdvcmtmbG93SW5mbyk6IFdvcmtmbG93SW5mbyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmluZm8sXG4gICAgICBtZW1vOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHtcbiAgICAgICAgICAuLi5pbmZvLm1lbW8sXG4gICAgICAgICAgLi4ubWVtbyxcbiAgICAgICAgfSkuZmlsdGVyKChbXywgdl0pID0+IHYgIT0gbnVsbClcbiAgICAgICksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciB1cGRhdGUgYW5kIHNpZ25hbCBoYW5kbGVycyBoYXZlIGZpbmlzaGVkIGV4ZWN1dGluZy5cbiAqXG4gKiBDb25zaWRlciB3YWl0aW5nIG9uIHRoaXMgY29uZGl0aW9uIGJlZm9yZSB3b3JrZmxvdyByZXR1cm4gb3IgY29udGludWUtYXMtbmV3LCB0byBwcmV2ZW50XG4gKiBpbnRlcnJ1cHRpb24gb2YgaW4tcHJvZ3Jlc3MgaGFuZGxlcnMgYnkgd29ya2Zsb3cgZXhpdDpcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgd29ya2Zsb3cuY29uZGl0aW9uKHdvcmtmbG93LmFsbEhhbmRsZXJzRmluaXNoZWQpXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBpbi1wcm9ncmVzcyB1cGRhdGUgb3Igc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbEhhbmRsZXJzRmluaXNoZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdhbGxIYW5kbGVyc0ZpbmlzaGVkKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmluUHJvZ3Jlc3NTaWduYWxzLnNpemUgPT09IDAgJiYgYWN0aXZhdG9yLmluUHJvZ3Jlc3NVcGRhdGVzLnNpemUgPT09IDA7XG59XG5cbmV4cG9ydCBjb25zdCBzdGFja1RyYWNlUXVlcnkgPSBkZWZpbmVRdWVyeTxzdHJpbmc+KCdfX3N0YWNrX3RyYWNlJyk7XG5leHBvcnQgY29uc3QgZW5oYW5jZWRTdGFja1RyYWNlUXVlcnkgPSBkZWZpbmVRdWVyeTxFbmhhbmNlZFN0YWNrVHJhY2U+KCdfX2VuaGFuY2VkX3N0YWNrX3RyYWNlJyk7XG5leHBvcnQgY29uc3Qgd29ya2Zsb3dNZXRhZGF0YVF1ZXJ5ID0gZGVmaW5lUXVlcnk8dGVtcG9yYWwuYXBpLnNkay52MS5JV29ya2Zsb3dNZXRhZGF0YT4oJ19fdGVtcG9yYWxfd29ya2Zsb3dfbWV0YWRhdGEnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZG8gbm90IGVkaXQgLmpzIGZpbGVzIGRpcmVjdGx5IC0gZWRpdCBzcmMvaW5kZXguanN0XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG5cbiAgICBpZiAoYS5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSByZXR1cm4gYS5zb3VyY2UgPT09IGIuc291cmNlICYmIGEuZmxhZ3MgPT09IGIuZmxhZ3M7XG4gICAgaWYgKGEudmFsdWVPZiAhPT0gT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mKSByZXR1cm4gYS52YWx1ZU9mKCkgPT09IGIudmFsdWVPZigpO1xuICAgIGlmIChhLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSByZXR1cm4gYS50b1N0cmluZygpID09PSBiLnRvU3RyaW5nKCk7XG5cbiAgICBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXlzW2ldKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKCFlcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHRydWUgaWYgYm90aCBOYU4sIGZhbHNlIG90aGVyd2lzZVxuICByZXR1cm4gYSE9PWEgJiYgYiE9PWI7XG59O1xuIiwiLy8gR0VORVJBVEVEIEZJTEUuIERPIE5PVCBFRElULlxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgZnVuY3Rpb24gdW53cmFwRGVmYXVsdChleHBvcnRzKSB7XG4gICAgcmV0dXJuIFwiZGVmYXVsdFwiIGluIGV4cG9ydHMgPyBleHBvcnRzLmRlZmF1bHQgOiBleHBvcnRzO1xuICB9XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgICByZXR1cm4gdW53cmFwRGVmYXVsdChleHBvcnRzKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIpIG1vZHVsZS5leHBvcnRzID0gdW53cmFwRGVmYXVsdChleHBvcnRzKTtcbiAgfSBlbHNlIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGV4cG9ydHMgPSB7fTtcbiAgICAgIGZhY3RvcnkoZXhwb3J0cyk7XG4gICAgICBnbG9iYWwuTG9uZyA9IHVud3JhcERlZmF1bHQoZXhwb3J0cyk7XG4gICAgfSkoKTtcbiAgfVxufSkoXG4gIHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiXG4gICAgPyBnbG9iYWxUaGlzXG4gICAgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgPyBzZWxmXG4gICAgICA6IHRoaXMsXG4gIGZ1bmN0aW9uIChfZXhwb3J0cykge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9leHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgfSk7XG4gICAgX2V4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbiAgICAvKipcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCAyMDA5IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9yc1xuICAgICAqIENvcHlyaWdodCAyMDIwIERhbmllbCBXaXJ0eiAvIFRoZSBsb25nLmpzIEF1dGhvcnMuXG4gICAgICpcbiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICAgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICAgKlxuICAgICAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICAgKlxuICAgICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAgICAqXG4gICAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAgICAgKi9cblxuICAgIC8vIFdlYkFzc2VtYmx5IG9wdGltaXphdGlvbnMgdG8gZG8gbmF0aXZlIGk2NCBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aWRlXG4gICAgdmFyIHdhc20gPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB3YXNtID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKFxuICAgICAgICBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKFxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIC8vIFxcMGFzbVxuICAgICAgICAgICAgMCwgOTcsIDExNSwgMTA5LFxuICAgICAgICAgICAgLy8gdmVyc2lvbiAxXG4gICAgICAgICAgICAxLCAwLCAwLCAwLFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcInR5cGVcIlxuICAgICAgICAgICAgMSwgMTMsIDIsXG4gICAgICAgICAgICAvLyAwLCAoKSA9PiBpMzJcbiAgICAgICAgICAgIDk2LCAwLCAxLCAxMjcsXG4gICAgICAgICAgICAvLyAxLCAoaTMyLCBpMzIsIGkzMiwgaTMyKSA9PiBpMzJcbiAgICAgICAgICAgIDk2LCA0LCAxMjcsIDEyNywgMTI3LCAxMjcsIDEsIDEyNyxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAzLCA3LCA2LFxuICAgICAgICAgICAgLy8gMCwgdHlwZSAwXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgLy8gMSwgdHlwZSAxXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgLy8gMiwgdHlwZSAxXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgLy8gMywgdHlwZSAxXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgLy8gNCwgdHlwZSAxXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgLy8gNSwgdHlwZSAxXG4gICAgICAgICAgICAxLFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcImdsb2JhbFwiXG4gICAgICAgICAgICA2LCA2LCAxLFxuICAgICAgICAgICAgLy8gMCwgXCJoaWdoXCIsIG11dGFibGUgaTMyXG4gICAgICAgICAgICAxMjcsIDEsIDY1LCAwLCAxMSxcbiAgICAgICAgICAgIC8vIHNlY3Rpb24gXCJleHBvcnRcIlxuICAgICAgICAgICAgNywgNTAsIDYsXG4gICAgICAgICAgICAvLyAwLCBcIm11bFwiXG4gICAgICAgICAgICAzLCAxMDksIDExNywgMTA4LCAwLCAxLFxuICAgICAgICAgICAgLy8gMSwgXCJkaXZfc1wiXG4gICAgICAgICAgICA1LCAxMDAsIDEwNSwgMTE4LCA5NSwgMTE1LCAwLCAyLFxuICAgICAgICAgICAgLy8gMiwgXCJkaXZfdVwiXG4gICAgICAgICAgICA1LCAxMDAsIDEwNSwgMTE4LCA5NSwgMTE3LCAwLCAzLFxuICAgICAgICAgICAgLy8gMywgXCJyZW1fc1wiXG4gICAgICAgICAgICA1LCAxMTQsIDEwMSwgMTA5LCA5NSwgMTE1LCAwLCA0LFxuICAgICAgICAgICAgLy8gNCwgXCJyZW1fdVwiXG4gICAgICAgICAgICA1LCAxMTQsIDEwMSwgMTA5LCA5NSwgMTE3LCAwLCA1LFxuICAgICAgICAgICAgLy8gNSwgXCJnZXRfaGlnaFwiXG4gICAgICAgICAgICA4LCAxMDMsIDEwMSwgMTE2LCA5NSwgMTA0LCAxMDUsIDEwMywgMTA0LCAwLCAwLFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcImNvZGVcIlxuICAgICAgICAgICAgMTAsIDE5MSwgMSwgNixcbiAgICAgICAgICAgIC8vIDAsIFwiZ2V0X2hpZ2hcIlxuICAgICAgICAgICAgNCwgMCwgMzUsIDAsIDExLFxuICAgICAgICAgICAgLy8gMSwgXCJtdWxcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNiwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgICAvLyAyLCBcImRpdl9zXCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjcsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gMywgXCJkaXZfdVwiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI4LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDQsIFwicmVtX3NcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyOSwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgICAvLyA1LCBcInJlbV91XCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMzAsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgICB7fSxcbiAgICAgICkuZXhwb3J0cztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vIHdhc20gc3VwcG9ydCA6KFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSA2NCBiaXQgdHdvJ3MtY29tcGxlbWVudCBpbnRlZ2VyLCBnaXZlbiBpdHMgbG93IGFuZCBoaWdoIDMyIGJpdCB2YWx1ZXMgYXMgKnNpZ25lZCogaW50ZWdlcnMuXG4gICAgICogIFNlZSB0aGUgZnJvbSogZnVuY3Rpb25zIGJlbG93IGZvciBtb3JlIGNvbnZlbmllbnQgd2F5cyBvZiBjb25zdHJ1Y3RpbmcgTG9uZ3MuXG4gICAgICogQGV4cG9ydHMgTG9uZ1xuICAgICAqIEBjbGFzcyBBIExvbmcgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvdyBUaGUgbG93IChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGlnaCBUaGUgaGlnaCAoc2lnbmVkKSAzMiBiaXRzIG9mIHRoZSBsb25nXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExvbmcobG93LCBoaWdoLCB1bnNpZ25lZCkge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgdmFsdWUuXG4gICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICovXG4gICAgICB0aGlzLmxvdyA9IGxvdyB8IDA7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIGhpZ2ggMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIHRoaXMuaGlnaCA9IGhpZ2ggfCAwO1xuXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LlxuICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgKi9cbiAgICAgIHRoaXMudW5zaWduZWQgPSAhIXVuc2lnbmVkO1xuICAgIH1cblxuICAgIC8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcgaXMgdGhlIHR3byBnaXZlbiBzaWduZWQsIDMyLWJpdCB2YWx1ZXMuXG4gICAgLy8gV2UgdXNlIDMyLWJpdCBwaWVjZXMgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHNpemUgb2YgaW50ZWdlcnMgb24gd2hpY2hcbiAgICAvLyBKYXZhc2NyaXB0IHBlcmZvcm1zIGJpdC1vcGVyYXRpb25zLiAgRm9yIG9wZXJhdGlvbnMgbGlrZSBhZGRpdGlvbiBhbmRcbiAgICAvLyBtdWx0aXBsaWNhdGlvbiwgd2Ugc3BsaXQgZWFjaCBudW1iZXIgaW50byAxNiBiaXQgcGllY2VzLCB3aGljaCBjYW4gZWFzaWx5IGJlXG4gICAgLy8gbXVsdGlwbGllZCB3aXRoaW4gSmF2YXNjcmlwdCdzIGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgb3ZlcmZsb3dcbiAgICAvLyBvciBjaGFuZ2UgaW4gc2lnbi5cbiAgICAvL1xuICAgIC8vIEluIHRoZSBhbGdvcml0aG1zIGJlbG93LCB3ZSBmcmVxdWVudGx5IHJlZHVjZSB0aGUgbmVnYXRpdmUgY2FzZSB0byB0aGVcbiAgICAvLyBwb3NpdGl2ZSBjYXNlIGJ5IG5lZ2F0aW5nIHRoZSBpbnB1dChzKSBhbmQgdGhlbiBwb3N0LXByb2Nlc3NpbmcgdGhlIHJlc3VsdC5cbiAgICAvLyBOb3RlIHRoYXQgd2UgbXVzdCBBTFdBWVMgY2hlY2sgc3BlY2lhbGx5IHdoZXRoZXIgdGhvc2UgdmFsdWVzIGFyZSBNSU5fVkFMVUVcbiAgICAvLyAoLTJeNjMpIGJlY2F1c2UgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUUgKHNpbmNlIDJeNjMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzXG4gICAgLy8gYSBwb3NpdGl2ZSBudW1iZXIsIGl0IG92ZXJmbG93cyBiYWNrIGludG8gYSBuZWdhdGl2ZSkuICBOb3QgaGFuZGxpbmcgdGhpc1xuICAgIC8vIGNhc2Ugd291bGQgb2Z0ZW4gcmVzdWx0IGluIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgICAvL1xuICAgIC8vIENvbW1vbiBjb25zdGFudCB2YWx1ZXMgWkVSTywgT05FLCBORUdfT05FLCBldGMuIGFyZSBkZWZpbmVkIGJlbG93IHRoZSBmcm9tKlxuICAgIC8vIG1ldGhvZHMgb24gd2hpY2ggdGhleSBkZXBlbmQuXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbmRpY2F0b3IgdXNlZCB0byByZWxpYWJseSBkZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgTG9uZyBvciBub3QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGNvbnN0XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBMb25nLnByb3RvdHlwZS5fX2lzTG9uZ19fO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMb25nLnByb3RvdHlwZSwgXCJfX2lzTG9uZ19fXCIsIHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMb25nKG9iaikge1xuICAgICAgcmV0dXJuIChvYmogJiYgb2JqW1wiX19pc0xvbmdfX1wiXSkgPT09IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBudW1iZXJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN0ejMyKHZhbHVlKSB7XG4gICAgICB2YXIgYyA9IE1hdGguY2x6MzIodmFsdWUgJiAtdmFsdWUpO1xuICAgICAgcmV0dXJuIHZhbHVlID8gMzEgLSBjIDogYztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIExvbmcuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSBvYmogT2JqZWN0XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZy5pc0xvbmcgPSBpc0xvbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCBpbnRlZ2VyIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7IU9iamVjdH1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgSU5UX0NBQ0hFID0ge307XG5cbiAgICAvKipcbiAgICAgKiBBIGNhY2hlIG9mIHRoZSBMb25nIHJlcHJlc2VudGF0aW9ucyBvZiBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7IU9iamVjdH1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVUlOVF9DQUNIRSA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbUludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgIHZhciBvYmosIGNhY2hlZE9iaiwgY2FjaGU7XG4gICAgICBpZiAodW5zaWduZWQpIHtcbiAgICAgICAgdmFsdWUgPj4+PSAwO1xuICAgICAgICBpZiAoKGNhY2hlID0gMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8IDI1NikpIHtcbiAgICAgICAgICBjYWNoZWRPYmogPSBVSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgICAgICBpZiAoY2FjaGVkT2JqKSByZXR1cm4gY2FjaGVkT2JqO1xuICAgICAgICB9XG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCAwLCB0cnVlKTtcbiAgICAgICAgaWYgKGNhY2hlKSBVSU5UX0NBQ0hFW3ZhbHVlXSA9IG9iajtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlIHw9IDA7XG4gICAgICAgIGlmICgoY2FjaGUgPSAtMTI4IDw9IHZhbHVlICYmIHZhbHVlIDwgMTI4KSkge1xuICAgICAgICAgIGNhY2hlZE9iaiA9IElOVF9DQUNIRVt2YWx1ZV07XG4gICAgICAgICAgaWYgKGNhY2hlZE9iaikgcmV0dXJuIGNhY2hlZE9iajtcbiAgICAgICAgfVxuICAgICAgICBvYmogPSBmcm9tQml0cyh2YWx1ZSwgdmFsdWUgPCAwID8gLTEgOiAwLCBmYWxzZSk7XG4gICAgICAgIGlmIChjYWNoZSkgSU5UX0NBQ0hFW3ZhbHVlXSA9IG9iajtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIDMyIGJpdCBpbnRlZ2VyIHZhbHVlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgMzIgYml0IGludGVnZXIgaW4gcXVlc3Rpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tSW50ID0gZnJvbUludDtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21OdW1iZXIodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gdW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICBpZiAodW5zaWduZWQpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIFVaRVJPO1xuICAgICAgICBpZiAodmFsdWUgPj0gVFdPX1BXUl82NF9EQkwpIHJldHVybiBNQVhfVU5TSUdORURfVkFMVUU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUgPD0gLVRXT19QV1JfNjNfREJMKSByZXR1cm4gTUlOX1ZBTFVFO1xuICAgICAgICBpZiAodmFsdWUgKyAxID49IFRXT19QV1JfNjNfREJMKSByZXR1cm4gTUFYX1ZBTFVFO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIGZyb21OdW1iZXIoLXZhbHVlLCB1bnNpZ25lZCkubmVnKCk7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHZhbHVlICUgVFdPX1BXUl8zMl9EQkwgfCAwLFxuICAgICAgICAodmFsdWUgLyBUV09fUFdSXzMyX0RCTCkgfCAwLFxuICAgICAgICB1bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZSwgcHJvdmlkZWQgdGhhdCBpdCBpcyBhIGZpbml0ZSBudW1iZXIuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIG51bWJlciBpbiBxdWVzdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21OdW1iZXIgPSBmcm9tTnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpIHtcbiAgICAgIHJldHVybiBuZXcgTG9uZyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgNjQgYml0IGludGVnZXIgdGhhdCBjb21lcyBieSBjb25jYXRlbmF0aW5nIHRoZSBnaXZlbiBsb3cgYW5kIGhpZ2ggYml0cy4gRWFjaCBpc1xuICAgICAqICBhc3N1bWVkIHRvIHVzZSAzMiBiaXRzLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsb3dCaXRzIFRoZSBsb3cgMzIgYml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0cyBUaGUgaGlnaCAzMiBiaXRzXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJpdHMgPSBmcm9tQml0cztcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV4cG9uZW50XG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgcG93X2RibCA9IE1hdGgucG93OyAvLyBVc2VkIDQgdGltZXMgKDQqOCB0byAxNSs0KVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgICAqIEBwYXJhbSB7KGJvb2xlYW58bnVtYmVyKT19IHVuc2lnbmVkXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSByYWRpeFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHN0ciwgdW5zaWduZWQsIHJhZGl4KSB7XG4gICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkgdGhyb3cgRXJyb3IoXCJlbXB0eSBzdHJpbmdcIik7XG4gICAgICBpZiAodHlwZW9mIHVuc2lnbmVkID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIC8vIEZvciBnb29nLm1hdGgubG9uZyBjb21wYXRpYmlsaXR5XG4gICAgICAgIHJhZGl4ID0gdW5zaWduZWQ7XG4gICAgICAgIHVuc2lnbmVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnNpZ25lZCA9ICEhdW5zaWduZWQ7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHN0ciA9PT0gXCJOYU5cIiB8fFxuICAgICAgICBzdHIgPT09IFwiSW5maW5pdHlcIiB8fFxuICAgICAgICBzdHIgPT09IFwiK0luZmluaXR5XCIgfHxcbiAgICAgICAgc3RyID09PSBcIi1JbmZpbml0eVwiXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIHJhZGl4ID0gcmFkaXggfHwgMTA7XG4gICAgICBpZiAocmFkaXggPCAyIHx8IDM2IDwgcmFkaXgpIHRocm93IFJhbmdlRXJyb3IoXCJyYWRpeFwiKTtcbiAgICAgIHZhciBwO1xuICAgICAgaWYgKChwID0gc3RyLmluZGV4T2YoXCItXCIpKSA+IDApIHRocm93IEVycm9yKFwiaW50ZXJpb3IgaHlwaGVuXCIpO1xuICAgICAgZWxzZSBpZiAocCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhzdHIuc3Vic3RyaW5nKDEpLCB1bnNpZ25lZCwgcmFkaXgpLm5lZygpO1xuICAgICAgfVxuXG4gICAgICAvLyBEbyBzZXZlcmFsICg4KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gICAgICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cbiAgICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDgpKTtcbiAgICAgIHZhciByZXN1bHQgPSBaRVJPO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpICs9IDgpIHtcbiAgICAgICAgdmFyIHNpemUgPSBNYXRoLm1pbig4LCBzdHIubGVuZ3RoIC0gaSksXG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUludChzdHIuc3Vic3RyaW5nKGksIGkgKyBzaXplKSwgcmFkaXgpO1xuICAgICAgICBpZiAoc2l6ZSA8IDgpIHtcbiAgICAgICAgICB2YXIgcG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIHNpemUpKTtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQubXVsKHBvd2VyKS5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocmFkaXhUb1Bvd2VyKTtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYWRkKGZyb21OdW1iZXIodmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnVuc2lnbmVkID0gdW5zaWduZWQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcsIHdyaXR0ZW4gdXNpbmcgdGhlIHNwZWNpZmllZCByYWRpeC5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBMb25nXG4gICAgICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gcmFkaXggVGhlIHJhZGl4IGluIHdoaWNoIHRoZSB0ZXh0IGlzIHdyaXR0ZW4gKDItMzYpLCBkZWZhdWx0cyB0byAxMFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21WYWx1ZSh2YWwsIHVuc2lnbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIGZyb21OdW1iZXIodmFsLCB1bnNpZ25lZCk7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZyb21TdHJpbmcodmFsLCB1bnNpZ25lZCk7XG4gICAgICAvLyBUaHJvd3MgZm9yIG5vbi1vYmplY3RzLCBjb252ZXJ0cyBub24taW5zdGFuY2VvZiBMb25nOlxuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB2YWwubG93LFxuICAgICAgICB2YWwuaGlnaCxcbiAgICAgICAgdHlwZW9mIHVuc2lnbmVkID09PSBcImJvb2xlYW5cIiA/IHVuc2lnbmVkIDogdmFsLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIGEgTG9uZyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZnJvbSogZnVuY3Rpb24gZm9yIGl0cyB0eXBlLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd8IXtsb3c6IG51bWJlciwgaGlnaDogbnVtYmVyLCB1bnNpZ25lZDogYm9vbGVhbn19IHZhbCBWYWx1ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5mcm9tVmFsdWUgPSBmcm9tVmFsdWU7XG5cbiAgICAvLyBOT1RFOiB0aGUgY29tcGlsZXIgc2hvdWxkIGlubGluZSB0aGVzZSBjb25zdGFudCB2YWx1ZXMgYmVsb3cgYW5kIHRoZW4gcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcywgc28gdGhlcmUgc2hvdWxkIGJlXG4gICAgLy8gbm8gcnVudGltZSBwZW5hbHR5IGZvciB0aGVzZS5cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfMTZfREJMID0gMSA8PCAxNjtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfMjRfREJMID0gMSA8PCAyNDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfMzJfREJMID0gVFdPX1BXUl8xNl9EQkwgKiBUV09fUFdSXzE2X0RCTDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfNjRfREJMID0gVFdPX1BXUl8zMl9EQkwgKiBUV09fUFdSXzMyX0RCTDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfNjNfREJMID0gVFdPX1BXUl82NF9EQkwgLyAyO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBjb25zdFxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBUV09fUFdSXzI0ID0gZnJvbUludChUV09fUFdSXzI0X0RCTCk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFpFUk8gPSBmcm9tSW50KDApO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmVkIHplcm8uXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuWkVSTyA9IFpFUk87XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFVaRVJPID0gZnJvbUludCgwLCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFVuc2lnbmVkIHplcm8uXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuVVpFUk8gPSBVWkVSTztcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgT05FID0gZnJvbUludCgxKTtcblxuICAgIC8qKlxuICAgICAqIFNpZ25lZCBvbmUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuT05FID0gT05FO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBVT05FID0gZnJvbUludCgxLCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFVuc2lnbmVkIG9uZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5VT05FID0gVU9ORTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTkVHX09ORSA9IGZyb21JbnQoLTEpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmVkIG5lZ2F0aXZlIG9uZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5ORUdfT05FID0gTkVHX09ORTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTUFYX1ZBTFVFID0gZnJvbUJpdHMoMHhmZmZmZmZmZiB8IDAsIDB4N2ZmZmZmZmYgfCAwLCBmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIHNpZ25lZCB2YWx1ZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5NQVhfVkFMVUUgPSBNQVhfVkFMVUU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIE1BWF9VTlNJR05FRF9WQUxVRSA9IGZyb21CaXRzKDB4ZmZmZmZmZmYgfCAwLCAweGZmZmZmZmZmIHwgMCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIHVuc2lnbmVkIHZhbHVlLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk1BWF9VTlNJR05FRF9WQUxVRSA9IE1BWF9VTlNJR05FRF9WQUxVRTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTUlOX1ZBTFVFID0gZnJvbUJpdHMoMCwgMHg4MDAwMDAwMCB8IDAsIGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIE1pbmltdW0gc2lnbmVkIHZhbHVlLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk1JTl9WQUxVRSA9IE1JTl9WQUxVRTtcblxuICAgIC8qKlxuICAgICAqIEBhbGlhcyBMb25nLnByb3RvdHlwZVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBMb25nUHJvdG90eXBlID0gTG9uZy5wcm90b3R5cGU7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIDMyIGJpdCBpbnRlZ2VyLCBhc3N1bWluZyBpdCBpcyBhIDMyIGJpdCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9JbnQgPSBmdW5jdGlvbiB0b0ludCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkID8gdGhpcy5sb3cgPj4+IDAgOiB0aGlzLmxvdztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSB0aGUgbmVhcmVzdCBmbG9hdGluZy1wb2ludCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHZhbHVlIChkb3VibGUsIDUzIGJpdCBtYW50aXNzYSkuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b051bWJlciA9IGZ1bmN0aW9uIHRvTnVtYmVyKCkge1xuICAgICAgaWYgKHRoaXMudW5zaWduZWQpXG4gICAgICAgIHJldHVybiAodGhpcy5oaWdoID4+PiAwKSAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgc3RyaW5nIHdyaXR0ZW4gaW4gdGhlIHNwZWNpZmllZCByYWRpeC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBSYWRpeCAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKiBAdGhyb3dzIHtSYW5nZUVycm9yfSBJZiBgcmFkaXhgIGlzIG91dCBvZiByYW5nZVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhyYWRpeCkge1xuICAgICAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgdGhyb3cgUmFuZ2VFcnJvcihcInJhZGl4XCIpO1xuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiBcIjBcIjtcbiAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkge1xuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBMb25nIHZhbHVlIGJlZm9yZSBpdCBjYW4gYmUgbmVnYXRlZCwgc28gd2UgcmVtb3ZlXG4gICAgICAgICAgLy8gdGhlIGJvdHRvbS1tb3N0IGRpZ2l0IGluIHRoaXMgYmFzZSBhbmQgdGhlbiByZWN1cnNlIHRvIGRvIHRoZSByZXN0LlxuICAgICAgICAgIHZhciByYWRpeExvbmcgPSBmcm9tTnVtYmVyKHJhZGl4KSxcbiAgICAgICAgICAgIGRpdiA9IHRoaXMuZGl2KHJhZGl4TG9uZyksXG4gICAgICAgICAgICByZW0xID0gZGl2Lm11bChyYWRpeExvbmcpLnN1Yih0aGlzKTtcbiAgICAgICAgICByZXR1cm4gZGl2LnRvU3RyaW5nKHJhZGl4KSArIHJlbTEudG9JbnQoKS50b1N0cmluZyhyYWRpeCk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gXCItXCIgKyB0aGlzLm5lZygpLnRvU3RyaW5nKHJhZGl4KTtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gc2V2ZXJhbCAoNikgZGlnaXRzIGVhY2ggdGltZSB0aHJvdWdoIHRoZSBsb29wLCBzbyBhcyB0b1xuICAgICAgLy8gbWluaW1pemUgdGhlIGNhbGxzIHRvIHRoZSB2ZXJ5IGV4cGVuc2l2ZSBlbXVsYXRlZCBkaXYuXG4gICAgICB2YXIgcmFkaXhUb1Bvd2VyID0gZnJvbU51bWJlcihwb3dfZGJsKHJhZGl4LCA2KSwgdGhpcy51bnNpZ25lZCksXG4gICAgICAgIHJlbSA9IHRoaXM7XG4gICAgICB2YXIgcmVzdWx0ID0gXCJcIjtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciByZW1EaXYgPSByZW0uZGl2KHJhZGl4VG9Qb3dlciksXG4gICAgICAgICAgaW50dmFsID0gcmVtLnN1YihyZW1EaXYubXVsKHJhZGl4VG9Qb3dlcikpLnRvSW50KCkgPj4+IDAsXG4gICAgICAgICAgZGlnaXRzID0gaW50dmFsLnRvU3RyaW5nKHJhZGl4KTtcbiAgICAgICAgcmVtID0gcmVtRGl2O1xuICAgICAgICBpZiAocmVtLmlzWmVybygpKSByZXR1cm4gZGlnaXRzICsgcmVzdWx0O1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA8IDYpIGRpZ2l0cyA9IFwiMFwiICsgZGlnaXRzO1xuICAgICAgICAgIHJlc3VsdCA9IFwiXCIgKyBkaWdpdHMgKyByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGlnaCAzMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBoaWdoIGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgaGlnaCBiaXRzXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRIaWdoQml0c1Vuc2lnbmVkID0gZnVuY3Rpb24gZ2V0SGlnaEJpdHNVbnNpZ25lZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggPj4+IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxvdyAzMiBiaXRzIGFzIGEgc2lnbmVkIGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFNpZ25lZCBsb3cgYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0TG93Qml0cyA9IGZ1bmN0aW9uIGdldExvd0JpdHMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3c7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxvdyAzMiBiaXRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFVuc2lnbmVkIGxvdyBiaXRzXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRMb3dCaXRzVW5zaWduZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3cgPj4+IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoaXMgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldE51bUJpdHNBYnMgPSBmdW5jdGlvbiBnZXROdW1CaXRzQWJzKCkge1xuICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKVxuICAgICAgICAvLyBVbnNpZ25lZCBMb25ncyBhcmUgbmV2ZXIgbmVnYXRpdmVcbiAgICAgICAgcmV0dXJuIHRoaXMuZXEoTUlOX1ZBTFVFKSA/IDY0IDogdGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7XG4gICAgICB2YXIgdmFsID0gdGhpcy5oaWdoICE9IDAgPyB0aGlzLmhpZ2ggOiB0aGlzLmxvdztcbiAgICAgIGZvciAodmFyIGJpdCA9IDMxOyBiaXQgPiAwOyBiaXQtLSkgaWYgKCh2YWwgJiAoMSA8PCBiaXQpKSAhPSAwKSBicmVhaztcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggIT0gMCA/IGJpdCArIDMzIDogYml0ICsgMTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nIGNhbiBiZSBzYWZlbHkgcmVwcmVzZW50ZWQgYXMgYSBKYXZhU2NyaXB0IG51bWJlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc1NhZmVJbnRlZ2VyID0gZnVuY3Rpb24gaXNTYWZlSW50ZWdlcigpIHtcbiAgICAgIC8vIDJeNTMtMSBpcyB0aGUgbWF4aW11bSBzYWZlIHZhbHVlXG4gICAgICB2YXIgdG9wMTFCaXRzID0gdGhpcy5oaWdoID4+IDIxO1xuICAgICAgLy8gWzAsIDJeNTMtMV1cbiAgICAgIGlmICghdG9wMTFCaXRzKSByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vID4gMl41My0xXG4gICAgICBpZiAodGhpcy51bnNpZ25lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gWy0yXjUzLCAtMV0gZXhjZXB0IC0yXjUzXG4gICAgICByZXR1cm4gdG9wMTFCaXRzID09PSAtMSAmJiAhKHRoaXMubG93ID09PSAwICYmIHRoaXMuaGlnaCA9PT0gLTB4MjAwMDAwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gaXNaZXJvKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gMCAmJiB0aGlzLmxvdyA9PT0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHplcm8uIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjaXNaZXJvfS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmVxeiA9IExvbmdQcm90b3R5cGUuaXNaZXJvO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbmVnYXRpdmUuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNOZWdhdGl2ZSA9IGZ1bmN0aW9uIGlzTmVnYXRpdmUoKSB7XG4gICAgICByZXR1cm4gIXRoaXMudW5zaWduZWQgJiYgdGhpcy5oaWdoIDwgMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgcG9zaXRpdmUgb3IgemVyby5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc1Bvc2l0aXZlID0gZnVuY3Rpb24gaXNQb3NpdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuc2lnbmVkIHx8IHRoaXMuaGlnaCA+PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBvZGQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuaXNPZGQgPSBmdW5jdGlvbiBpc09kZCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZXZlbi5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4oKSB7XG4gICAgICByZXR1cm4gKHRoaXMubG93ICYgMSkgPT09IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGVxdWFscyB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnVuc2lnbmVkICE9PSBvdGhlci51bnNpZ25lZCAmJlxuICAgICAgICB0aGlzLmhpZ2ggPj4+IDMxID09PSAxICYmXG4gICAgICAgIG90aGVyLmhpZ2ggPj4+IDMxID09PSAxXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggPT09IG90aGVyLmhpZ2ggJiYgdGhpcy5sb3cgPT09IG90aGVyLmxvdztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNlcXVhbHN9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5lcSA9IExvbmdQcm90b3R5cGUuZXF1YWxzO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5vdEVxdWFscyA9IGZ1bmN0aW9uIG5vdEVxdWFscyhvdGhlcikge1xuICAgICAgcmV0dXJuICF0aGlzLmVxKC8qIHZhbGlkYXRlcyAqLyBvdGhlcik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubmVxID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI25vdEVxdWFsc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lID0gTG9uZ1Byb3RvdHlwZS5ub3RFcXVhbHM7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubGVzc1RoYW4gPSBmdW5jdGlvbiBsZXNzVGhhbihvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDwgMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbn0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmx0ID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbjtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA8PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmx0ZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNsZXNzVGhhbk9yRXF1YWx9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sZSA9IExvbmdQcm90b3R5cGUubGVzc1RoYW5PckVxdWFsO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuID0gZnVuY3Rpb24gZ3JlYXRlclRoYW4ob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW59LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ndCA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW47XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsID0gZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPj0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ndGUgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjZ3JlYXRlclRoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2UgPSBMb25nUHJvdG90eXBlLmdyZWF0ZXJUaGFuT3JFcXVhbDtcblxuICAgIC8qKlxuICAgICAqIENvbXBhcmVzIHRoaXMgTG9uZydzIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcbiAgICAgKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZShvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICBpZiAodGhpcy5lcShvdGhlcikpIHJldHVybiAwO1xuICAgICAgdmFyIHRoaXNOZWcgPSB0aGlzLmlzTmVnYXRpdmUoKSxcbiAgICAgICAgb3RoZXJOZWcgPSBvdGhlci5pc05lZ2F0aXZlKCk7XG4gICAgICBpZiAodGhpc05lZyAmJiAhb3RoZXJOZWcpIHJldHVybiAtMTtcbiAgICAgIGlmICghdGhpc05lZyAmJiBvdGhlck5lZykgcmV0dXJuIDE7XG4gICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBzaWduIGJpdHMgYXJlIHRoZSBzYW1lXG4gICAgICBpZiAoIXRoaXMudW5zaWduZWQpIHJldHVybiB0aGlzLnN1YihvdGhlcikuaXNOZWdhdGl2ZSgpID8gLTEgOiAxO1xuICAgICAgLy8gQm90aCBhcmUgcG9zaXRpdmUgaWYgYXQgbGVhc3Qgb25lIGlzIHVuc2lnbmVkXG4gICAgICByZXR1cm4gb3RoZXIuaGlnaCA+Pj4gMCA+IHRoaXMuaGlnaCA+Pj4gMCB8fFxuICAgICAgICAob3RoZXIuaGlnaCA9PT0gdGhpcy5oaWdoICYmIG90aGVyLmxvdyA+Pj4gMCA+IHRoaXMubG93ID4+PiAwKVxuICAgICAgICA/IC0xXG4gICAgICAgIDogMTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY29tcGFyZX0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCAxIGlmIHRoZSB0aGlzIGlzIGdyZWF0ZXIgYW5kIC0xXG4gICAgICogIGlmIHRoZSBnaXZlbiBvbmUgaXMgZ3JlYXRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY29tcCA9IExvbmdQcm90b3R5cGUuY29tcGFyZTtcblxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZWdhdGUgPSBmdW5jdGlvbiBuZWdhdGUoKSB7XG4gICAgICBpZiAoIXRoaXMudW5zaWduZWQgJiYgdGhpcy5lcShNSU5fVkFMVUUpKSByZXR1cm4gTUlOX1ZBTFVFO1xuICAgICAgcmV0dXJuIHRoaXMubm90KCkuYWRkKE9ORSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZXMgdGhpcyBMb25nJ3MgdmFsdWUuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbmVnYXRlfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IE5lZ2F0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubmVnID0gTG9uZ1Byb3RvdHlwZS5uZWdhdGU7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBhZGRlbmQgQWRkZW5kXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTdW1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZChhZGRlbmQpIHtcbiAgICAgIGlmICghaXNMb25nKGFkZGVuZCkpIGFkZGVuZCA9IGZyb21WYWx1ZShhZGRlbmQpO1xuXG4gICAgICAvLyBEaXZpZGUgZWFjaCBudW1iZXIgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBzdW0gdGhlIGNodW5rcy5cblxuICAgICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gICAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4ZmZmZjtcbiAgICAgIHZhciBiNDggPSBhZGRlbmQuaGlnaCA+Pj4gMTY7XG4gICAgICB2YXIgYjMyID0gYWRkZW5kLmhpZ2ggJiAweGZmZmY7XG4gICAgICB2YXIgYjE2ID0gYWRkZW5kLmxvdyA+Pj4gMTY7XG4gICAgICB2YXIgYjAwID0gYWRkZW5kLmxvdyAmIDB4ZmZmZjtcbiAgICAgIHZhciBjNDggPSAwLFxuICAgICAgICBjMzIgPSAwLFxuICAgICAgICBjMTYgPSAwLFxuICAgICAgICBjMDAgPSAwO1xuICAgICAgYzAwICs9IGEwMCArIGIwMDtcbiAgICAgIGMxNiArPSBjMDAgPj4+IDE2O1xuICAgICAgYzAwICY9IDB4ZmZmZjtcbiAgICAgIGMxNiArPSBhMTYgKyBiMTY7XG4gICAgICBjMzIgKz0gYzE2ID4+PiAxNjtcbiAgICAgIGMxNiAmPSAweGZmZmY7XG4gICAgICBjMzIgKz0gYTMyICsgYjMyO1xuICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gICAgICBjMzIgJj0gMHhmZmZmO1xuICAgICAgYzQ4ICs9IGE0OCArIGI0ODtcbiAgICAgIGM0OCAmPSAweGZmZmY7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoKGMxNiA8PCAxNikgfCBjMDAsIChjNDggPDwgMTYpIHwgYzMyLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdChzdWJ0cmFoZW5kKSB7XG4gICAgICBpZiAoIWlzTG9uZyhzdWJ0cmFoZW5kKSkgc3VidHJhaGVuZCA9IGZyb21WYWx1ZShzdWJ0cmFoZW5kKTtcbiAgICAgIHJldHVybiB0aGlzLmFkZChzdWJ0cmFoZW5kLm5lZygpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc3VidHJhY3R9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IHN1YnRyYWhlbmQgU3VidHJhaGVuZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gRGlmZmVyZW5jZVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc3ViID0gTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFByb2R1Y3RcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gbXVsdGlwbHkobXVsdGlwbGllcikge1xuICAgICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiB0aGlzO1xuICAgICAgaWYgKCFpc0xvbmcobXVsdGlwbGllcikpIG11bHRpcGxpZXIgPSBmcm9tVmFsdWUobXVsdGlwbGllcik7XG5cbiAgICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICAgICAgaWYgKHdhc20pIHtcbiAgICAgICAgdmFyIGxvdyA9IHdhc21bXCJtdWxcIl0oXG4gICAgICAgICAgdGhpcy5sb3csXG4gICAgICAgICAgdGhpcy5oaWdoLFxuICAgICAgICAgIG11bHRpcGxpZXIubG93LFxuICAgICAgICAgIG11bHRpcGxpZXIuaGlnaCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKGxvdywgd2FzbVtcImdldF9oaWdoXCJdKCksIHRoaXMudW5zaWduZWQpO1xuICAgICAgfVxuICAgICAgaWYgKG11bHRpcGxpZXIuaXNaZXJvKCkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgaWYgKHRoaXMuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIG11bHRpcGxpZXIuaXNPZGQoKSA/IE1JTl9WQUxVRSA6IFpFUk87XG4gICAgICBpZiAobXVsdGlwbGllci5lcShNSU5fVkFMVUUpKSByZXR1cm4gdGhpcy5pc09kZCgpID8gTUlOX1ZBTFVFIDogWkVSTztcbiAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgICAgICBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyLm5lZygpKTtcbiAgICAgICAgZWxzZSByZXR1cm4gdGhpcy5uZWcoKS5tdWwobXVsdGlwbGllcikubmVnKCk7XG4gICAgICB9IGVsc2UgaWYgKG11bHRpcGxpZXIuaXNOZWdhdGl2ZSgpKVxuICAgICAgICByZXR1cm4gdGhpcy5tdWwobXVsdGlwbGllci5uZWcoKSkubmVnKCk7XG5cbiAgICAgIC8vIElmIGJvdGggbG9uZ3MgYXJlIHNtYWxsLCB1c2UgZmxvYXQgbXVsdGlwbGljYXRpb25cbiAgICAgIGlmICh0aGlzLmx0KFRXT19QV1JfMjQpICYmIG11bHRpcGxpZXIubHQoVFdPX1BXUl8yNCkpXG4gICAgICAgIHJldHVybiBmcm9tTnVtYmVyKFxuICAgICAgICAgIHRoaXMudG9OdW1iZXIoKSAqIG11bHRpcGxpZXIudG9OdW1iZXIoKSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuXG4gICAgICAvLyBEaXZpZGUgZWFjaCBsb25nIGludG8gNCBjaHVua3Mgb2YgMTYgYml0cywgYW5kIHRoZW4gYWRkIHVwIDR4NCBwcm9kdWN0cy5cbiAgICAgIC8vIFdlIGNhbiBza2lwIHByb2R1Y3RzIHRoYXQgd291bGQgb3ZlcmZsb3cuXG5cbiAgICAgIHZhciBhNDggPSB0aGlzLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGEzMiA9IHRoaXMuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBhMTYgPSB0aGlzLmxvdyA+Pj4gMTY7XG4gICAgICB2YXIgYTAwID0gdGhpcy5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYjQ4ID0gbXVsdGlwbGllci5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBiMzIgPSBtdWx0aXBsaWVyLmhpZ2ggJiAweGZmZmY7XG4gICAgICB2YXIgYjE2ID0gbXVsdGlwbGllci5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGIwMCA9IG11bHRpcGxpZXIubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGM0OCA9IDAsXG4gICAgICAgIGMzMiA9IDAsXG4gICAgICAgIGMxNiA9IDAsXG4gICAgICAgIGMwMCA9IDA7XG4gICAgICBjMDAgKz0gYTAwICogYjAwO1xuICAgICAgYzE2ICs9IGMwMCA+Pj4gMTY7XG4gICAgICBjMDAgJj0gMHhmZmZmO1xuICAgICAgYzE2ICs9IGExNiAqIGIwMDtcbiAgICAgIGMzMiArPSBjMTYgPj4+IDE2O1xuICAgICAgYzE2ICY9IDB4ZmZmZjtcbiAgICAgIGMxNiArPSBhMDAgKiBiMTY7XG4gICAgICBjMzIgKz0gYzE2ID4+PiAxNjtcbiAgICAgIGMxNiAmPSAweGZmZmY7XG4gICAgICBjMzIgKz0gYTMyICogYjAwO1xuICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gICAgICBjMzIgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGExNiAqIGIxNjtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMDAgKiBiMzI7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjNDggKz0gYTQ4ICogYjAwICsgYTMyICogYjE2ICsgYTE2ICogYjMyICsgYTAwICogYjQ4O1xuICAgICAgYzQ4ICY9IDB4ZmZmZjtcbiAgICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtdWx0aXBseX0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gbXVsdGlwbGllciBNdWx0aXBsaWVyXG4gICAgICogQHJldHVybnMgeyFMb25nfSBQcm9kdWN0XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5tdWwgPSBMb25nUHJvdG90eXBlLm11bHRpcGx5O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGUgcmVzdWx0IGlzIHNpZ25lZCBpZiB0aGlzIExvbmcgaXMgc2lnbmVkIG9yXG4gICAgICogIHVuc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyB1bnNpZ25lZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZGl2aWRlID0gZnVuY3Rpb24gZGl2aWRlKGRpdmlzb3IpIHtcbiAgICAgIGlmICghaXNMb25nKGRpdmlzb3IpKSBkaXZpc29yID0gZnJvbVZhbHVlKGRpdmlzb3IpO1xuICAgICAgaWYgKGRpdmlzb3IuaXNaZXJvKCkpIHRocm93IEVycm9yKFwiZGl2aXNpb24gYnkgemVyb1wiKTtcblxuICAgICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gICAgICBpZiAod2FzbSkge1xuICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IHNpZ25lZCBkaXZpc2lvbiBvdmVyZmxvdzogdGhlIGxhcmdlc3RcbiAgICAgICAgLy8gbmVnYXRpdmUgbnVtYmVyIC8gLTEgd291bGQgYmUgMSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdFxuICAgICAgICAvLyBwb3NpdGl2ZSBudW1iZXIsIGR1ZSB0byB0d28ncyBjb21wbGVtZW50LlxuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMudW5zaWduZWQgJiZcbiAgICAgICAgICB0aGlzLmhpZ2ggPT09IC0weDgwMDAwMDAwICYmXG4gICAgICAgICAgZGl2aXNvci5sb3cgPT09IC0xICYmXG4gICAgICAgICAgZGl2aXNvci5oaWdoID09PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBiZSBjb25zaXN0ZW50IHdpdGggbm9uLXdhc20gY29kZSBwYXRoXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbVtcImRpdl91XCJdIDogd2FzbVtcImRpdl9zXCJdKShcbiAgICAgICAgICB0aGlzLmxvdyxcbiAgICAgICAgICB0aGlzLmhpZ2gsXG4gICAgICAgICAgZGl2aXNvci5sb3csXG4gICAgICAgICAgZGl2aXNvci5oaWdoLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtW1wiZ2V0X2hpZ2hcIl0oKSwgdGhpcy51bnNpZ25lZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICB2YXIgYXBwcm94LCByZW0sIHJlcztcbiAgICAgIGlmICghdGhpcy51bnNpZ25lZCkge1xuICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgb25seSByZWxldmFudCBmb3Igc2lnbmVkIGxvbmdzIGFuZCBpcyBkZXJpdmVkIGZyb20gdGhlXG4gICAgICAgIC8vIGNsb3N1cmUgbGlicmFyeSBhcyBhIHdob2xlLlxuICAgICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICAgICAgaWYgKGRpdmlzb3IuZXEoT05FKSB8fCBkaXZpc29yLmVxKE5FR19PTkUpKVxuICAgICAgICAgICAgcmV0dXJuIE1JTl9WQUxVRTsgLy8gcmVjYWxsIHRoYXQgLU1JTl9WQUxVRSA9PSBNSU5fVkFMVUVcbiAgICAgICAgICBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpIHJldHVybiBPTkU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHxvdGhlcnwgPj0gMiwgc28gfHRoaXMvb3RoZXJ8IDwgfE1JTl9WQUxVRXwuXG4gICAgICAgICAgICB2YXIgaGFsZlRoaXMgPSB0aGlzLnNocigxKTtcbiAgICAgICAgICAgIGFwcHJveCA9IGhhbGZUaGlzLmRpdihkaXZpc29yKS5zaGwoMSk7XG4gICAgICAgICAgICBpZiAoYXBwcm94LmVxKFpFUk8pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkaXZpc29yLmlzTmVnYXRpdmUoKSA/IE9ORSA6IE5FR19PTkU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW0gPSB0aGlzLnN1YihkaXZpc29yLm11bChhcHByb3gpKTtcbiAgICAgICAgICAgICAgcmVzID0gYXBwcm94LmFkZChyZW0uZGl2KGRpdmlzb3IpKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5lcShNSU5fVkFMVUUpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgICAgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvci5uZWcoKSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmVnKCkuZGl2KGRpdmlzb3IpLm5lZygpO1xuICAgICAgICB9IGVsc2UgaWYgKGRpdmlzb3IuaXNOZWdhdGl2ZSgpKSByZXR1cm4gdGhpcy5kaXYoZGl2aXNvci5uZWcoKSkubmVnKCk7XG4gICAgICAgIHJlcyA9IFpFUk87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIGJlbG93IGhhcyBub3QgYmVlbiBtYWRlIGZvciB1bnNpZ25lZCBsb25ncy4gSXQncyB0aGVyZWZvcmVcbiAgICAgICAgLy8gcmVxdWlyZWQgdG8gdGFrZSBzcGVjaWFsIGNhcmUgb2YgdGhlIE1TQiBwcmlvciB0byBydW5uaW5nIGl0LlxuICAgICAgICBpZiAoIWRpdmlzb3IudW5zaWduZWQpIGRpdmlzb3IgPSBkaXZpc29yLnRvVW5zaWduZWQoKTtcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcykpIHJldHVybiBVWkVSTztcbiAgICAgICAgaWYgKGRpdmlzb3IuZ3QodGhpcy5zaHJ1KDEpKSlcbiAgICAgICAgICAvLyAxNSA+Pj4gMSA9IDcgOyB3aXRoIGRpdmlzb3IgPSA4IDsgdHJ1ZVxuICAgICAgICAgIHJldHVybiBVT05FO1xuICAgICAgICByZXMgPSBVWkVSTztcbiAgICAgIH1cblxuICAgICAgLy8gUmVwZWF0IHRoZSBmb2xsb3dpbmcgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBsZXNzIHRoYW4gb3RoZXI6ICBmaW5kIGFcbiAgICAgIC8vIGZsb2F0aW5nLXBvaW50IHRoYXQgYXBwcm94aW1hdGVzIHJlbWFpbmRlciAvIG90aGVyICpmcm9tIGJlbG93KiwgYWRkIHRoaXNcbiAgICAgIC8vIGludG8gdGhlIHJlc3VsdCwgYW5kIHN1YnRyYWN0IGl0IGZyb20gdGhlIHJlbWFpbmRlci4gIEl0IGlzIGNyaXRpY2FsIHRoYXRcbiAgICAgIC8vIHRoZSBhcHByb3hpbWF0ZSB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWwgdmFsdWUgc28gdGhhdCB0aGVcbiAgICAgIC8vIHJlbWFpbmRlciBuZXZlciBiZWNvbWVzIG5lZ2F0aXZlLlxuICAgICAgcmVtID0gdGhpcztcbiAgICAgIHdoaWxlIChyZW0uZ3RlKGRpdmlzb3IpKSB7XG4gICAgICAgIC8vIEFwcHJveGltYXRlIHRoZSByZXN1bHQgb2YgZGl2aXNpb24uIFRoaXMgbWF5IGJlIGEgbGl0dGxlIGdyZWF0ZXIgb3JcbiAgICAgICAgLy8gc21hbGxlciB0aGFuIHRoZSBhY3R1YWwgdmFsdWUuXG4gICAgICAgIGFwcHJveCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IocmVtLnRvTnVtYmVyKCkgLyBkaXZpc29yLnRvTnVtYmVyKCkpKTtcblxuICAgICAgICAvLyBXZSB3aWxsIHR3ZWFrIHRoZSBhcHByb3hpbWF0ZSByZXN1bHQgYnkgY2hhbmdpbmcgaXQgaW4gdGhlIDQ4LXRoIGRpZ2l0IG9yXG4gICAgICAgIC8vIHRoZSBzbWFsbGVzdCBub24tZnJhY3Rpb25hbCBkaWdpdCwgd2hpY2hldmVyIGlzIGxhcmdlci5cbiAgICAgICAgdmFyIGxvZzIgPSBNYXRoLmNlaWwoTWF0aC5sb2coYXBwcm94KSAvIE1hdGguTE4yKSxcbiAgICAgICAgICBkZWx0YSA9IGxvZzIgPD0gNDggPyAxIDogcG93X2RibCgyLCBsb2cyIC0gNDgpLFxuICAgICAgICAgIC8vIERlY3JlYXNlIHRoZSBhcHByb3hpbWF0aW9uIHVudGlsIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgcmVtYWluZGVyLiAgTm90ZVxuICAgICAgICAgIC8vIHRoYXQgaWYgaXQgaXMgdG9vIGxhcmdlLCB0aGUgcHJvZHVjdCBvdmVyZmxvd3MgYW5kIGlzIG5lZ2F0aXZlLlxuICAgICAgICAgIGFwcHJveFJlcyA9IGZyb21OdW1iZXIoYXBwcm94KSxcbiAgICAgICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xuICAgICAgICB3aGlsZSAoYXBwcm94UmVtLmlzTmVnYXRpdmUoKSB8fCBhcHByb3hSZW0uZ3QocmVtKSkge1xuICAgICAgICAgIGFwcHJveCAtPSBkZWx0YTtcbiAgICAgICAgICBhcHByb3hSZXMgPSBmcm9tTnVtYmVyKGFwcHJveCwgdGhpcy51bnNpZ25lZCk7XG4gICAgICAgICAgYXBwcm94UmVtID0gYXBwcm94UmVzLm11bChkaXZpc29yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGtub3cgdGhlIGFuc3dlciBjYW4ndCBiZSB6ZXJvLi4uIGFuZCBhY3R1YWxseSwgemVybyB3b3VsZCBjYXVzZVxuICAgICAgICAvLyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2Ugd2Ugd291bGQgbWFrZSBubyBwcm9ncmVzcy5cbiAgICAgICAgaWYgKGFwcHJveFJlcy5pc1plcm8oKSkgYXBwcm94UmVzID0gT05FO1xuICAgICAgICByZXMgPSByZXMuYWRkKGFwcHJveFJlcyk7XG4gICAgICAgIHJlbSA9IHJlbS5zdWIoYXBwcm94UmVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNkaXZpZGV9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUXVvdGllbnRcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmRpdiA9IExvbmdQcm90b3R5cGUuZGl2aWRlO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5tb2R1bG8gPSBmdW5jdGlvbiBtb2R1bG8oZGl2aXNvcikge1xuICAgICAgaWYgKCFpc0xvbmcoZGl2aXNvcikpIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG5cbiAgICAgIC8vIHVzZSB3YXNtIHN1cHBvcnQgaWYgcHJlc2VudFxuICAgICAgaWYgKHdhc20pIHtcbiAgICAgICAgdmFyIGxvdyA9ICh0aGlzLnVuc2lnbmVkID8gd2FzbVtcInJlbV91XCJdIDogd2FzbVtcInJlbV9zXCJdKShcbiAgICAgICAgICB0aGlzLmxvdyxcbiAgICAgICAgICB0aGlzLmhpZ2gsXG4gICAgICAgICAgZGl2aXNvci5sb3csXG4gICAgICAgICAgZGl2aXNvci5oaWdoLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtW1wiZ2V0X2hpZ2hcIl0oKSwgdGhpcy51bnNpZ25lZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZGl2aXNvcikubXVsKGRpdmlzb3IpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgbW9kdWxvIHRoZSBzcGVjaWZpZWQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbW9kdWxvfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJlbWFpbmRlclxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubW9kID0gTG9uZ1Byb3RvdHlwZS5tb2R1bG87XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yZW0gPSBMb25nUHJvdG90eXBlLm1vZHVsbztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgTk9UIG9mIHRoaXMgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubm90ID0gZnVuY3Rpb24gbm90KCkge1xuICAgICAgcmV0dXJuIGZyb21CaXRzKH50aGlzLmxvdywgfnRoaXMuaGlnaCwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcyBvZiB0aGlzIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshbnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudExlYWRpbmdaZXJvcygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2ggPyBNYXRoLmNsejMyKHRoaXMuaGlnaCkgOiBNYXRoLmNsejMyKHRoaXMubG93KSArIDMyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvdW50IGxlYWRpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRMZWFkaW5nWmVyb3N9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jbHogPSBMb25nUHJvdG90eXBlLmNvdW50TGVhZGluZ1plcm9zO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCB0cmFpbGluZyB6ZXJvcyBvZiB0aGlzIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshbnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zID0gZnVuY3Rpb24gY291bnRUcmFpbGluZ1plcm9zKCkge1xuICAgICAgcmV0dXJuIHRoaXMubG93ID8gY3R6MzIodGhpcy5sb3cpIDogY3R6MzIodGhpcy5oaWdoKSArIDMyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvdW50IHRyYWlsaW5nIHplcm9zLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2NvdW50VHJhaWxpbmdaZXJvc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmN0eiA9IExvbmdQcm90b3R5cGUuY291bnRUcmFpbGluZ1plcm9zO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBBTkQgb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gYW5kKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdGhpcy5sb3cgJiBvdGhlci5sb3csXG4gICAgICAgIHRoaXMuaGlnaCAmIG90aGVyLmhpZ2gsXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIHNwZWNpZmllZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3Iob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB0aGlzLmxvdyB8IG90aGVyLmxvdyxcbiAgICAgICAgdGhpcy5oaWdoIHwgb3RoZXIuaGlnaCxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgWE9SIG9mIHRoaXMgTG9uZyBhbmQgdGhlIGdpdmVuIG9uZS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgTG9uZ1xuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvcihvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHRoaXMubG93IF4gb3RoZXIubG93LFxuICAgICAgICB0aGlzLmhpZ2ggXiBvdGhlci5oaWdoLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0ID0gZnVuY3Rpb24gc2hpZnRMZWZ0KG51bUJpdHMpIHtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgIHRoaXMubG93IDw8IG51bUJpdHMsXG4gICAgICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gKDMyIC0gbnVtQml0cykpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICBlbHNlIHJldHVybiBmcm9tQml0cygwLCB0aGlzLmxvdyA8PCAobnVtQml0cyAtIDMyKSwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRMZWZ0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGwgPSBMb25nUHJvdG90eXBlLnNoaWZ0TGVmdDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0ID0gZnVuY3Rpb24gc2hpZnRSaWdodChudW1CaXRzKSB7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBlbHNlIGlmIChudW1CaXRzIDwgMzIpXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICAodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksXG4gICAgICAgICAgdGhpcy5oaWdoID4+IG51bUJpdHMsXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgIHRoaXMuaGlnaCA+PiAobnVtQml0cyAtIDMyKSxcbiAgICAgICAgICB0aGlzLmhpZ2ggPj0gMCA/IDAgOiAtMSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgYXJpdGhtZXRpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdFJpZ2h0fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaHIgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZCA9IGZ1bmN0aW9uIHNoaWZ0UmlnaHRVbnNpZ25lZChudW1CaXRzKSB7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAobnVtQml0cyA8IDMyKVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgKHRoaXMubG93ID4+PiBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPDwgKDMyIC0gbnVtQml0cykpLFxuICAgICAgICAgIHRoaXMuaGlnaCA+Pj4gbnVtQml0cyxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCAwLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2ggPj4+IChudW1CaXRzIC0gMzIpLCAwLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHRVbnNpZ25lZH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hydSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGxvZ2ljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHRVbnNpZ25lZH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hyX3UgPSBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHRVbnNpZ25lZDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJvdGF0ZUxlZnQgPSBmdW5jdGlvbiByb3RhdGVMZWZ0KG51bUJpdHMpIHtcbiAgICAgIHZhciBiO1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gICAgICBpZiAobnVtQml0cyA8IDMyKSB7XG4gICAgICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICAodGhpcy5sb3cgPDwgbnVtQml0cykgfCAodGhpcy5oaWdoID4+PiBiKSxcbiAgICAgICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiBiKSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbnVtQml0cyAtPSAzMjtcbiAgICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+IGIpLFxuICAgICAgICAodGhpcy5sb3cgPDwgbnVtQml0cykgfCAodGhpcy5oaWdoID4+PiBiKSxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3JvdGF0ZUxlZnR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJvdGwgPSBMb25nUHJvdG90eXBlLnJvdGF0ZUxlZnQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90YXRlUmlnaHQgPSBmdW5jdGlvbiByb3RhdGVSaWdodChudW1CaXRzKSB7XG4gICAgICB2YXIgYjtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGlmIChudW1CaXRzID09PSAzMikgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCwgdGhpcy5sb3csIHRoaXMudW5zaWduZWQpO1xuICAgICAgaWYgKG51bUJpdHMgPCAzMikge1xuICAgICAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgKHRoaXMuaGlnaCA8PCBiKSB8ICh0aGlzLmxvdyA+Pj4gbnVtQml0cyksXG4gICAgICAgICAgKHRoaXMubG93IDw8IGIpIHwgKHRoaXMuaGlnaCA+Pj4gbnVtQml0cyksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG51bUJpdHMgLT0gMzI7XG4gICAgICBiID0gMzIgLSBudW1CaXRzO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAodGhpcy5sb3cgPDwgYikgfCAodGhpcy5oaWdoID4+PiBudW1CaXRzKSxcbiAgICAgICAgKHRoaXMuaGlnaCA8PCBiKSB8ICh0aGlzLmxvdyA+Pj4gbnVtQml0cyksXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjcm90YXRlUmlnaHR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSb3RhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJvdHIgPSBMb25nUHJvdG90eXBlLnJvdGF0ZVJpZ2h0O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIHNpZ25lZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaWduZWQgbG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9TaWduZWQgPSBmdW5jdGlvbiB0b1NpZ25lZCgpIHtcbiAgICAgIGlmICghdGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXM7XG4gICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gdW5zaWduZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVW5zaWduZWQgbG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9VbnNpZ25lZCA9IGZ1bmN0aW9uIHRvVW5zaWduZWQoKSB7XG4gICAgICBpZiAodGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXM7XG4gICAgICByZXR1cm4gZnJvbUJpdHModGhpcy5sb3csIHRoaXMuaGlnaCwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvQnl0ZXMgPSBmdW5jdGlvbiB0b0J5dGVzKGxlKSB7XG4gICAgICByZXR1cm4gbGUgPyB0aGlzLnRvQnl0ZXNMRSgpIDogdGhpcy50b0J5dGVzQkUoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBsaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IExpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9CeXRlc0xFID0gZnVuY3Rpb24gdG9CeXRlc0xFKCkge1xuICAgICAgdmFyIGhpID0gdGhpcy5oaWdoLFxuICAgICAgICBsbyA9IHRoaXMubG93O1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbG8gJiAweGZmLFxuICAgICAgICAobG8gPj4+IDgpICYgMHhmZixcbiAgICAgICAgKGxvID4+PiAxNikgJiAweGZmLFxuICAgICAgICBsbyA+Pj4gMjQsXG4gICAgICAgIGhpICYgMHhmZixcbiAgICAgICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIChoaSA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgaGkgPj4+IDI0LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBiaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb24uXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshQXJyYXkuPG51bWJlcj59IEJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9CeXRlc0JFID0gZnVuY3Rpb24gdG9CeXRlc0JFKCkge1xuICAgICAgdmFyIGhpID0gdGhpcy5oaWdoLFxuICAgICAgICBsbyA9IHRoaXMubG93O1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgaGkgPj4+IDI0LFxuICAgICAgICAoaGkgPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIChoaSA+Pj4gOCkgJiAweGZmLFxuICAgICAgICBoaSAmIDB4ZmYsXG4gICAgICAgIGxvID4+PiAyNCxcbiAgICAgICAgKGxvID4+PiAxNikgJiAweGZmLFxuICAgICAgICAobG8gPj4+IDgpICYgMHhmZixcbiAgICAgICAgbG8gJiAweGZmLFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBsZSBXaGV0aGVyIGxpdHRsZSBvciBiaWcgZW5kaWFuLCBkZWZhdWx0cyB0byBiaWcgZW5kaWFuXG4gICAgICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CeXRlcyA9IGZ1bmN0aW9uIGZyb21CeXRlcyhieXRlcywgdW5zaWduZWQsIGxlKSB7XG4gICAgICByZXR1cm4gbGVcbiAgICAgICAgPyBMb25nLmZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZClcbiAgICAgICAgOiBMb25nLmZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tQnl0ZXNMRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0xFKGJ5dGVzLCB1bnNpZ25lZCkge1xuICAgICAgcmV0dXJuIG5ldyBMb25nKFxuICAgICAgICBieXRlc1swXSB8IChieXRlc1sxXSA8PCA4KSB8IChieXRlc1syXSA8PCAxNikgfCAoYnl0ZXNbM10gPDwgMjQpLFxuICAgICAgICBieXRlc1s0XSB8IChieXRlc1s1XSA8PCA4KSB8IChieXRlc1s2XSA8PCAxNikgfCAoYnl0ZXNbN10gPDwgMjQpLFxuICAgICAgICB1bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb25nIGZyb20gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAcGFyYW0geyFBcnJheS48bnVtYmVyPn0gYnl0ZXMgQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHtMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tQnl0ZXNCRSA9IGZ1bmN0aW9uIGZyb21CeXRlc0JFKGJ5dGVzLCB1bnNpZ25lZCkge1xuICAgICAgcmV0dXJuIG5ldyBMb25nKFxuICAgICAgICAoYnl0ZXNbNF0gPDwgMjQpIHwgKGJ5dGVzWzVdIDw8IDE2KSB8IChieXRlc1s2XSA8PCA4KSB8IGJ5dGVzWzddLFxuICAgICAgICAoYnl0ZXNbMF0gPDwgMjQpIHwgKGJ5dGVzWzFdIDw8IDE2KSB8IChieXRlc1syXSA8PCA4KSB8IGJ5dGVzWzNdLFxuICAgICAgICB1bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN1cHBvcnQgY29udmVyc2lvbiB0by9mcm9tIEJpZ0ludCB3aGVyZSBhdmFpbGFibGVcbiAgICBpZiAodHlwZW9mIEJpZ0ludCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvKipcbiAgICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gYmlnIGludGVnZXIuXG4gICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgYmlnIGludGVnZXIgdmFsdWVcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAgICovXG4gICAgICBMb25nLmZyb21CaWdJbnQgPSBmdW5jdGlvbiBmcm9tQmlnSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgICB2YXIgbG93Qml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSkpO1xuICAgICAgICB2YXIgaGlnaEJpdHMgPSBOdW1iZXIoQmlnSW50LmFzSW50TigzMiwgdmFsdWUgPj4gQmlnSW50KDMyKSkpO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93Qml0cywgaGlnaEJpdHMsIHVuc2lnbmVkKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIE92ZXJyaWRlXG4gICAgICBMb25nLmZyb21WYWx1ZSA9IGZ1bmN0aW9uIGZyb21WYWx1ZVdpdGhCaWdJbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHJldHVybiBmcm9tQmlnSW50KHZhbHVlLCB1bnNpZ25lZCk7XG4gICAgICAgIHJldHVybiBmcm9tVmFsdWUodmFsdWUsIHVuc2lnbmVkKTtcbiAgICAgIH07XG5cbiAgICAgIC8qKlxuICAgICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gaXRzIGJpZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLlxuICAgICAgICogQHRoaXMgeyFMb25nfVxuICAgICAgICogQHJldHVybnMge2JpZ2ludH1cbiAgICAgICAqL1xuICAgICAgTG9uZ1Byb3RvdHlwZS50b0JpZ0ludCA9IGZ1bmN0aW9uIHRvQmlnSW50KCkge1xuICAgICAgICB2YXIgbG93QmlnSW50ID0gQmlnSW50KHRoaXMubG93ID4+PiAwKTtcbiAgICAgICAgdmFyIGhpZ2hCaWdJbnQgPSBCaWdJbnQodGhpcy51bnNpZ25lZCA/IHRoaXMuaGlnaCA+Pj4gMCA6IHRoaXMuaGlnaCk7XG4gICAgICAgIHJldHVybiAoaGlnaEJpZ0ludCA8PCBCaWdJbnQoMzIpKSB8IGxvd0JpZ0ludDtcbiAgICAgIH07XG4gICAgfVxuICAgIHZhciBfZGVmYXVsdCA9IChfZXhwb3J0cy5kZWZhdWx0ID0gTG9uZyk7XG4gIH0sXG4pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyBIZWxwZXJzLlxuY29uc3QgcyA9IDEwMDA7XG5jb25zdCBtID0gcyAqIDYwO1xuY29uc3QgaCA9IG0gKiA2MDtcbmNvbnN0IGQgPSBoICogMjQ7XG5jb25zdCB3ID0gZCAqIDc7XG5jb25zdCB5ID0gZCAqIDM2NS4yNTtcbmZ1bmN0aW9uIG1zKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM/LmxvbmcgPyBmbXRMb25nKHZhbHVlKSA6IGZtdFNob3J0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGlzIG5vdCBhIHN0cmluZyBvciBudW1iZXIuJyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gaXNFcnJvcihlcnJvcilcbiAgICAgICAgICAgID8gYCR7ZXJyb3IubWVzc2FnZX0uIHZhbHVlPSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWBcbiAgICAgICAgICAgIDogJ0FuIHVua25vd24gZXJyb3IgaGFzIG9jY3VyZWQuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn1cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICovXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLicpO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIGNvbnN0IHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAneXJzJzpcbiAgICAgICAgY2FzZSAneXInOlxuICAgICAgICBjYXNlICd5JzpcbiAgICAgICAgICAgIHJldHVybiBuICogeTtcbiAgICAgICAgY2FzZSAnd2Vla3MnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAndyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHc7XG4gICAgICAgIGNhc2UgJ2RheXMnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgIHJldHVybiBuICogZDtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICBjYXNlICdob3VyJzpcbiAgICAgICAgY2FzZSAnaHJzJzpcbiAgICAgICAgY2FzZSAnaHInOlxuICAgICAgICBjYXNlICdoJzpcbiAgICAgICAgICAgIHJldHVybiBuICogaDtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIHJldHVybiBuICogbTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ3NlY3MnOlxuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzJzpcbiAgICAgICAgICAgIHJldHVybiBuICogcztcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICBjYXNlICdtc2Vjcyc6XG4gICAgICAgIGNhc2UgJ21zZWMnOlxuICAgICAgICBjYXNlICdtcyc6XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyLlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdW5pdCAke3R5cGV9IHdhcyBtYXRjaGVkLCBidXQgbm8gbWF0Y2hpbmcgY2FzZSBleGlzdHMuYCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gbXM7XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqL1xuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIGQpfWRgO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIGgpfWhgO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG0pfW1gO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIHMpfXNgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXN9bXNgO1xufVxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqL1xuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gbSkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gcykge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXN9IG1zYDtcbn1cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICBjb25zdCBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBuKX0gJHtuYW1lfSR7aXNQbHVyYWwgPyAncycgOiAnJ31gO1xufVxuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGVycm9ycy5cbiAqL1xuZnVuY3Rpb24gaXNFcnJvcihlcnJvcikge1xuICAgIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdtZXNzYWdlJyBpbiBlcnJvcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdDtcbiIsIi8vIEhlbHBlcnMuXG5jb25zdCBzID0gMTAwMDtcbmNvbnN0IG0gPSBzICogNjA7XG5jb25zdCBoID0gbSAqIDYwO1xuY29uc3QgZCA9IGggKiAyNDtcbmNvbnN0IHcgPSBkICogNztcbmNvbnN0IHkgPSBkICogMzY1LjI1O1xuZnVuY3Rpb24gbXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucz8ubG9uZyA/IGZtdExvbmcodmFsdWUpIDogZm10U2hvcnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG51bWJlci4nKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBpc0Vycm9yKGVycm9yKVxuICAgICAgICAgICAgPyBgJHtlcnJvci5tZXNzYWdlfS4gdmFsdWU9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgICAgICAgOiAnQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJlZC4nO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxufVxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHN0cik7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICBjb25zdCBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gICAgY29uc3QgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB1bml0ICR7dHlwZX0gd2FzIG1hdGNoZWQsIGJ1dCBubyBtYXRjaGluZyBjYXNlIGV4aXN0cy5gKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBtcztcbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICAgIGNvbnN0IG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gZCl9ZGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gaCl9aGA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbSl9bWA7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gcyl9c2A7XG4gICAgfVxuICAgIHJldHVybiBgJHttc31tc2A7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICovXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gICAgfVxuICAgIHJldHVybiBgJHttc30gbXNgO1xufVxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICAgIGNvbnN0IGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChtcyAvIG4pfSAke25hbWV9JHtpc1BsdXJhbCA/ICdzJyA6ICcnfWA7XG59XG4vKipcbiAqIEEgdHlwZSBndWFyZCBmb3IgZXJyb3JzLlxuICovXG5mdW5jdGlvbiBpc0Vycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ21lc3NhZ2UnIGluIGVycm9yO1xufVxuIiwiXG5jbGFzcyBQcm9ncmVzc1NwYW4ge1xuICAgIHVuaXRzRG9uZTogbnVtYmVyO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJlbnQ6IFByb2dyZXNzLCBwdWJsaWMgcGFyZW50VW5pdHM6IG51bWJlciwgcHVibGljIHNwYW5Vbml0czogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudW5pdHNEb25lID0gMDtcbiAgICB9XG5cbiAgICBkb25lKHVuaXRzPzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuc3BhblVuaXRzIC0gdGhpcy51bml0c0RvbmU7XG4gICAgICAgIGlmICghcmVtYWluaW5nKSByZXR1cm47IC8vIGlnbm9yZSBpZiBhbHJlYWR5IGRvbmVcbiAgICAgICAgaWYgKCF1bml0cyB8fCB1bml0cyA+IHJlbWFpbmluZykge1xuICAgICAgICAgICAgdW5pdHMgPSByZW1haW5pbmc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bml0c0RvbmUgKz0gdW5pdHM7XG4gICAgICAgIHRoaXMucGFyZW50LmRvbmUodW5pdHMgKiB0aGlzLnBhcmVudFVuaXRzIC8gdGhpcy5zcGFuVW5pdHMpO1xuICAgIH1cblxuICAgIGdldCBwYXJlbnRVbml0c0RvbmUoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMudW5pdHNEb25lICogdGhpcy5wYXJlbnRVbml0cyAvIHRoaXMuc3BhblVuaXRzKTtcbiAgICB9XG5cbiAgICBnZXQgaXNEb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bml0c0RvbmUgPj0gdGhpcy5zcGFuVW5pdHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3Mge1xuICAgIHVuaXRzRG9uZTogbnVtYmVyID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0b3RhbDogbnVtYmVyKSB7XG4gICAgfVxuXG4gICAgZ2V0IGZyYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bml0c0RvbmUgLyB0aGlzLnRvdGFsO1xuICAgIH1cblxuICAgIGdldCBwZXJjZW50KCkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLmZyYWN0aW9uICogMTAwKTtcbiAgICB9XG5cbiAgICBnZXQgaXNEb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bml0c0RvbmUgPj0gdGhpcy50b3RhbDtcbiAgICB9XG5cbiAgICBkb25lKHVuaXRzPzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMudG90YWwgLSB0aGlzLnVuaXRzRG9uZTtcbiAgICAgICAgaWYgKCFyZW1haW5pbmcpIHJldHVybjsgLy8gaWdub3JlIGlmIGFscmVhZHkgZG9uZVxuICAgICAgICBpZiAoIXVuaXRzIHx8IHVuaXRzID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgICB1bml0cyA9IHJlbWFpbmluZztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuaXRzRG9uZSArPSB1bml0cztcbiAgICB9XG5cbiAgICBzcGFuKHVuaXRzOiBudW1iZXIsIHNwYW5Vbml0cz86IG51bWJlcik6IFByb2dyZXNzU3BhbiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZ3Jlc3NTcGFuKHRoaXMsIHVuaXRzLCBzcGFuVW5pdHMgfHwgdW5pdHMpO1xuICAgIH1cbn0iLCIvKipcbiAqIEBtb2R1bGUgYWNjZXNzLWNvbnRyb2xcbiAqIEBkZXNjcmlwdGlvblxuICogQWNjZXNzIGNvbnRyb2wgaW50ZXJmYWNlc1xuICovXG5cbmltcG9ydCB7IFByb2plY3RSb2xlcyB9IGZyb20gXCIuL3Byb2plY3QuanNcIjtcblxuZXhwb3J0IGVudW0gUGVybWlzc2lvbiB7XG4gICAgaW50X3JlYWQgPSBcImludGVyYWN0aW9uOnJlYWRcIixcbiAgICBpbnRfd3JpdGUgPSBcImludGVyYWN0aW9uOndyaXRlXCIsXG4gICAgaW50X2RlbGV0ZSA9IFwiaW50ZXJhY3Rpb246ZGVsZXRlXCIsXG5cbiAgICBpbnRfZXhlY3V0ZSA9IFwiaW50ZXJhY3Rpb246ZXhlY3V0ZVwiLFxuICAgIHJ1bl9yZWFkID0gXCJydW46cmVhZFwiLFxuICAgIHJ1bl93cml0ZSA9IFwicnVuOndyaXRlXCIsXG5cbiAgICBlbnZfbWFuYWdlID0gXCJlbnZpcm9ubWVudDptYW5hZ2VcIixcblxuICAgIHByb2plY3RfbWFuYWdlID0gXCJwcm9qZWN0Om1hbmFnZVwiLFxuXG4gICAgYXBpX2tleV9jcmVhdGUgPSBcImFwaV9rZXk6Y3JlYXRlXCIsXG4gICAgYXBpX2tleV9yZWFkID0gXCJhcGlfa2V5OnJlYWRcIixcblxuICAgIGFjY291bnRfcmVhZCA9IFwiYWNjb3VudDpyZWFkXCIsXG4gICAgYWNjb3VudF9tYW5hZ2UgPSBcImFjY291bnQ6bWFuYWdlXCIsXG4gICAgbWFuYWdlX2JpbGxpbmcgPSBcImFjY291bnQ6YmlsbGluZ1wiLFxuICAgIGFjY291bnRfbWVtYmVyID0gXCJhY2NvdW50Om1lbWJlclwiLFxuXG5cbiAgICBjb250ZW50X3JlYWQgPSBcImNvbnRlbnQ6cmVhZFwiLFxuICAgIGNvbnRlbnRfY3JlYXRlID0gXCJjb250ZW50OmNyZWF0ZVwiLFxuICAgIGNvbnRlbnRfdXBkYXRlID0gXCJjb250ZW50OnVwZGF0ZVwiLFxuICAgIGNvbnRlbnRfZGVsZXRlID0gXCJjb250ZW50OmRlbGV0ZVwiLFxuXG4gICAgY29udGVudF9hZG1pbiA9IFwiY29udGVudDphZG1pblwiLCAvL21hbmFnZSBzY2hlbWFzLCB3b3JrZmxvd3MsIHJ1bGVzXG5cbiAgICB3b3JrZmxvd19ydW4gPSBcIndvcmtmbG93OnJ1blwiLFxufVxuXG5leHBvcnQgZW51bSBBY2Nlc3NDb250cm9sbGVkUmVzb3VyY2Uge1xuICAgIHByb2plY3QgPSBcInByb2plY3RcIixcbiAgICBlbnZpcm9ubWVudCA9IFwiZW52aXJvbm1lbnRcIixcbiAgICBhY2NvdW50ID0gXCJhY2NvdW50XCIsXG4gICAgaW50ZXJhY3Rpb24gPSBcImludGVyYWN0aW9uXCIsXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250cm9sRW50cnkge1xuICAgIHJvbGU6IFByb2plY3RSb2xlcztcbiAgICByZXNvdXJjZTogc3RyaW5nOyAvL29iamVjdElkXG4gICAgcHJpbmNpcGFsOiBzdHJpbmc7IC8vb2JqZWN0SWRcbiAgICB0eXBlOiBBY2Nlc3NDb250cm9sbGVkUmVzb3VyY2U7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIGV4cGlyZXNfYXQ/OiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICB1cGRhdGVkX2F0Pzogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUNFQ3JlYXRlUGF5bG9hZCBleHRlbmRzXG4gICAgT21pdDxBY2Nlc3NDb250cm9sRW50cnksIFwiY3JlYXRlZF9hdFwiIHwgXCJ1cGRhdGVkX2F0XCIgfCBcImlkXCI+IHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBQ0VVcGRhdGVQYXlsb2FkIGV4dGVuZHMgUGFydGlhbDxBQ0VDcmVhdGVQYXlsb2FkPiB7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBBY2VzUXVlcnlPcHRpb25zIHtcblxuICAgIGxldmVsPzogJ3Jlc291cmNlJyB8ICdwcm9qZWN0JyB8ICdhY2NvdW50J1xuICAgIHJlc291cmNlPzogc3RyaW5nXG4gICAgcHJpbmNpcGFsPzogc3RyaW5nXG4gICAgcm9sZT86IHN0cmluZ1xuICAgIHR5cGU/OiBBY2Nlc3NDb250cm9sbGVkUmVzb3VyY2VcblxufSIsIlxuZXhwb3J0IGludGVyZmFjZSBBbmFseXRpY3NBeGlzIHtcbiAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICBwcm9qZWN0Pzogc3RyaW5nO1xuICAgIGludGVyYWN0aW9ucz86IHN0cmluZ1tdO1xuICAgIG1vZGVscz86IHN0cmluZ1tdO1xuICAgIHN0YXR1cz86IHN0cmluZ1tdO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBzZWxlY3RlZE9ubHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bkFuYWx5dGljc1F1ZXJ5IHtcblxuICAgIC8qKiBmaWx0ZXJzIHRvIGFwcGx5IHRvIHRoZSBxdWVyeSAqL1xuICAgIGZpbHRlckJ5OiBBbmFseXRpY3NBeGlzO1xuXG4gICAgLyoqIFRoZSBmaWVsZCB0byBncm91cCBieSAqL1xuICAgIGdyb3VwQnk/OiBSdW5BbmFseXRpY3NHcm91cEJ5XG5cbiAgICAvKiogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHF1ZXJ5IGluIEVQT0NIIGZvcm1hdCAqL1xuICAgIGZyb20/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBlbmQgZGF0ZSBvZiB0aGUgcXVlcnkgaW4gRVBPQ0ggZm9ybWF0ICovXG4gICAgdG8/OiBudW1iZXI7XG5cbiAgICAvKiogVGhlIHRpbWUgcmVzb2x1dGlvbiBvZiB0aGUgYW5hbHl0aWNzIHF1ZXJ5ICovXG4gICAgcmVzb2x1dGlvbj86IFRpbWVSZXNvbHV0aW9uO1xuXG4gICAgLyoqIFRoZSBmaWVsZCB0byBzb3J0IGJ5ICovXG4gICAgdmlydHVhbD86IGJvb2xlYW47XG5cbn1cblxuXG5leHBvcnQgdHlwZSBSdW5BbmFseXRpY3NHcm91cEJ5ID0gXCJpbnRlcmFjdGlvblwiIHwgXCJtb2RlbElkXCIgfCBcInByb2plY3RcIiB8IFwic3RhdHVzXCIgfCBcInRhZ3NcIiB8IFwiZW52aXJvbm1lbnRcIjtcblxuZXhwb3J0IHR5cGUgVGltZVJlc29sdXRpb24gPSBcImhvdXJcIiB8IFwiZGF5XCIgfCBcIndlZWtcIiB8IFwibW9udGhcIiB8IFwieWVhclwiO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQW5hbHl0aWNzUmVzdWx0IHtcbiAgICBkYXRlOiBzdHJpbmcsXG4gICAgdGltZXN0YW1wOiBzdHJpbmcsXG4gICAgZ3JvdXA6IHN0cmluZ1xuICAgIGNvdW50OiBudW1iZXIsXG4gICAgZXhlY3V0aW9uX3RpbWU6IHtcbiAgICAgICAgYXZnOiBudW1iZXIsXG4gICAgICAgIG1pbjogbnVtYmVyLFxuICAgICAgICBtYXg6IG51bWJlclxuICAgIH0sXG59XG4iLCJpbXBvcnQgeyBQcm9qZWN0UmVmLCBQcm9qZWN0Um9sZXMgfSBmcm9tIFwiLi9wcm9qZWN0LmpzXCI7XG5pbXBvcnQgeyBBY2NvdW50UmVmIH0gZnJvbSBcIi4vdXNlci5qc1wiO1xuXG5cbmV4cG9ydCBlbnVtIEFwaUtleVR5cGVzIHtcbiAgICBwdWJsaWMgPSAncGsnLFxuICAgIHNlY3JldCA9ICdzaydcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXBpS2V5IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBBcGlLZXlUeXBlcztcbiAgICByb2xlOiBQcm9qZWN0Um9sZXM7XG4gICAgbWFza2VkVmFsdWU/OiBzdHJpbmc7IC8vbWFza2VkIHZhbHVlXG4gICAgYWNjb3VudDogc3RyaW5nOyAvLyB0aGUgYWNjb3VudCBpZFxuICAgIHByb2plY3Q6IHN0cmluZzsgLy8gdGhlIHByb2plY3QgaWQgaWYgYW55XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBjcmVhdGVkX2J5OiBzdHJpbmcsXG4gICAgdXBkYXRlZF9ieTogc3RyaW5nLFxuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbiAgICBleHBpcmVzX2F0PzogRGF0ZTsgLy8gaW4gY2FzZSBvZiBwdWJsaWMga2V5IG9ubHlcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9yVXBkYXRlQXBpS2V5UGF5bG9hZCBleHRlbmRzIFBhcnRpYWw8QXBpS2V5PiB7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlLZXlXaXRoVmFsdWUgZXh0ZW5kcyBPbWl0PEFwaUtleSwgJ21hc2tlZFZhbHVlJz4ge1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVQdWJsaWNLZXlQYXlsb2FkIHtcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHByb2plY3RJZD86IHN0cmluZyxcbiAgICB0dGw/OiBudW1iZXIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFRva2VuUmVzcG9uc2Uge1xuICAgIHRva2VuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFRva2VuUGF5bG9hZCB7XG4gICAgc3ViOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW1haWw/OiBzdHJpbmc7XG4gICAgcGljdHVyZT86IHN0cmluZztcblxuICAgIHR5cGU6IFByaW5jaXBhbFR5cGVcbiAgICBhY2NvdW50OiBBY2NvdW50UmVmO1xuICAgIGFjY291bnRfcm9sZXM6IFByb2plY3RSb2xlc1tdO1xuICAgIGFjY291bnRzOiBBY2NvdW50UmVmW107XG4gICAgcHJvamVjdD86IFByb2plY3RSZWY7XG4gICAgcHJvamVjdF9yb2xlcz86IFByb2plY3RSb2xlc1tdO1xuXG4gICAgaXNzOiBzdHJpbmc7IC8vaXNzdWVyXG4gICAgYXVkOiBzdHJpbmc7IC8vYXVkaWVuY2VcbiAgICBleHA6IG51bWJlcjsgLy9leHBpcmVzIGluIChFUE9DIHNlY29uZHMpXG59XG5cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsVHlwZSB7XG4gICAgVXNlciA9IFwidXNlclwiLFxuICAgIEFwaUtleSA9IFwiYXBpa2V5XCIsXG4gICAgU2VydmljZUFjY291bnQgPSBcInNlcnZpY2VfYWNjb3VudFwiLFxufSIsImV4cG9ydCBpbnRlcmZhY2UgRmluZFBheWxvYWQge1xuICAgIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBzZWxlY3Q/OiBzdHJpbmc7XG4gICAgYWxsX3JldmlzaW9ucz86IGJvb2xlYW47XG4gICAgZnJvbV9yb290Pzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY0NvbW1hbmRSZXNwb25zZSB7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGVycj86IGFueTtcbiAgICBkZXRhaWxzPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25QYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBcImNoYW5nZV90eXBlXCIgfCBcImRlbGV0ZVwiIHwgXCJzdGFydF93b3JrZmxvd1wiIHwgXCJ1cGRhdGVcIjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBJRHMgb2YgdGhlIG9iamVjdHMgdG8gb3BlcmF0ZSBvblxuICAgICAqL1xuICAgIGlkczogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25SZXN1bHQge1xuICAgIHN0YXR1czogXCJpbl9wcm9ncmVzc1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCI7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFJTW9kZWwsIFRleHRGYWxsYmFja09wdGlvbnMgfSBmcm9tIFwiQGxsdW1pdmVyc2UvY29tbW9uXCI7XG5cblxuZXhwb3J0IGVudW0gU3VwcG9ydGVkUHJvdmlkZXJzIHtcbiAgICAvLyBmcm9tIGxsdW1pdmVyc2VcbiAgICBvcGVuYWkgPSAnb3BlbmFpJyxcbiAgICBhenVyZV9vcGVuYWkgPSAnYXp1cmVfb3BlbmFpJyxcbiAgICBodWdnaW5nZmFjZV9pZSA9ICdodWdnaW5nZmFjZV9pZScsXG4gICAgcmVwbGljYXRlID0gJ3JlcGxpY2F0ZScsXG4gICAgYmVkcm9jayA9ICdiZWRyb2NrJyxcbiAgICB2ZXJ0ZXhhaSA9ICd2ZXJ0ZXhhaScsXG4gICAgdG9nZXRoZXJhaSA9ICd0b2dldGhlcmFpJyxcbiAgICBtaXN0cmFsYWkgPSAnbWlzdHJhbGFpJyxcbiAgICBncm9xID0gJ2dyb3EnLFxuICAgIHdhdHNvbnggPSAnd2F0c29ueCcsXG4gICAgLy8gZnJvbSBzdHVkaW9cbiAgICB2aXJ0dWFsX2xiID0gJ3ZpcnR1YWxfbGInLFxuICAgIHZpcnR1YWxfbWVkaWF0b3IgPSAndmlydHVhbF9tZWRpYXRvcicsXG4gICAgdGVzdCA9ICd0ZXN0J1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHBvcnRlZFByb3ZpZGVyUGFyYW1zIHtcbiAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICByZXF1aXJlc0FwaUtleTogYm9vbGVhbjtcbiAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBib29sZWFuO1xuICAgIGVuZHBvaW50UGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gICAgc3VwcG9ydFNlYXJjaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRQcm92aWRlcnNMaXN0OiBSZWNvcmQ8U3VwcG9ydGVkUHJvdmlkZXJzLCBTdXBwb3J0ZWRQcm92aWRlclBhcmFtcz4gPSB7XG4gICAgJ29wZW5haSc6XG4gICAge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLm9wZW5haSxcbiAgICAgICAgbmFtZTogXCJPcGVuQUlcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IHRydWUsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxuICAgICdhenVyZV9vcGVuYWknOlxuICAgIHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy5henVyZV9vcGVuYWksXG4gICAgICAgIG5hbWU6IFwiQXp1cmUgT3BlbkFJXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogdHJ1ZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbiAgICAnaHVnZ2luZ2ZhY2VfaWUnOlxuICAgIHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy5odWdnaW5nZmFjZV9pZSxcbiAgICAgICAgbmFtZTogXCJIdWdnaW5nRmFjZSBJbmZlcmVuY2UgRW5kcG9pbnRcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IHRydWUsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IHRydWUsXG4gICAgfSxcbiAgICAncmVwbGljYXRlJzpcbiAgICB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMucmVwbGljYXRlLFxuICAgICAgICBuYW1lOiBcIlJlcGljYXRlXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiB0cnVlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogdHJ1ZSxcbiAgICB9LFxuICAgICdiZWRyb2NrJzpcbiAgICB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMuYmVkcm9jayxcbiAgICAgICAgbmFtZTogXCJBV1MgQmVkcm9ja1wiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBlbmRwb2ludFBsYWNlaG9sZGVyOiBcInJlZ2lvbiBuYW1lIChlZy4gdXMtZWFzdC0xKVwiLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxuICAgIHZlcnRleGFpOiB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMudmVydGV4YWksXG4gICAgICAgIG5hbWU6IFwiR29vZ2xlIFZlcnRleCBBSVwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxuICAgIHRvZ2V0aGVyYWk6IHtcbiAgICAgICAgaWQ6IFN1cHBvcnRlZFByb3ZpZGVycy50b2dldGhlcmFpLFxuICAgICAgICBuYW1lOiBcIlRvZ2V0aGVyIEFJXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlLFxuICAgIH0sXG4gICAgbWlzdHJhbGFpOiB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMubWlzdHJhbGFpLFxuICAgICAgICBuYW1lOiBcIk1pc3RyYWwgQUlcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IGZhbHNlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbiAgICBncm9xOiB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMuZ3JvcSxcbiAgICAgICAgbmFtZTogXCJHcm9xIENsb3VkXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlLFxuICAgIH0sXG4gICAgd2F0c29ueDoge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLndhdHNvbngsXG4gICAgICAgIG5hbWU6IFwiSUJNIFdhdHNvblhcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IHRydWUsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IHRydWUsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlXG4gICAgfSxcbiAgICAndmlydHVhbF9sYic6XG4gICAge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLnZpcnR1YWxfbGIsXG4gICAgICAgIG5hbWU6IFwiVmlydHVhbCAtIExvYWQgQmFsYW5jZXJcIixcbiAgICAgICAgcmVxdWlyZXNBcGlLZXk6IGZhbHNlLFxuICAgICAgICByZXF1aXJlc0VuZHBvaW50VXJsOiBmYWxzZSxcbiAgICAgICAgc3VwcG9ydFNlYXJjaDogZmFsc2UsXG4gICAgfSxcbiAgICAndmlydHVhbF9tZWRpYXRvcic6XG4gICAge1xuICAgICAgICBpZDogU3VwcG9ydGVkUHJvdmlkZXJzLnZpcnR1YWxfbWVkaWF0b3IsXG4gICAgICAgIG5hbWU6IFwiVmlydHVhbCAtIE1lZGlhdG9yXCIsXG4gICAgICAgIHJlcXVpcmVzQXBpS2V5OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZXNFbmRwb2ludFVybDogZmFsc2UsXG4gICAgICAgIHN1cHBvcnRTZWFyY2g6IGZhbHNlLFxuICAgIH0sXG4gICAgJ3Rlc3QnOiB7XG4gICAgICAgIGlkOiBTdXBwb3J0ZWRQcm92aWRlcnMudGVzdCxcbiAgICAgICAgbmFtZTogXCJUZXN0IExMTVwiLFxuICAgICAgICByZXF1aXJlc0FwaUtleTogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVzRW5kcG9pbnRVcmw6IGZhbHNlLFxuICAgICAgICBzdXBwb3J0U2VhcmNoOiBmYWxzZSxcbiAgICB9LFxufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIFZpcnR1YWxFbnZFbnRyeSB7XG4gICAgbW9kZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDdXN0b20gY29uZmlndXJhdGlvbiBmb3IgdmlydHVhbCBlbnZpcm9ubWVudHNcbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZEJhbGFuY2luZ0VudkNvbmZpZyB7XG4gICAgZW50cmllcz86IExvYWRCYWxhbmNpbmdFbnZFbnRyeUNvbmZpZ1tdO1xuICAgIGJhbGFuY2VfaWZfZmFpbGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkQmFsYW5jaW5nRW52RW50cnlDb25maWcgZXh0ZW5kcyBWaXJ0dWFsRW52RW50cnkge1xuICAgIHdlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhdG9yRW52Q29uZmlnIHtcbiAgICBlbnRyaWVzPzogVmlydHVhbEVudkVudHJ5W107XG4gICAgbWF4X2NvbmN1cnJlbnRfcmVxdWVzdHM/OiBudW1iZXI7XG4gICAgLy8gdGhlIG1vZGVsIHVzZWQgdG8gZXZhbHVhdGUgdGhlIHJlc3BvbnNlcy4gSWYgbm90IHNwZWNpZmllZCBhbGwgZW50cmllcyB3aWxsIG1lZGlhdGVzIHRoZSByZXNwb25zZVxuICAgIC8vIGFuZCB0aGUgYmVzdCByZXNwb25zZSB3aWxsIGJlIHBpY2tlZFxuICAgIG1lZGlhdG9ycz86IFZpcnR1YWxFbnZFbnRyeVtdO1xuICAgIG1vZGVsX29wdGlvbnM/OiBUZXh0RmFsbGJhY2tPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkVudmlyb25tZW50IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBwcm92aWRlcjogU3VwcG9ydGVkUHJvdmlkZXJzO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGVuZHBvaW50X3VybD86IHN0cmluZztcbiAgICBkZWZhdWx0X21vZGVsPzogc3RyaW5nO1xuICAgIGVuYWJsZWRfbW9kZWxzPzogQUlNb2RlbFtdO1xuICAgIGFwaUtleT86IHN0cmluZztcbiAgICBjb25maWc/OiBhbnk7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGFsbG93ZWRfcHJvamVjdHM/OiBzdHJpbmdbXTtcbiAgICBjcmVhdGVkX2J5OiBzdHJpbmcsXG4gICAgdXBkYXRlZF9ieTogc3RyaW5nLFxuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uRW52aXJvbm1lbnRSZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHByb3ZpZGVyOiBTdXBwb3J0ZWRQcm92aWRlcnM7XG4gICAgZW5hYmxlZF9tb2RlbHM/OiBBSU1vZGVsW107XG4gICAgZGVmYXVsdF9tb2RlbD86IHN0cmluZztcbiAgICBlbmRwb2ludF91cmw/OiBzdHJpbmc7XG4gICAgYWxsb3dlZF9wcm9qZWN0cz86IHN0cmluZ1tdO1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBjcmVhdGVkX2J5OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9ieTogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRpb25FbnZpcm9ubWVudFJlZlBvcHVsYXRlID0gXCJpZCBuYW1lIHByb3ZpZGVyIGVuYWJsZWRfbW9kZWxzIGRlZmF1bHRfbW9kZWwgZW5kcG9pbnRfdXJsIGFsbG93ZWRfcHJvamVjdHMgYWNjb3VudCBjcmVhdGVkX2F0IHVwZGF0ZWRfYXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25FbnZpcm9ubWVudENyZWF0ZVBheWxvYWQgZXh0ZW5kcyBPbWl0PEV4ZWN1dGlvbkVudmlyb25tZW50LCAnaWQnIHwgJ2FjY291bnQnIHwgJ2NyZWF0ZWRfYXQnIHwgJ3VwZGF0ZWRfYXQnIHwgJ2NyZWF0ZWRfYnknIHwgJ3VwZGF0ZWRfYnknIHwgJ3Byb2plY3QnPiB7IH1cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uRW52aXJvbm1lbnRVcGRhdGVQYXlsb2FkIGV4dGVuZHMgUGFydGlhbDxPbWl0PEV4ZWN1dGlvbkVudmlyb25tZW50LCAnaWQnIHwgJ2FjY291bnQnIHwgJ2NyZWF0ZWRfYXQnIHwgJ3VwZGF0ZWRfYXQnIHwgJ2NyZWF0ZWRfYnknIHwgJ3VwZGF0ZWRfYnknPj4geyB9XG4iLCJcbi8vIHRoaXMgaXMgdGhlIG1vbmdvIGRlZmluaXRpb24gb2YgYSBmYWNldC4gc2VlIGh0dHBzOi8vd3d3Lm1vbmdvZGIuY29tL2RvY3MvYXRsYXMvYXRsYXMtc2VhcmNoL2ZhY2V0L1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdGYWNldCB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbnVtQnVja2V0cz86IG51bWJlcixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOdW1lcmljRmFjZXQge1xuICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvdW5kYXJpZXM6IG51bWJlcltdLFxuICAgIGRlZmF1bHQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRlRmFjZXQ8VCBleHRlbmRzIChEYXRlIHwgc3RyaW5nKSA9IHN0cmluZz4ge1xuICAgIHR5cGU6IFwiZGF0ZVwiLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib3VuZGFyaWVzOiBUW10sIC8vIGFycmF5IG9mIGRhdGVzXG4gICAgZGVmYXVsdD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBGYWNldDxEYXRlVCBleHRlbmRzIChEYXRlIHwgc3RyaW5nKSA9IHN0cmluZz4gPSBTdHJpbmdGYWNldCB8IE51bWVyaWNGYWNldCB8IERhdGVGYWNldDxEYXRlVD47XG5cblxuZXhwb3J0IGludGVyZmFjZSBGYWNldFNwZWMge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhY2V0QnVja2V0IHtcbiAgICBfaWQ6IHN0cmluZyxcbiAgICBjb3VudDogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhY2V0TmFtZUJ1Y2tldCB7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIF9pZDogc3RyaW5nLFxuICAgIGNvdW50OiBudW1iZXIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjZXRSZXN1bHQge1xuICAgIGJ1Y2tldHM6IEZhY2V0QnVja2V0W11cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vYWNjZXNzLWNvbnRyb2wuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hbmFseXRpY3MuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9hcGlrZXkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnZpcm9ubWVudC5qcyc7XG5leHBvcnQgKiBmcm9tIFwiLi9mYWNldHMuanNcIjtcbmV4cG9ydCAqIGZyb20gJy4vaW50ZWdyYXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJhY3Rpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXlsb2FkLmpzJztcbmV4cG9ydCAqIGZyb20gXCIuL3BsdWdpbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUHJvZ3Jlc3MuanNcIjtcbmV4cG9ydCAqIGZyb20gJy4vcHJvamVjdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Byb21wdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVmcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnMuanMnO1xuZXhwb3J0ICogZnJvbSBcIi4vc3RvcmUvaW5kZXguanNcIjtcbmV4cG9ydCAqIGZyb20gJy4vdGVuYW50LmpzJztcbmV4cG9ydCAqIGZyb20gXCIuL3RyYWluaW5nLmpzXCI7XG5leHBvcnQgKiBmcm9tICcuL3RyYW5zaWVudC10b2tlbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYXV0aC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3NjaGVtYXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9qc29uLXNjaGVtYS5qcyciLCJcblxuZXhwb3J0IGludGVyZmFjZSBJbnRlZ3JhdGlvbkNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdsYWRpYUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJbnRlZ3JhdGlvbkNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgICBhcGlfa2V5OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0aHViQ29uZmlndXJhdGlvbiBleHRlbmRzIEludGVncmF0aW9uQ29uZmlndXJhdGlvbkJhc2Uge1xuICAgIGFsbG93ZWRfcmVwb3NpdG9yaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBd3NDb25maWd1cmF0aW9uIGV4dGVuZHMgSW50ZWdyYXRpb25Db25maWd1cmF0aW9uQmFzZSB7XG4gICAgczNfcm9sZV9hcm46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYWdpY1BkZkNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJbnRlZ3JhdGlvbkNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgICAvLyBObyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAgICBkZWZhdWx0X2ZlYXR1cmVzPzogc3RyaW5nW107XG4gICAgZGVmYXVsdF96b25lcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnBlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJbnRlZ3JhdGlvbkNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgICBhcGlfa2V5OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZW51bSBTdXBwb3J0ZWRJbnRlZ3JhdGlvbnMge1xuICAgIGdsYWRpYSA9IFwiZ2xhZGlhXCIsXG4gICAgZ2l0aHViID0gXCJnaXRodWJcIixcbiAgICBhd3MgPSBcImF3c1wiLFxuICAgIG1hZ2ljX3BkZiA9IFwibWFnaWNfcGRmXCIsXG4gICAgc2VycGVyID0gXCJzZXJwZXJcIixcbn0iLCJpbXBvcnQgdHlwZSB7XG4gICAgSlNPTk9iamVjdCxcbiAgICBKU09OU2NoZW1hLFxuICAgIE1vZGFsaXRpZXMsXG4gICAgTW9kZWxPcHRpb25zLFxuICAgIFN0YXRlbGVzc0V4ZWN1dGlvbk9wdGlvbnMsXG4gICAgVG9vbERlZmluaXRpb24sXG4gICAgVG9vbFVzZSxcbn0gZnJvbSBcIkBsbHVtaXZlcnNlL2NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNCB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG5pbXBvcnQgeyBFeGVjdXRpb25Ub2tlblVzYWdlIH0gZnJvbSBcIkBsbHVtaXZlcnNlL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBFeGVjdXRpb25FbnZpcm9ubWVudFJlZiB9IGZyb20gXCIuL2Vudmlyb25tZW50LmpzXCI7XG5pbXBvcnQgeyBQcm9qZWN0UmVmIH0gZnJvbSBcIi4vcHJvamVjdC5qc1wiO1xuaW1wb3J0IHtcbiAgICBQb3B1bGF0ZWRQcm9tcHRTZWdtZW50RGVmLFxuICAgIFByb21wdFNlZ21lbnREZWYsXG4gICAgUHJvbXB0VGVtcGxhdGVSZWYsXG4gICAgUHJvbXB0VGVtcGxhdGVSZWZXaXRoU2NoZW1hLFxufSBmcm9tIFwiLi9wcm9tcHQuanNcIjtcbmltcG9ydCB7IEV4ZWN1dGlvblJ1bkRvY1JlZiB9IGZyb20gXCIuL3J1bnMuanNcIjtcbmltcG9ydCB7IEFjY291bnRSZWYgfSBmcm9tIFwiLi91c2VyLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25FeGVjdXRpb25FcnJvciB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBkYXRhPzogYW55O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHRvIHF1ZXJ5IHRoZSBpbnRlcmFjdGlvbiBlbmRwb2ludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvbkVuZHBvaW50UXVlcnkge1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIG9mZnNldD86IG51bWJlcjtcblxuICAgIHN0YXR1cz86IEludGVyYWN0aW9uU3RhdHVzO1xuICAgIHZpc2liaWxpdHk/OiBJbnRlcmFjdGlvblZpc2liaWxpdHk7XG4gICAgdmVyc2lvbj86IG51bWJlcjtcbiAgICB0YWdzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYnkgaW50ZXJhY3Rpb24gZW5kcG9pbnQgbmFtZSB0byBpbmNsdWRlIG9ubHkgdGhlIHNwZWNpZmllZCBlbmRwb2ludHNcbiAgICAgKiAqIElmIGJvdGggaW5jbHVkZXMgYW5kIGV4Y2x1ZGVzIGFyZSBzcGVjaWZpZWQgdGhlbiBvbmx5IHRoZSBpbmNsdWRlcyBmaWx0ZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGluY2x1ZGVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYnkgaW50ZXJhY3Rpb24gZW5kcG9pbnQgbmFtZSB0byBleGNsdWRlcyB0aGUgc3BlY2lmaWVkIGVuZHBvaW50cy5cbiAgICAgKiBJZiBib3RoIGluY2x1ZGVzIGFuZCBleGNsdWRlcyBhcmUgc3BlY2lmaWVkIHRoZW4gb25seSB0aGUgaW5jbHVkZXMgZmlsdGVyIHdpbGwgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBleGNsdWRlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBwYXJhbWV0ZXJzIHNjaGVtYS5cbiAgICAgKiBUaGUgcGFyYW1ldGVycyBzY2hlbWEgaXMgYW4gYXJyYXkgb2YgSlNPTiBzY2hlbWFzLlxuICAgICAqIEVhY2ggc2NoZW1hIGlzIGEgSlNPTiBzY2hlbWEgdGhhdCBkZXNjcmliZXMgdGhlIHBhcmFtZXRlcnMgb2YgYW4gaW50ZXJhY3Rpb24gcHJvbXB0LlxuICAgICAqL1xuICAgIGluY2x1ZGVfcGFyYW1zX3NjaGVtYT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIHJlc3VsdCBzY2hlbWFcbiAgICAgKi9cbiAgICBpbmNsdWRlX3Jlc3VsdF9zY2hlbWE/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYW4gaW50ZXJhY3Rpb24gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25FbmRwb2ludCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBzdGF0dXM6IEludGVyYWN0aW9uU3RhdHVzO1xuICAgIHZpc2liaWxpdHk/OiBJbnRlcmFjdGlvblZpc2liaWxpdHk7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xuICAgIHJlc3VsdF9zY2hlbWE/OiBKU09OU2NoZW1hO1xuICAgIHBhcmFtc19zY2hlbWE/OiBKU09OU2NoZW1hO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uUmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbmRwb2ludDogc3RyaW5nO1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBzdGF0dXM6IEludGVyYWN0aW9uU3RhdHVzO1xuICAgIHZpc2liaWxpdHk/OiBJbnRlcmFjdGlvblZpc2liaWxpdHk7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIHRhZ3M6IHN0cmluZ1tdO1xuICAgIHByb21wdHM/OiBQcm9tcHRTZWdtZW50RGVmPFByb21wdFRlbXBsYXRlUmVmPltdO1xuICAgIHVwZGF0ZWRfYXQ6IERhdGU7XG59XG5leHBvcnQgY29uc3QgSW50ZXJhY3Rpb25SZWZQb3B1bGF0ZSA9XG4gICAgXCJpZCBuYW1lIGVuZHBvaW50IHBhcmVudCBkZXNjcmlwdGlvbiBzdGF0dXMgdmVyc2lvbiB2aXNpYmlsaXR5IHRhZ3MgdXBkYXRlZF9hdCBwcm9tcHRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25SZWZXaXRoU2NoZW1hIGV4dGVuZHMgT21pdDxJbnRlcmFjdGlvblJlZiwgXCJwcm9tcHRzXCI+IHtcbiAgICByZXN1bHRfc2NoZW1hPzogSlNPTlNjaGVtYTQ7XG4gICAgcHJvbXB0cz86IFByb21wdFNlZ21lbnREZWY8UHJvbXB0VGVtcGxhdGVSZWZXaXRoU2NoZW1hPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uc0V4cG9ydFBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmFjdGlvbi4gSWYgbm90IHNwZWNpZmllZCBhbGwgdGhlIGludGVyYWN0aW9ucyBpbiB0aGUgY3VycmVudCBwcm9qZWN0IHdpbGwgYmUgZXhwb3J0ZWRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qXG4gICAgICogdGFncyB0byBmaWx0ZXIgdGhlIGV4cG9ydGVkIGludGVyYWN0aW9uc1xuICAgICAqL1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICAvKlxuICAgICAqIGlmIG5vdCBzcGVjaWZpZWQsIGFsbCB2ZXJzaW9ucyB3aWxsIGJlIGV4cG9ydGVkXG4gICAgICovXG4gICAgdmVyc2lvbnM/OiAobnVtYmVyIHwgXCJkcmFmdFwiIHwgXCJsYXRlc3RcIilbXTtcbn1cblxuZXhwb3J0IGVudW0gSW50ZXJhY3Rpb25TdGF0dXMge1xuICAgIGRyYWZ0ID0gXCJkcmFmdFwiLFxuICAgIHB1Ymxpc2hlZCA9IFwicHVibGlzaGVkXCIsXG4gICAgYXJjaGl2ZWQgPSBcImFyY2hpdmVkXCIsXG59XG5cbmV4cG9ydCBlbnVtIEV4ZWN1dGlvblJ1blN0YXR1cyB7XG4gICAgY3JlYXRlZCA9IFwiY3JlYXRlZFwiLFxuICAgIHByb2Nlc3NpbmcgPSBcInByb2Nlc3NpbmdcIixcbiAgICBjb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiLFxuICAgIGZhaWxlZCA9IFwiZmFpbGVkXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJ1bkRhdGFTdG9yYWdlTGV2ZWwge1xuICAgIFNUQU5EQVJEID0gXCJTVEFOREFSRFwiLFxuICAgIFJFU1RSSUNURUQgPSBcIlJFU1RSSUNURURcIixcbiAgICBERUJVRyA9IFwiREVCVUdcIixcbn1cblxuZXhwb3J0IGVudW0gUnVuRGF0YVN0b3JhZ2VEZXNjcmlwdGlvbiB7XG4gICAgU1RBTkRBUkQgPSBcIlJ1biBkYXRhIGlzIHN0b3JlZCBmb3IgYm90aCB0aGUgbW9kZWwgaW5wdXRzIGFuZCBvdXRwdXQuXCIsXG4gICAgUkVTVFJJQ1RFRCA9IFwiTm8gcnVuIGRhdGEgaXMgc3RvcmVkIGZvciB0aGUgbW9kZWwgaW5wdXRzIOKAlCBvbmx5IHRoZSBtb2RlbCBvdXRwdXQuXCIsXG4gICAgREVCVUcgPSBcIlJ1biBkYXRhIGlzIHN0b3JlZCBmb3IgdGhlIG1vZGVsIGlucHV0cyBhbmQgb3V0cHV0LCBzY2hlbWEsIGFuZCBmaW5hbCBwcm9tcHQuXCIsXG59XG5cbmV4cG9ydCBjb25zdCBSdW5EYXRhU3RvcmFnZU9wdGlvbnM6IFJlY29yZDxSdW5EYXRhU3RvcmFnZUxldmVsLCBSdW5EYXRhU3RvcmFnZURlc2NyaXB0aW9uPiA9IHtcbiAgICBbUnVuRGF0YVN0b3JhZ2VMZXZlbC5TVEFOREFSRF06IFJ1bkRhdGFTdG9yYWdlRGVzY3JpcHRpb24uU1RBTkRBUkQsXG4gICAgW1J1bkRhdGFTdG9yYWdlTGV2ZWwuUkVTVFJJQ1RFRF06IFJ1bkRhdGFTdG9yYWdlRGVzY3JpcHRpb24uUkVTVFJJQ1RFRCxcbiAgICBbUnVuRGF0YVN0b3JhZ2VMZXZlbC5ERUJVR106IFJ1bkRhdGFTdG9yYWdlRGVzY3JpcHRpb24uREVCVUcsXG59O1xuXG4vKipcbiAqIFNjaGVtYSBjYW4gYmUgc3RvcmVkIG9yIHNwZWNpZmllZCBhcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzY2hlbWEuXG4gKiBXZSBvbmx5IHN1cHBvcnQgXCJzdG9yZTpcIiByZWZlcmVuY2VzIGZvciBub3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFSZWYge1xuICAgICR1cmk6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVQb2xpY3kge1xuICAgIHR5cGU6IFwiY2FjaGVcIiB8IFwibm9fY2FjaGVcIiB8IFwiY2FjaGVfYW5kX3JlZnJlc2hcIjtcbiAgICByZWZyZXNoX3Byb2JhYmlsaXR5OiBudW1iZXI7XG4gICAgdmFyaWVzX29uOiBzdHJpbmdbXTtcbiAgICB0dGw6IG51bWJlcjtcbn1cbmV4cG9ydCB0eXBlIEludGVyYWN0aW9uVmlzaWJpbGl0eSA9IFwicHVibGljXCIgfCBcInByaXZhdGVcIjtcbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb24ge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVuZHBvaW50OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cztcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgLy8gb25seSB1c2VkIGZvciB2ZXJzaW9ucyAoc3RhdHVzID09PSBcInB1Ymxpc2hlZFwiKVxuICAgIHZpc2liaWxpdHk6IEludGVyYWN0aW9uVmlzaWJpbGl0eTtcbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgdGFnczogc3RyaW5nW107XG4gICAgdGVzdF9kYXRhPzogSlNPTk9iamVjdDtcbiAgICBpbnRlcmFjdGlvbl9zY2hlbWE/OiBKU09OU2NoZW1hNCB8IFNjaGVtYVJlZjtcbiAgICByZXN1bHRfc2NoZW1hPzogSlNPTlNjaGVtYTQgfCBTY2hlbWFSZWY7XG4gICAgY2FjaGVfcG9saWN5PzogQ2FjaGVQb2xpY3k7XG4gICAgbW9kZWw6IHN0cmluZztcbiAgICBtb2RlbF9vcHRpb25zPzogTW9kZWxPcHRpb25zO1xuICAgIHByb21wdHM6IFByb21wdFNlZ21lbnREZWZbXTtcbiAgICBvdXRwdXRfbW9kYWxpdHk/OiBNb2RhbGl0aWVzO1xuICAgIGVudmlyb25tZW50OiBzdHJpbmcgfCBFeGVjdXRpb25FbnZpcm9ubWVudFJlZjtcbiAgICByZXN0cmljdGlvbj86IFJ1bkRhdGFTdG9yYWdlTGV2ZWw7XG4gICAgcHJvamVjdDogc3RyaW5nIHwgUHJvamVjdFJlZjtcbiAgICAvLyBvbmx5IGZvciBkcmFmdHMgLSB3aGVuIGl0IHdhcyBsYXN0IHB1Ymxpc2hlZFxuICAgIGxhc3RfcHVibGlzaGVkX2F0PzogRGF0ZTtcbiAgICBjcmVhdGVkX2J5OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9ieTogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3B1bGF0ZWRJbnRlcmFjdGlvbiBleHRlbmRzIE9taXQ8SW50ZXJhY3Rpb24sIFwicHJvbXB0c1wiPiB7XG4gICAgcHJvbXB0czogUG9wdWxhdGVkUHJvbXB0U2VnbWVudERlZltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uQ3JlYXRlUGF5bG9hZFxuICAgIGV4dGVuZHMgT21pdDxcbiAgICAgICAgSW50ZXJhY3Rpb24sXG4gICAgICAgIHwgXCJpZFwiXG4gICAgICAgIHwgXCJjcmVhdGVkX2F0XCJcbiAgICAgICAgfCBcInVwZGF0ZWRfYXRcIlxuICAgICAgICB8IFwiY3JlYXRlZF9ieVwiXG4gICAgICAgIHwgXCJ1cGRhdGVkX2J5XCJcbiAgICAgICAgfCBcInByb2plY3RcIlxuICAgICAgICB8IFwiZm9ybWF0dGVyXCJcbiAgICAgICAgfCBcInRhZ3NcIlxuICAgICAgICB8IFwicGFyZW50XCJcbiAgICAgICAgfCBcInZlcnNpb25cIlxuICAgICAgICB8IFwidmlzaWJpbGl0eVwiXG4gICAgICAgIHwgXCJlbmRwb2ludFwiXG4gICAgPiB7XG4gICAgdmlzaWJpbGl0eT86IEludGVyYWN0aW9uVmlzaWJpbGl0eTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvblVwZGF0ZVBheWxvYWRcbiAgICBleHRlbmRzIFBhcnRpYWw8XG4gICAgICAgIE9taXQ8XG4gICAgICAgICAgICBJbnRlcmFjdGlvbixcbiAgICAgICAgICAgIFwicmVzdWx0X3NjaGVtYVwiIHwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBcInVwZGF0ZWRfYXRcIiB8IFwiY3JlYXRlZF9ieVwiIHwgXCJ1cGRhdGVkX2J5XCIgfCBcInByb2plY3RcIlxuICAgICAgICA+XG4gICAgPiB7XG4gICAgcmVzdWx0X3NjaGVtYT86IEpTT05TY2hlbWE0IHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvblB1Ymxpc2hQYXlsb2FkIHtcbiAgICB2aXNpYmlsaXR5PzogSW50ZXJhY3Rpb25WaXNpYmlsaXR5O1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvbkZvcmtQYXlsb2FkIHtcbiAgICBrZWVwVGFncz86IGJvb2xlYW47XG4gICAgZm9ya1Byb21wdHM/OiBib29sZWFuO1xuICAgIHRhcmdldFByb2plY3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBJZiBhIGBAbWVtb3J5YCBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIGlucHV0IGRhdGEgdGhlbiB0aGUgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBvZiBhIG1lbW9yeSBwYWNrIGxvY2F0aW9uLlxuICAgICAqIGFuZCB0aGUgb3RoZXIgcHJvcGVydGllcyBvZiB0aGUgZGF0YSB3aWxsIGNvbnRhaW4gdGhlIG1lbW9yeSBwYWNrIG1hcHBpbmcuXG4gICAgICovXG4gICAgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBgbWVtb3J5OiR7c3RyaW5nfWA7XG4gICAgY29uZmlnPzogSW50ZXJhY3Rpb25FeGVjdXRpb25Db25maWd1cmF0aW9uO1xuICAgIHJlc3VsdF9zY2hlbWE/OiBKU09OU2NoZW1hNDtcbiAgICBzdHJlYW0/OiBib29sZWFuO1xuICAgIGRvX3ZhbGlkYXRlPzogYm9vbGVhbjtcbiAgICB0YWdzPzogc3RyaW5nIHwgc3RyaW5nW107IC8vIHRhZ3MgdG8gYmUgYWRkZWQgdG8gdGhlIGV4ZWN1dGlvbiBydW5cblxuICAgIC8qKlxuICAgICAqIFRoZSBjb252ZXJzYXRpb24gc3RhdGUgdG8gYmUgdXNlZCBpbiB0aGUgZXhlY3V0aW9uIGlmIGFueS5cbiAgICAgKiBJZiB0aGUgYHRydWVgIGlzIHBhc3NlZCB0aGVuIHRoZSBjb252ZXJzYXRpb24gd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgcmVzdWx0LlxuICAgICAqIFRoZSB0cnVlIHZhbHVlIG11c3QgYmUgdXNlZCBmb3IgdGhlIGZpcnN0IGV4ZWN1dGlvbiB0aGF0IHN0YXJ0cyB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqIElmIGNvbnZlcnNhdGlvbiBpcyBmYWxzeSB0aGVuIG5vIGNvbnZlcnNhdGlvbiBpcyByZXR1cm5lZCBiYWNrLlxuICAgICAqIEZvciByZWd1bGFyIGV4ZWN1dGlvbnMgdGhlIGNvbnZlcnNhdGlvbiBpcyBub3QgcmV0dXJuZWQgYmFjayB0byBzYXZlIG1lbW9yeS5cbiAgICAgKi9cbiAgICBjb252ZXJzYXRpb24/OiB0cnVlIHwgdW5rbm93bjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29scyB0byBiZSB1c2VkIGluIHRoZSBleGVjdXRpb25cbiAgICAgKi9cbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWRJbnRlcmFjdGlvbkV4ZWN1dGlvblBheWxvYWQgZXh0ZW5kcyBJbnRlcmFjdGlvbkV4ZWN1dGlvblBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnRlcmFjdGlvbiBuYW1lIGFuZCBzdWZmaXhlZCBieSBhbiBvcHRpb25hbCB0YWcgb3IgdmVyc2lvbiBzZXBhcmF0ZWQgZnJvbSB0aGUgbmFtZSB1c2luZyBhIEAgY2hhcmFjdGVyXG4gICAgICogSWYgbm8gdmVyc2lvbi90YWcgcGFydCBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgdXNlZC5cbiAgICAgKiBFeGFtcGxlOiBSZXZpZXdDb250cmFjdCwgUmV2aWV3Q29udHJhY3RAZHJhZnQsIFJldmlld0NvbnRyYWN0QDEsIFJldmlld0NvbnRyYWN0QHNvbWUtdGFnXG4gICAgICovXG4gICAgaW50ZXJhY3Rpb246IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT0gYXN5bmMgZXhlY3V0aW9uIHBheWxvYWRzID09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgdHlwZSBUb29sUmVmID0gc3RyaW5nIHwgeyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfTtcblxuaW50ZXJmYWNlIEFzeW5jRXhlY3V0aW9uUGF5bG9hZEJhc2Uge1xuICAgIHR5cGU6IFwiY29udmVyc2F0aW9uXCIgfCBcImludGVyYWN0aW9uXCI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJhY3Rpb24gZW5kcG9pbnQgdG8gZXhlY3V0ZSB0byBzdGFydCB0aGUgY29udmVyc2F0aW9uLlxuICAgICAqL1xuICAgIGludGVyYWN0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZW52aXJvbm1lbnQgSUQgdG8gdXNlLlxuICAgICAqL1xuICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1vZGVsIHRvIHVzZVxuICAgICAqL1xuICAgIG1vZGVsPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgdG8gdXNlIG9uIHRoZSBmaXJzdCBleGVjdXRpb25cbiAgICAgKi9cbiAgICBtb2RlbF9vcHRpb25zPzogTW9kZWxPcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgcHJvbXB0IGlucHV0IGRhdGFcbiAgICAgKi9cbiAgICBwcm9tcHRfZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCByZXN1bHQgc2NoZW1hXG4gICAgICovXG4gICAgcmVzdWx0X3NjaGVtYT86IEpTT05TY2hlbWE7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCB0YWdzIHRvIGFkZCB0byB0aGUgZXhlY3V0aW9uIHJ1blxuICAgICAqL1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3luY0NvbnZlcnNhdGlvbkV4ZWN1dGlvblBheWxvYWQgZXh0ZW5kcyBBc3luY0V4ZWN1dGlvblBheWxvYWRCYXNlIHtcbiAgICB0eXBlOiBcImNvbnZlcnNhdGlvblwiO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvb2xzIHRvIHVzZSwgbGlzdCBvZiB0b29sIG9yIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIFlvdSBjYW4gdXNlICsgYW5kIC0gdG8gYWRkIG9yIHJlbW92ZSBmcm9tIGRlZmF1bHQsIGlmIG5vIHNpZ24sIHRoZW4gbGlzdCByZXBsYWNlcyBkZWZhdWx0XG4gICAgICovXG4gICAgdG9vbHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIGluIGNhc2Ugb2YgYSBjb252ZXJzYXRpb24uIElmIDw9MCB0aGUgZGVmYXVsdCBvZiAyMCB3aWxsIGJlIHVzZWQuXG4gICAgICovXG4gICAgbWF4X2l0ZXJhdGlvbnM/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb252ZXJzYXRpb24gc2hvdWxkIGJlIGludGVyYWN0aXZlIG9yIG5vdFxuICAgICAqL1xuICAgIGludGVyYWN0aXZlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGlvbiB0b29scyBvciBub3QuXG4gICAgICovXG4gICAgZGlzYWJsZV9pbnRlcmFjdGlvbl90b29scz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBPbiB3aGljaCBzY29wZSBzaG91bGQgdGhlIHNlYXJjaGVkIGJ5IGFwcGxpZWQsIGJ5IHRoZSBzZWFyY2hfdG9vbC5cbiAgICAgKiBPbmx5IHN1cHBvcnRzIGNvbGxlY3Rpb24gc2NvcGUgb3IgbnVsbCBmb3Igbm93LlxuICAgICAqL1xuICAgIHNlYXJjaF9zY29wZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb2xsZWN0aW9uIGluIHdoaWNoIHRoaXMgd29ya2Zsb3cgaXMgZXhlY3V0aW5nXG4gICAgICovXG4gICAgY29sbGVjdGlvbl9pZD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b2tlbiB0aHJlc2hvbGQgaW4gdGhvdXNhbmRzIChLKSBmb3IgY3JlYXRpbmcgY2hlY2twb2ludHMuXG4gICAgICogSWYgdG90YWwgdG9rZW5zIGV4Y2VlZCB0aGlzIHZhbHVlLCBhIGNoZWNrcG9pbnQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWUgb2YgMTUwSyB0b2tlbnMgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGNoZWNrcG9pbnRfdG9rZW5zPzogbnVtYmVyO1xuXG4gICAgLyoqIEluIGNoaWxkIGV4ZWN1dGlvbiB3b3JrZmxvdywgdGhpcyBpcyB0aGUgY3VyZW50IHRhc2tfaWQgKi9cbiAgICB0YXNrX2lkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkIGV4dGVuZHMgQXN5bmNFeGVjdXRpb25QYXlsb2FkQmFzZSB7XG4gICAgdHlwZTogXCJpbnRlcmFjdGlvblwiO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvb2xzIHRvIHVzZVxuICAgICAqL1xuICAgIHRvb2xzPzogVG9vbERlZmluaXRpb25bXTtcblxuICAgIC8qKlxuICAgICAqIE9ubHkgdXNlZCBmb3Igbm9uIGNvbnZlcnNhdGlvbiB3b3JrZmxvd3MgdG8gaW5jbHVkZSB0aGUgZXJyb3Igb24gbmV4dCByZXRyeS5cbiAgICAgKiBJZiB0b29scyBpcyBkZWZpbmVkIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3ByZXZpb3VzX2Vycm9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNFeGVjdXRpb25QYXlsb2FkID0gQXN5bmNDb252ZXJzYXRpb25FeGVjdXRpb25QYXlsb2FkIHwgQXN5bmNJbnRlcmFjdGlvbkV4ZWN1dGlvblBheWxvYWQ7XG5cbmludGVyZmFjZSBSZXN1bWVDb252ZXJzYXRpb25QYXlsb2FkIHtcbiAgICBydW46IEV4ZWN1dGlvblJ1bkRvY1JlZjsgLy8gdGhlIHJ1biBjcmVhdGVkIGJ5IHRoZSBmaXJzdCBleGVjdXRpb24uXG4gICAgZW52aXJvbm1lbnQ6IHN0cmluZzsgLy8gdGhlIGVudmlyb25tZW50IElEXG4gICAgb3B0aW9uczogU3RhdGVsZXNzRXhlY3V0aW9uT3B0aW9uczsgLy8gdGhlIG9wdGlvbnMgdXNlZCBvbiB0aGUgZmlyc3QgZXhlY3V0aW9uXG4gICAgY29udmVyc2F0aW9uOiB1bmtub3duOyAvLyB0aGUgY29udmVyc2F0aW9uIHN0YXRlXG4gICAgdG9vbHM6IFRvb2xEZWZpbml0aW9uW107IC8vIHRoZSB0b29scyB0byBiZSB1c2VkXG59XG5cbi8qKlxuICogVGhlIHBheWxvYWQgdG8gc2VudCB0aGUgdG9vbCByZXNwb25zZXMgYmFjayB0byB0aGUgdGFyZ2V0IExMTVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xSZXN1bHRzUGF5bG9hZCBleHRlbmRzIFJlc3VtZUNvbnZlcnNhdGlvblBheWxvYWQge1xuICAgIHJlc3VsdHM6IHtcbiAgICAgICAgdG9vbF91c2VfaWQ6IHN0cmluZztcbiAgICAgICAgY29udGVudDogc3RyaW5nO1xuICAgIH1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyTWVzc2FnZVBheWxvYWQgZXh0ZW5kcyBSZXN1bWVDb252ZXJzYXRpb25QYXlsb2FkIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENoZWNrcG9pbnRDb252ZXJzYXRpb25QYXlsb2FkID0gT21pdDxUb29sUmVzdWx0c1BheWxvYWQsIFwicmVzdWx0c1wiPjtcblxuLy8gPT09PT09PT09PT09PT09PT0gZW5kIGFzeW5jIGV4ZWN1dGlvbiBwYXlsb2FkcyA9PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZW51bSBSdW5Tb3VyY2VUeXBlcyB7XG4gICAgYXBpID0gXCJhcGlcIixcbiAgICBjbGkgPSBcImNsaVwiLFxuICAgIHVpID0gXCJ1aVwiLFxuICAgIHdlYmhvb2sgPSBcIndlYmhvb2tcIixcbiAgICB0ZXN0ID0gXCJ0ZXN0LWRhdGFcIixcbiAgICBzeXN0ZW0gPSBcInN5c3RlbVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blNvdXJjZSB7XG4gICAgdHlwZTogUnVuU291cmNlVHlwZXM7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBwcmluY2lwYWxfdHlwZTogXCJ1c2VyXCIgfCBcImFwaWtleVwiO1xuICAgIHByaW5jaXBhbF9pZDogc3RyaW5nO1xuICAgIGNsaWVudF9pcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvblJ1bjxQID0gYW55LCBSID0gYW55PiB7XG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPbmx5IHVzZWQgYnkgcnVucyB0aGF0IHdlcmUgY3JlYXRlZCBieSBhIHZpcnR1YWwgcnVuIHRvIHBvaW50IHRvd2FyZCB0aGUgdmlydHVhbCBydW4gcGFyZW50XG4gICAgICovXG4gICAgcGFyZW50Pzogc3RyaW5nIHwgRXhlY3V0aW9uUnVuO1xuICAgIGV2YWx1YXRpb24/OiB7XG4gICAgICAgIHNjb3JlPzogbnVtYmVyO1xuICAgICAgICBzZWxlY3RlZD86IGJvb2xlYW47XG4gICAgICAgIHNjb3Jlcz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgfTtcbiAgICByZXN1bHQ6IFI7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmFtZXRlcnMgdXNlZCB0byBjcmVhdGUgdGhlIGludGVyYWN0aW9uLlxuICAgICAqIElmIHRoZSBwYXJhbWV0ZXJzIGNvbnRhaW5zIHRoZSBzcGVjaWFsIHByb3BlcnR5IFwiQG1lbW9yeVwiIGl0IHdpbGwgYmUgdXNlZFxuICAgICAqIHRvIGxvY2F0ZSBhIG1lbW9yeSBwYWNrIGFuZCB0aGUgb3RoZXIgcHJvcGVydGllcyB3aWxsIGJlIHVzZWQgYXMgdGhlIG1lbW9yeSBwYWNrIG1hcHBpbmcuXG4gICAgICovXG4gICAgcGFyYW1ldGVyczogUDsgLy9wYXJhbXMgdXNlZCB0byBjcmVhdGUgdGhlIGludGVyYWN0aW9uLCBvbmx5IGluIHZhcmllcyBvbj9cbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgLy9UT0RPIGEgc3RyaW5nIGlzIHJldHVybmVkIHdoZW4gZXhlY3V0aW5nIG5vdCB0aGUgaW50ZXJhY3Rpb24gb2JqZWN0XG4gICAgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uO1xuICAgIC8vVE9ETyBhIHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIGV4ZWN1dGlvbiBub3QgdGhlIGVudiBvYmplY3RcbiAgICBlbnZpcm9ubWVudDogRXhlY3V0aW9uRW52aXJvbm1lbnRSZWY7XG4gICAgbW9kZWxJZDogc3RyaW5nO1xuICAgIHJlc3VsdF9zY2hlbWE6IEpTT05TY2hlbWE0O1xuICAgIHR0bDogbnVtYmVyO1xuICAgIHN0YXR1czogRXhlY3V0aW9uUnVuU3RhdHVzO1xuICAgIGZpbmlzaF9yZWFzb24/OiBzdHJpbmc7XG4gICAgcHJvbXB0OiBhbnk7XG4gICAgdG9rZW5fdXNlPzogRXhlY3V0aW9uVG9rZW5Vc2FnZTtcbiAgICBjaHVua3M/OiBudW1iZXI7XG4gICAgZXhlY3V0aW9uX3RpbWU/OiBudW1iZXI7IC8vc1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbiAgICBhY2NvdW50OiBBY2NvdW50UmVmO1xuICAgIHByb2plY3Q6IFByb2plY3RSZWY7XG4gICAgY29uZmlnOiBJbnRlcmFjdGlvbkV4ZWN1dGlvbkNvbmZpZ3VyYXRpb247XG4gICAgZXJyb3I/OiBJbnRlcmFjdGlvbkV4ZWN1dGlvbkVycm9yO1xuICAgIHNvdXJjZTogUnVuU291cmNlO1xuICAgIG91dHB1dF9tb2RhbGl0eTogTW9kYWxpdGllcztcbiAgICBjcmVhdGVkX2J5OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9ieTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVyYWN0aW9uRXhlY3V0aW9uUmVzdWx0PFAgPSBhbnksIFIgPSBhbnk+IGV4dGVuZHMgRXhlY3V0aW9uUnVuPFAsIFI+IHtcbiAgICB0b29sX3VzZT86IFRvb2xVc2VbXTtcbiAgICBjb252ZXJzYXRpb24/OiB1bmtub3duO1xuICAgIG9wdGlvbnM/OiBTdGF0ZWxlc3NFeGVjdXRpb25PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvblJ1blJlZiBleHRlbmRzIE9taXQ8RXhlY3V0aW9uUnVuLCBcInJlc3VsdFwiIHwgXCJwYXJhbWV0ZXJzXCIgfCBcImludGVyYWN0aW9uXCI+IHtcbiAgICBpbnRlcmFjdGlvbjogSW50ZXJhY3Rpb25SZWY7XG59XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRpb25SdW5SZWZTZWxlY3QgPSBcIi1yZXN1bHQgLXBhcmFtZXRlcnMgLXJlc3VsdF9zY2hlbWEgLXByb21wdFwiO1xuXG5leHBvcnQgZW51bSBDb25maWdNb2RlcyB7XG4gICAgUlVOX0FORF9JTlRFUkFDVElPTl9DT05GSUcgPSBcIlJVTl9BTkRfSU5URVJBQ1RJT05fQ09ORklHXCIsXG4gICAgUlVOX0NPTkZJR19PTkxZID0gXCJSVU5fQ09ORklHX09OTFlcIixcbiAgICBJTlRFUkFDVElPTl9DT05GSUdfT05MWSA9IFwiSU5URVJBQ1RJT05fQ09ORklHX09OTFlcIixcbn1cblxuZXhwb3J0IGVudW0gQ29uZmlnTW9kZXNEZXNjcmlwdGlvbiB7XG4gICAgUlVOX0FORF9JTlRFUkFDVElPTl9DT05GSUcgPSBcIlRoaXMgcnVuIGNvbmZpZ3VyYXRpb24gaXMgdXNlZC4gVW5kZWZpbmVkIG9wdGlvbnMgYXJlIGZpbGxlZCB3aXRoIGludGVyYWN0aW9uIGNvbmZpZ3VyYXRpb24uXCIsXG4gICAgUlVOX0NPTkZJR19PTkxZID0gXCJPbmx5IHRoaXMgcnVuIGNvbmZpZ3VyYXRpb24gaXMgdXNlZC4gVW5kZWZpbmVkIG9wdGlvbnMgcmVtYWluIHVuZGVmaW5lZC5cIixcbiAgICBJTlRFUkFDVElPTl9DT05GSUdfT05MWSA9IFwiT25seSBpbnRlcmFjdGlvbiBjb25maWd1cmF0aW9uIGlzIHVzZWQuXCIsXG59XG5cbmV4cG9ydCBjb25zdCBDb25maWdNb2Rlc09wdGlvbnM6IFJlY29yZDxDb25maWdNb2RlcywgQ29uZmlnTW9kZXNEZXNjcmlwdGlvbj4gPSB7XG4gICAgW0NvbmZpZ01vZGVzLlJVTl9BTkRfSU5URVJBQ1RJT05fQ09ORklHXTogQ29uZmlnTW9kZXNEZXNjcmlwdGlvbi5SVU5fQU5EX0lOVEVSQUNUSU9OX0NPTkZJRyxcbiAgICBbQ29uZmlnTW9kZXMuUlVOX0NPTkZJR19PTkxZXTogQ29uZmlnTW9kZXNEZXNjcmlwdGlvbi5SVU5fQ09ORklHX09OTFksXG4gICAgW0NvbmZpZ01vZGVzLklOVEVSQUNUSU9OX0NPTkZJR19PTkxZXTogQ29uZmlnTW9kZXNEZXNjcmlwdGlvbi5JTlRFUkFDVElPTl9DT05GSUdfT05MWSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25FeGVjdXRpb25Db25maWd1cmF0aW9uIHtcbiAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICBtb2RlbD86IHN0cmluZztcbiAgICBkb192YWxpZGF0ZT86IGJvb2xlYW47XG4gICAgcnVuX2RhdGE/OiBSdW5EYXRhU3RvcmFnZUxldmVsO1xuICAgIGNvbmZpZ01vZGU/OiBDb25maWdNb2RlcztcbiAgICBtb2RlbF9vcHRpb25zPzogTW9kZWxPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlSW50ZXJhY3Rpb25QYXlsb2FkIHtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbmZpZzogSW50ZXJhY3Rpb25FeGVjdXRpb25Db25maWd1cmF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlVGVzdERhdGFQYXlsb2FkIHtcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIGNvbmZpZzogSW50ZXJhY3Rpb25FeGVjdXRpb25Db25maWd1cmF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltcHJvdmVQcm9tcHRQYXlsb2FkIHtcbiAgICBjb25maWc6IEludGVyYWN0aW9uRXhlY3V0aW9uQ29uZmlndXJhdGlvbjtcbn1cbiIsImV4cG9ydCB0eXBlIHtcbiAgICBKU09OU2NoZW1hLFxuICAgIEpTT05TY2hlbWFBcnJheSxcbiAgICBKU09OU2NoZW1hT2JqZWN0LFxuICAgIEpTT05TY2hlbWFUeXBlLFxuICAgIEpTT05TY2hlbWFUeXBlTmFtZSxcbn0gZnJvbSBcIkBsbHVtaXZlcnNlL2NvbW1vblwiO1xuIiwiaW1wb3J0IHsgQmlsbGluZ01ldGhvZCB9IGZyb20gXCIuL3VzZXIuanNcIjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGVyQWRqdXN0bWVudCB7XG4gICAgbWV0ZXI6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIGlkZW50aWZpZXI/OiBzdHJpbmc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBBZGp1c3RNZXRlcnNNZXRlcldvcmtmbG93UGFyYW1zIHtcbiAgICBhZGp1c3RtZW50czogTWV0ZXJBZGp1c3RtZW50W107XG59XG5cbmV4cG9ydCBlbnVtIE1ldGVyTmFtZXMge1xuICAgIGFuYWx5emVkX3BhZ2VzID0gJ2FuYWx5emVkX3BhZ2VzJyxcbiAgICBleHRyYWN0ZWRfdGFibGVzID0gJ2V4dHJhY3RlZF90YWJsZXMnLFxuICAgIGFuYWx5emVkX2ltYWdlcyA9ICdhbmFseXplZF9pbWFnZXMnLFxuICAgIGlucHV0X3Rva2VuX3VzZWQgPSAnaW5wdXRfdG9rZW5fdXNlZCcsXG4gICAgb3V0cHV0X3Rva2VuX3VzZWQgPSAnb3V0cHV0X3Rva2VuX3VzZWQnLFxuICAgIHRhc2tfcnVuID0gJ3Rhc2tfcnVuJyxcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmlwZUJpbGxpbmdTdGF0dXNSZXNwb25zZSB7XG4gICAgc3RhdHVzOiAnZW5hYmxlZCcgfCAnZGlzYWJsZWQnLFxuICAgIGJpbGxpbmdfbWV0aG9kOiBCaWxsaW5nTWV0aG9kIHwgbnVsbCxcbiAgICBwb3J0YWxfdXJsPzogc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZ1xufSIsImltcG9ydCB7IEZhY2V0U3BlYyB9IGZyb20gXCIuL2ZhY2V0cy5qc1wiO1xuaW1wb3J0IHtcbiAgICBDb21wbGV4U2VhcmNoUXVlcnksXG4gICAgSW50ZXJhY3Rpb25TZWFyY2hRdWVyeSxcbiAgICBPYmplY3RTZWFyY2hRdWVyeSxcbiAgICBPYmplY3RUeXBlU2VhcmNoUXVlcnksXG4gICAgUHJvbXB0U2VhcmNoUXVlcnksXG4gICAgUnVuU2VhcmNoUXVlcnksXG4gICAgU2ltcGxlU2VhcmNoUXVlcnksXG4gICAgVmVjdG9yU2VhcmNoUXVlcnksXG59IGZyb20gXCIuL3F1ZXJ5LmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUGF5bG9hZCB7XG4gICAgcXVlcnk/OiBTaW1wbGVTZWFyY2hRdWVyeTtcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgc2VsZWN0Pzogc3RyaW5nO1xuICAgIGFsbF9yZXZpc2lvbnM/OiBib29sZWFuO1xuICAgIGZyb21fcm9vdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wdXRlRmFjZXRQYXlsb2FkIHtcbiAgICBmYWNldHM6IEZhY2V0U3BlY1tdO1xuICAgIHF1ZXJ5PzogU2ltcGxlU2VhcmNoUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJhY3Rpb25TZWFyY2hQYXlsb2FkIGV4dGVuZHMgU2VhcmNoUGF5bG9hZCB7XG4gICAgcXVlcnk/OiBJbnRlcmFjdGlvblNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFNlYXJjaFBheWxvYWQgZXh0ZW5kcyBTZWFyY2hQYXlsb2FkIHtcbiAgICBxdWVyeT86IE9iamVjdFNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFR5cGVTZWFyY2hQYXlsb2FkIGV4dGVuZHMgU2VhcmNoUGF5bG9hZCB7XG4gICAgcXVlcnk/OiBPYmplY3RUeXBlU2VhcmNoUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0U2VhcmNoUGF5bG9hZCBleHRlbmRzIFNlYXJjaFBheWxvYWQge1xuICAgIHF1ZXJ5PzogUHJvbXB0U2VhcmNoUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU2VhcmNoUGF5bG9hZCBleHRlbmRzIFNlYXJjaFBheWxvYWQge1xuICAgIHF1ZXJ5PzogUnVuU2VhcmNoUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcHV0ZUludGVyYWN0aW9uRmFjZXRQYXlsb2FkIGV4dGVuZHMgQ29tcHV0ZUZhY2V0UGF5bG9hZCB7XG4gICAgcXVlcnk/OiBJbnRlcmFjdGlvblNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVPYmplY3RGYWNldFBheWxvYWQgZXh0ZW5kcyBDb21wdXRlRmFjZXRQYXlsb2FkIHtcbiAgICBxdWVyeT86IE9iamVjdFNlYXJjaFF1ZXJ5O1xuICAgIHZlY3Rvcj86IFZlY3RvclNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVQcm9tcHRGYWNldFBheWxvYWQgZXh0ZW5kcyBDb21wdXRlRmFjZXRQYXlsb2FkIHtcbiAgICBxdWVyeT86IFByb21wdFNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXB1dGVSdW5GYWNldFBheWxvYWQgZXh0ZW5kcyBDb21wdXRlRmFjZXRQYXlsb2FkIHtcbiAgICBxdWVyeT86IFJ1blNlYXJjaFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFByb3BlcnRpZXNQYXlsb2FkIHtcbiAgICBvYmplY3RJZHM6IHN0cmluZ1tdO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBxdWVyeT86IENvbXBsZXhTZWFyY2hRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRQcm9wZXJ0aWVzUmVzcG9uc2Uge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGF0YTogQmxvYjtcbn1cbiIsIi8qKlxuICogQSB2ZXJ0ZXNpYSBwbHVnaW4gbWFuaWZlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5NYW5pZmVzdCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBzcmM6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIHB1Ymxpc2hlcjogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGljb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgcGx1Z2luIHNob3VsZCBiZSBsb2FkZWQgYXMgcGFydCBvZiB0aGUgaG9zdCBsYXlvdXRcbiAgICAgKiBvciBpbiBhIG5ldyB0YWIuXG4gICAgICogSWYgZXh0ZXJuYWwgaXMgdHJ1ZSwgdGhlIHBsdWdpbiBtdXN0IG1hbmFnZSBpdHNlbGYgdGhlIGdsb2JhbCBsYXlvdXQgb2YgdGhlIHBhZ2UuXG4gICAgICogSXQgd2lsbCBiZSBsb2FkZWQgaW4gYSBuZXcgdGFiLlxuICAgICAqIElmIGV4dGVybmFsIGlzIGZhbHNlIHRoZSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYXMgYSBwYWdlIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCBpdCB3aWxsIHNoYXJlIHRoZSBzYW1lIGxheW91dC5cbiAgICAgKiBEZWZhdWx0IGlzIGZhbHNlLlxuICAgICAqL1xuICAgIGV4dGVybmFsPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyBcImJldGFcIi5cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBcImJldGFcIiB8IFwic3RhYmxlXCIgfCBcImRlcHJlY2F0ZWRcIiB8IFwiaGlkZGVuXCI7XG59XG4iLCJpbXBvcnQgeyBTdXBwb3J0ZWRJbnRlZ3JhdGlvbnMgfSBmcm9tIFwiLi9pbnRlZ3JhdGlvbnMuanNcIjtcbmltcG9ydCB7IEFjY291bnRSZWYgfSBmcm9tIFwiLi91c2VyLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNyZWF0ZVByb2plY3RQYXlsb2FkIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgYXV0b19jb25maWc/OiBib29sZWFuO1xufVxuZXhwb3J0IGVudW0gUHJvamVjdFJvbGVzIHtcbiAgICBvd25lciA9IFwib3duZXJcIiwgLy8gYWxsIHBlcm1pc3Npb25zXG4gICAgYWRtaW4gPSBcImFkbWluXCIsIC8vIGFsbCBwZXJtaXNzaW9uc1xuICAgIHByb2plY3RfYWRtaW4gPSBcInByb2plY3RfYWRtaW5cIiwgLy8gYWxsIHBlcm1pc3Npb25zIGJ1dCBtYW5hZ2VfYWNjb3VudCwgbWFuYWdlX2JpbGxpbmdcbiAgICBkZXZlbG9wZXIgPSBcImRldmVsb3BlclwiLCAvLyBhbGwgcGVybWlzc2lvbnMgYnV0IG1hbmFnZV9hY2NvdW50LCBtYW5hZ2VfYmlsbGluZywgbWFuYWdlX3JvbGVzLCBkZWxldGVcbiAgICBhcHBsaWNhdGlvbiA9IFwiYXBwbGljYXRpb25cIiwgLy8gZXhlY3V0b3IgKyByZXF1ZXN0X3BrXG4gICAgZXhlY3V0b3IgPSBcImV4ZWN1dG9yXCIsIC8vIGNhbiBvbmx5IHJlYWQgYW5kIGV4ZWN1dGUgaW50ZXJhY3Rpb25zXG4gICAgcmVhZGVyID0gXCJyZWFkZXJcIiwgLy8gY2FuIG9ubHkgcmVhZCAoYnJvd3NlKVxuICAgIGJpbGxpbmcgPSBcImJpbGxpbmdcIiwgLy8gY2FuIG9ubHkgbWFuYWdlIGJpbGxpbmdzXG4gICAgbWVtYmVyID0gXCJtZW1iZXJcIiwgLy8gY2FuIG9ubHkgYWNjZXNzLCBidXQgbm8gc3BlY2lmaWMgcGVybWlzc2lvbnNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUm9sZUluY2x1ZGVkSW4ocm9sZTogc3RyaW5nLCBpbmNsdWRpbmdSb2xlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGluY2x1ZGluZ1JvbGUpIHtcbiAgICAgICAgY2FzZSBQcm9qZWN0Um9sZXMub3duZXI6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gaW5jbHVkZXMgYmlsbGluZyB0bz9cbiAgICAgICAgY2FzZSBQcm9qZWN0Um9sZXMuYWRtaW46XG4gICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gUHJvamVjdFJvbGVzLmJpbGxpbmcgJiYgcm9sZSAhPT0gUHJvamVjdFJvbGVzLm93bmVyO1xuICAgICAgICBjYXNlIFByb2plY3RSb2xlcy5kZXZlbG9wZXI6XG4gICAgICAgICAgICByZXR1cm4gcm9sZSA9PT0gUHJvamVjdFJvbGVzLmRldmVsb3BlcjtcbiAgICAgICAgY2FzZSBQcm9qZWN0Um9sZXMuYmlsbGluZzpcbiAgICAgICAgICAgIHJldHVybiByb2xlID09PSBQcm9qZWN0Um9sZXMuYmlsbGluZztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQb3B1bGF0ZWRQcm9qZWN0UmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY2NvdW50OiBBY2NvdW50UmVmXG59XG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RSZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPbmx5IHNldCB3aGVuIGZldGNoaW5nIHRoZSBsaXN0IG9mIHByb2plY3RzIHZpc2libGUgdG8gYW4gdXNlciB3aGljaCBpcyBhbiBvcmcgYWRtaW4gb3Igb3duZXIuXG4gICAgICogSWYgcHJlc2VudCBhbmQgdHJ1ZSwgaXQgbWVhbnMgdGhhdCB0aGUgcHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZSB0byB0aGUgdXNlci4oZXZlbiBpZiBpdCB2aXNpYmxlIGluIGxpc3RpbmcpXG4gICAgICogSWYgbm90IHByZXNlbnQgb3IgZmFsc2UgdGhlbiB0aGUgcHJvamVjdCBpcyBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIHJlc3RyaWN0ZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZVZpc2liaWxpdHkge1xuICAgIHB1YmxpYyA9IFwicHVibGljXCIsXG4gICAgYWNjb3VudCA9IFwiYWNjb3VudFwiLFxuICAgIHByb2plY3QgPSBcInByb2plY3RcIlxufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdENvbmZpZ3VyYXRpb24ge1xuXG4gICAgaHVtYW5fY29udGV4dDogc3RyaW5nO1xuXG4gICAgZGVmYXVsdF9lbnZpcm9ubWVudD86IHN0cmluZztcbiAgICBkZWZhdWx0X21vZGVsPzogc3RyaW5nO1xuXG4gICAgZW1iZWRkaW5nczoge1xuICAgICAgICB0ZXh0PzogUHJvamVjdENvbmZpZ3VyYXRpb25FbWJlZGRpbmdzO1xuICAgICAgICBpbWFnZT86IFByb2plY3RDb25maWd1cmF0aW9uRW1iZWRkaW5ncztcbiAgICAgICAgcHJvcGVydGllcz86IFByb2plY3RDb25maWd1cmF0aW9uRW1iZWRkaW5nc1xuICAgIH1cblxuICAgIGRhdGFjZW50ZXI/OiBzdHJpbmc7XG4gICAgc3RvcmFnZV9idWNrZXQ/OiBzdHJpbmc7XG5cbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29uZmlndXJhdGlvbkVtYmVkZGluZ3Mge1xuLy8gICAgIGVudmlyb25tZW50OiBzdHJpbmc7XG4vLyAgICAgbWF4X3Rva2VuczogbnVtYmVyO1xuLy8gICAgIGRpbWVuc2lvbnM6IG51bWJlcjtcbi8vICAgICBtb2RlbD86IHN0cmluZztcbi8vIH1cblxuZXhwb3J0IGVudW0gU3VwcG9ydGVkRW1iZWRkaW5nVHlwZXMge1xuICAgIHRleHQgPSBcInRleHRcIixcbiAgICBpbWFnZSA9IFwiaW1hZ2VcIixcbiAgICBwcm9wZXJ0aWVzID0gXCJwcm9wZXJ0aWVzXCJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29uZmlndXJhdGlvbkVtYmVkZGluZ3Mge1xuICAgIGVudmlyb25tZW50OiBzdHJpbmc7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBkaW1lbnNpb25zOiBudW1iZXI7XG4gICAgbWF4X3Rva2Vucz86IG51bWJlcjtcbiAgICBtb2RlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBuYW1lc3BhY2U6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgY29uZmlndXJhdGlvbjogUHJvamVjdENvbmZpZ3VyYXRpb247XG4gICAgaW50ZWdyYXRpb25zOiBNYXA8c3RyaW5nLCBhbnk+O1xuICAgIHBsdWdpbnM6IHN0cmluZ1tdO1xuICAgIGNyZWF0ZWRfYnk6IHN0cmluZyxcbiAgICB1cGRhdGVkX2J5OiBzdHJpbmcsXG4gICAgY3JlYXRlZF9hdDogRGF0ZTtcbiAgICB1cGRhdGVkX2F0OiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RDcmVhdGVQYXlsb2FkIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdFVwZGF0ZVBheWxvYWQgZXh0ZW5kcyBQYXJ0aWFsPFByb2plY3Q+IHsgfVxuXG5cbmV4cG9ydCBjb25zdCBQcm9qZWN0UmVmUG9wdWxhdGUgPSBcImlkIG5hbWUgYWNjb3VudFwiO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nc1N0YXR1c1Jlc3BvbnNlIHtcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBlbWJlZGRpbmdSdW5zSW5Qcm9ncmVzczogbnVtYmVyO1xuICAgIHRvdGFsUnVuc0luUHJvZ3Jlc3M6IG51bWJlcjtcbiAgICB0b3RhbEluZGV4YWJsZU9iamVjdHM6IG51bWJlcjtcbiAgICBlbWJlZGRpbmdzTW9kZWxzOiBzdHJpbmdbXTtcbiAgICBvYmplY3RzV2l0aEVtYmVkZGluZ3M6IG51bWJlcjtcbiAgICB2ZWN0b3JJbmRleDoge1xuICAgICAgICBzdGF0dXM6IFwiUkVBRFlcIiB8IFwiUEVORElOR1wiIHwgXCJERUxFVElOR1wiIHwgXCJBQlNFTlRcIixcbiAgICAgICAgbmFtZT86IHN0cmluZyxcbiAgICAgICAgdHlwZT86IHN0cmluZ1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0SW50ZWdyYXRpb25MaXN0RW50cnkge1xuICAgIGlkOiBTdXBwb3J0ZWRJbnRlZ3JhdGlvbnM7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbn0iLCJpbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE0IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgdHlwZSB7IEpTT05PYmplY3QgfSBmcm9tIFwiQGxsdW1pdmVyc2UvY29tbW9uXCI7XG5pbXBvcnQgeyBQcm9qZWN0UmVmIH0gZnJvbSBcIi4vcHJvamVjdC5qc1wiO1xuaW1wb3J0IHsgUHJvbXB0Um9sZSB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBDaGF0UHJvbXB0U2NoZW1hIHtcbiAgICByb2xlOiBQcm9tcHRSb2xlLnVzZXIgfCBQcm9tcHRSb2xlLmFzc2lzdGFudDtcbiAgICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFByb21wdFN0YXR1cyB7XG4gICAgZHJhZnQgPSBcImRyYWZ0XCIsXG4gICAgcHVibGlzaGVkID0gXCJwdWJsaXNoZWRcIixcbiAgICBhcmNoaXZlZCA9IFwiYXJjaGl2ZWRcIixcbn1cblxuXG5leHBvcnQgZW51bSBQcm9tcHRTZWdtZW50RGVmVHlwZSB7XG4gICAgY2hhdCA9IFwiY2hhdFwiLFxuICAgIHRlbXBsYXRlID0gXCJ0ZW1wbGF0ZVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFNlZ21lbnREZWY8XG4gICAgVCA9IHN0cmluZyB8IFByb21wdFRlbXBsYXRlIHwgUHJvbXB0VGVtcGxhdGVSZWYsXG4+IHtcbiAgICB0eXBlOiBQcm9tcHRTZWdtZW50RGVmVHlwZTtcbiAgICB0ZW1wbGF0ZT86IFQ7IC8vIHRoZSB0ZW1wbGF0ZSBpZCBpbiBjYXNlIG9mIGEgcHJvbXB0IHRlbXBsYXRlXG4gICAgY29uZmlndXJhdGlvbj86IGFueTsgLy8gdGhlIGNvbmZpZ3VyYXRpb24gaWYgYW55IGluIGNhc2Ugb2YgYnVpbHRpbiBwcm9tcHRzXG59XG5leHBvcnQgaW50ZXJmYWNlIFBvcHVsYXRlZFByb21wdFNlZ21lbnREZWZcbiAgICBleHRlbmRzIE9taXQ8UHJvbXB0U2VnbWVudERlZiwgXCJ0ZW1wbGF0ZVwiPiB7XG4gICAgdGVtcGxhdGU/OiBQcm9tcHRUZW1wbGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRUZW1wbGF0ZVJlZiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgcm9sZTogUHJvbXB0Um9sZTtcbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgc3RhdHVzOiBQcm9tcHRTdGF0dXM7XG4gICAgY29udGVudF90eXBlOiBUZW1wbGF0ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0VGVtcGxhdGVSZWZXaXRoU2NoZW1hIGV4dGVuZHMgUHJvbXB0VGVtcGxhdGVSZWYge1xuICAgIGlucHV0U2NoZW1hPzogSlNPTlNjaGVtYTQ7XG59XG5cbmV4cG9ydCBlbnVtIFRlbXBsYXRlVHlwZSB7XG4gICAgdGV4dCA9IFwidGV4dFwiLFxuICAgIGpzID0gXCJqc1wiLFxuICAgIGpzdCA9IFwianN0XCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0VGVtcGxhdGUge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHJvbGU6IFByb21wdFJvbGU7XG4gICAgc3RhdHVzOiBQcm9tcHRTdGF0dXM7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8vIG9ubHkgdG8gYmUgdXNlZCBieSBwdWJsaXNoZWQgdmVyc2lvbnNcbiAgICAvLyB0aGUgaWQgZHJhZnQgdmVyc2lvbiB3aGljaCBpcyB0aGUgc291cmNlIG9mIHRoaXMgcHVibGlzaGVkIHZlcnNpb24gKG9ubHkgd2hlbiBwdWJsaXNoZWQpXG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIGNvbnRlbnRfdHlwZTogVGVtcGxhdGVUeXBlO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICB0ZXN0X2RhdGE/OiBKU09OT2JqZWN0OyAvLyBvcHRpb25hbCB0ZXN0IGRhdGEgc2F0aXNmeWluZyB0aGUgc2NoZW1hXG4gICAgc2NyaXB0Pzogc3RyaW5nOyAvLyBjYWNoZSB0aGUgdGVtcGxhdGUgb3V0cHV0XG4gICAgaW5wdXRTY2hlbWE/OiBKU09OU2NoZW1hNDtcbiAgICBwcm9qZWN0OiBzdHJpbmcgfCBQcm9qZWN0UmVmOyAvLyBvciBwcm9qZWN0UmVmPyBPYmplY3RJZFR5cGU7XG4gICAgLy8gVGhlIG5hbWUgb2YgYSBmaWVsZCBpbiB0aGUgaW5wdXQgZGF0YSB0aGF0IGlzIG9mIHRoZSBzcGVjaWZpZWQgc2NoZW1hIGFuZCBvbiBlYWNoIHRoZSB0ZW1wbGF0ZSB3aWxsIGl0ZXJhdGUuXG4gICAgLy8gSWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBzY2hlbWEgd2lsbCBkZWZpbmUgdGhlIHdob2xlIGlucHV0IGRhdGFcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgLy8gb25seSBmb3IgZHJhZnRzIC0gd2hlbiBpdCB3YXMgbGFzdCBwdWJsaXNoZWRcbiAgICBsYXN0X3B1Ymxpc2hlZF9hdD86IERhdGU7XG4gICAgY3JlYXRlZF9ieTogc3RyaW5nLFxuICAgIHVwZGF0ZWRfYnk6IHN0cmluZyxcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVwZGF0ZWRfYXQ6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0VGVtcGxhdGVGb3JrUGF5bG9hZCB7XG4gICAga2VlcFRhZ3M/OiBib29sZWFuO1xuICAgIHRhcmdldFByb2plY3Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0VGVtcGxhdGVDcmVhdGVQYXlsb2FkXG4gICAgZXh0ZW5kcyBPbWl0PFxuICAgICAgICBQcm9tcHRUZW1wbGF0ZSxcbiAgICAgICAgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBcInVwZGF0ZWRfYXRcIiB8IFwiY3JlYXRlZF9ieVwiIHwgXCJ1cGRhdGVkX2J5XCIgfCBcInByb2plY3RcIiB8IFwic3RhdHVzXCIgfCBcInZlcnNpb25cIlxuICAgID4geyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0VGVtcGxhdGVVcGRhdGVQYXlsb2FkXG4gICAgZXh0ZW5kcyBQYXJ0aWFsPFxuICAgICAgICBPbWl0PFByb21wdFRlbXBsYXRlLCBcImlkXCIgfCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJjcmVhdGVkX2J5XCIgfCBcInVwZGF0ZWRfYnlcIiB8IFwicHJvamVjdFwiPlxuICAgID4geyB9XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25SdW5TdGF0dXMgfSBmcm9tICcuL2ludGVyYWN0aW9uLmpzJztcbmltcG9ydCB7IFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzIH0gZnJvbSAnLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBSdW5MaXN0aW5nUXVlcnlPcHRpb25zIHtcbiAgICBwcm9qZWN0Pzogc3RyaW5nO1xuICAgIGludGVyYWN0aW9uPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIGZpbHRlcnM/OiBSdW5MaXN0aW5nRmlsdGVycztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5MaXN0aW5nRmlsdGVycyB7XG4gICAgaW50ZXJhY3Rpb24/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzdGF0dXM/OiBFeGVjdXRpb25SdW5TdGF0dXMsXG4gICAgbW9kZWw/OiBzdHJpbmcsXG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmcsXG4gICAgdGFnPzogc3RyaW5nLFxuICAgIGZyb21EYXRlPzogc3RyaW5nLFxuICAgIHRvRGF0ZT86IHN0cmluZyxcbiAgICBwYXJlbnQ/OiBzdHJpbmcgfCBmYWxzZSxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZWN0b3JTZWFyY2hRdWVyeSB7XG4gICAgb2JqZWN0SWQ/OiBzdHJpbmc7XG4gICAgdmFsdWVzPzogbnVtYmVyW107XG4gICAgdGV4dD86IHN0cmluZztcbiAgICBpbWFnZT86IHN0cmluZztcbiAgICB0aHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgdHlwZTogU3VwcG9ydGVkRW1iZWRkaW5nVHlwZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVTZWFyY2hRdWVyeSB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0U2VhcmNoUXVlcnkgZXh0ZW5kcyBTaW1wbGVTZWFyY2hRdWVyeSB7XG4gICAgbG9jYXRpb24/OiBzdHJpbmc7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIHNpbWlsYXJUbz86IHN0cmluZztcbiAgICBlbWJlZGRpbmdUeXBlPzogU3VwcG9ydGVkRW1iZWRkaW5nVHlwZXM7XG4gICAgdHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmplY3RUeXBlU2VhcmNoUXVlcnkgZXh0ZW5kcyBTaW1wbGVTZWFyY2hRdWVyeSB7XG4gICAgY2h1bmthYmxlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRTZWFyY2hRdWVyeSBleHRlbmRzIFNpbXBsZVNlYXJjaFF1ZXJ5IHtcbiAgICByb2xlPzogc3RyaW5nO1xuICAgIG1hdGNoSW50ZXJhY3Rpb25zPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnRlcmFjdGlvblNlYXJjaFF1ZXJ5IGV4dGVuZHMgU2ltcGxlU2VhcmNoUXVlcnkge1xuICAgIHByb21wdD86IHN0cmluZztcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAgdmVyc2lvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdW5TZWFyY2hRdWVyeSBleHRlbmRzIFNpbXBsZVNlYXJjaFF1ZXJ5IHtcbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgaW50ZXJhY3Rpb24/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgbW9kZWw/OiBzdHJpbmc7XG4gICAgc3RhdHVzPzogRXhlY3V0aW9uUnVuU3RhdHVzO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBxdWVyeT86IHN0cmluZztcbiAgICBkZWZhdWx0X3F1ZXJ5X3BhdGg/OiBzdHJpbmc7XG4gICAgcGFyZW50Pzogc3RyaW5nW10gfCBmYWxzZTtcbiAgICBvYmplY3Q/OiBzdHJpbmc7XG4gICAgc3RhcnQ/OiBzdHJpbmc7XG4gICAgZW5kPzogc3RyaW5nO1xuICAgIGZpbmlzaF9yZWFzb24/OiBzdHJpbmc7XG4gICAgY3JlYXRlZF9ieT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGlvblNlYXJjaFF1ZXJ5IGV4dGVuZHMgU2ltcGxlU2VhcmNoUXVlcnkge1xuICAgIGRvY3VtZW50SWQ/OiBzdHJpbmc7XG4gICAgZXZlbnROYW1lPzogc3RyaW5nO1xuICAgIHJ1bGVJZD86IHN0cmluZztcbiAgICBzdGFydD86IHN0cmluZztcbiAgICBlbmQ/OiBzdHJpbmc7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhTZWFyY2hRdWVyeSBleHRlbmRzIE9iamVjdFNlYXJjaFF1ZXJ5IHtcbiAgICB2ZWN0b3I/OiBWZWN0b3JTZWFyY2hRdWVyeTtcbiAgICBtYXRjaD86IFJlY29yZDxzdHJpbmcsIGFueT47XG59IiwiXG5cbmV4cG9ydCBlbnVtIFJlc29sdmFibGVSZWZUeXBlIHtcbiAgICBwcm9qZWN0ID0gXCJQcm9qZWN0XCIsXG4gICAgZW52aXJvbm1lbnQgPSBcIkVudmlyb25tZW50XCIsXG4gICAgdXNlciA9IFwiVXNlclwiLFxuICAgIGFjY291bnQgPSBcIkFjY291bnRcIixcbiAgICBpbnRlcmFjdGlvbiA9IFwiSW50ZXJhY3Rpb25cIlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmFibGVSZWYge1xuICAgIHR5cGU6IFJlc29sdmFibGVSZWZUeXBlXG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZlJlc29sdXRpb25SZXF1ZXN0IHtcblxuICAgIHJlZnM6IFJlc29sdmFibGVSZWZbXVxuXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVJlZiB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHR5cGU6IHN0cmluZ1xufSIsImltcG9ydCB7IEZhY2V0UmVzdWx0IH0gZnJvbSAnLi9mYWNldHMuanMnO1xuaW1wb3J0IHsgTmFtZWRJbnRlcmFjdGlvbkV4ZWN1dGlvblBheWxvYWQgfSBmcm9tICcuL2ludGVyYWN0aW9uLmpzJztcblxuLyoqXG4gKiBUaGUgcnVuIHJlZiBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgcnVuIGRvY3VtZW50IGluIHRoZSBzdG9yYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uUnVuRG9jUmVmIHtcbiAgICBpZDogc3RyaW5nLFxuICAgIGFjY291bnQ6IHN0cmluZyxcbiAgICBwcm9qZWN0OiBzdHJpbmcsXG59XG5cbi8qKlxuICogSW50ZXJhY3Rpb24gZXhlY3V0aW9uIHBheWxvYWQgZm9yIGNyZWF0aW5nIGEgbmV3IHJ1blxuICogSXQgdXNlcyBpbnRlcmFjdGlvbiBmaWVsZCAoZnJvbSBOYW1lZEludGVyYWN0aW9uRXhlY3V0aW9uUGF5bG9hZCkgdG8gcGFzcyB0aGUgaW50ZXJhY3Rpb24gSUQgdG8gcnVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ3JlYXRlUGF5bG9hZCBleHRlbmRzIE5hbWVkSW50ZXJhY3Rpb25FeGVjdXRpb25QYXlsb2FkIHtcbn1cblxuLyoqXG4gKiBUbyBiZSB1c2VkIGFzIGEgdmFsdWUgZm9yIGEgbnVtZXJpYyBvciBkYXRlIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVZhbHVlIHtcbiAgICBndD86IG51bWJlciB8IHN0cmluZyxcbiAgICBndGU/OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgbHQ/OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgbHRlPzogbnVtYmVyIHwgc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blNlYXJjaE1ldGFSZXNwb25zZSB7XG4gICAgY291bnQ6IHtcbiAgICAgICAgbG93ZXJfYm91bmQ/OiBudW1iZXIsXG4gICAgICAgIHRvdGFsPzogbnVtYmVyLFxuICAgIH0sXG4gICAgZmFjZXQ6IFJlY29yZDxzdHJpbmcsIEZhY2V0UmVzdWx0PlxufVxuIiwiZXhwb3J0IHR5cGUgVHNQcm9wVHlwZSA9IFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcInJlY29yZFwiIHwgXCJvYmplY3RcIiB8IFwiYXJyYXlcIiB8IFwiZW51bVwiIHwgXCJsaXRlcmFsXCIgfCBcInVuaW9uXCIgfCBcInByb21pc2VcIiB8IFwiYW55XCIgfCBcInZvaWRcIjtcblxuLy8gZ2VuZXJpYyB0eXBlcyBhcmUgcmVwbGFjZWQgYnkgXCJhbnlcIlxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eVR5cGVEZWZpbml0aW9uIHtcbiAgICBuYW1lOiBUc1Byb3BUeXBlO1xuICAgIC8vIGluIGNhc2Ugb2YgcHJpbWl0aXZlcyB3aWxsIGJlIHRoZSB0eXBlIG5hbWU6IHN0cmluZywgYm9vbGVhbiBudW1iZXIuXG4gICAgLy8gaW4gY2FzZSBvZiBvYmplY3RzIG9yIGVudW1zIHdpbGwgYmUgdGhlIG9iamVjdCBuYW1lXG4gICAgLy8gaW4gY2FzZSBvZiBhcnJheXMgd2lsbCBiZSBTdHJpbmcoaXRlbVR5cGUudmFsdWUpK1wiW11cIlxuICAgIC8vIGluIGNhc2Ugb2YgcHJpbWl0aXZlIGxpdGVyYWxzIHdpbGwgYmUgdGhlIHZhbHVlXG4gICAgLy8gb3IgbmVzdGVkIG9iamVjdHMgLyBhcnJheXMgd2lsbCBiZSBcIm9iamVjdFwiIG9yIFwiYXJyYXlcIlxuICAgIC8vIGZvciByZWNvcmQgdGhpcyBpcyBSZWNvcmQ8dHlwZSx0eXBlPlxuICAgIHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyIHwgbnVsbDtcbiAgICAvLyBpbiBjYXNlIG9mIG9iamVjdHNcbiAgICBtZW1iZXJzPzogQWN0aXZpdHlQcm9wZXJ0eURlZmluaXRpb25bXTtcbiAgICAvLyBpbiBjYXNlIG9mIGFycmF5cyBvciBwcm9taXNlcyB3aWxsIGJlIGlubmVyVHlwZSAoaS5lLiB0aGUgZWxlbWVudCB0eXBlIGZvciBhcnJheXMpXG4gICAgaW5uZXJUeXBlPzogQWN0aXZpdHlUeXBlRGVmaW5pdGlvbjtcbiAgICAvLyBpbiBjYXNlIG9mIGVudW1zIHRoZSBlbnVtIHZhbHVlcyB3aWxsIGJlIGhlcmVcbiAgICBlbnVtPzogc3RyaW5nW10gfCBudW1iZXJbXSB8IHVuZGVmaW5lZDtcbiAgICAvLyBpbiBjYXNlIG9mIHVuaW9uc1xuICAgIHVuaW9uPzogQWN0aXZpdHlUeXBlRGVmaW5pdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5UHJvcGVydHlEZWZpbml0aW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogQWN0aXZpdHlUeXBlRGVmaW5pdGlvbjtcbiAgICBvcHRpb25hbDogYm9vbGVhbjtcbiAgICAvLyB0aGUgSlNEb2MgY29tbWVudCBmb3IgdGhlIGFjdGl2aXR5IHByb3BlcnR5XG4gICAgZG9jPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RGVmaW5pdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8vIGdlbmVyYXRlZCBmcm9tIG5hbWVcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8vIHRoZSBKU0RvYyBjb21tZW50IGZvciB0aGUgYWN0aXZpdHkgZnVuY3Rpb25cbiAgICBkb2M/OiBzdHJpbmc7XG4gICAgcGFyYW1zVHlwZTogc3RyaW5nO1xuICAgIHBhcmFtczogQWN0aXZpdHlQcm9wZXJ0eURlZmluaXRpb25bXTtcbiAgICByZXR1cm5UeXBlPzogQWN0aXZpdHlUeXBlRGVmaW5pdGlvbiB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUNhdGFsb2cge1xuICAgIGFjdGl2aXRpZXM6IEFjdGl2aXR5RGVmaW5pdGlvbltdO1xufVxuIiwiZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBZ2VudERlcGxveW1lbnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWdlbnQgSUQgaXMgY29tcG9zZWQgZnJvbSB0aGUgYWdlbnQgb3JnYW5pemF0aW9uIGFuZCB0aGUgYWdlbnQgbmFtZSwgc2VwYXJhdGVkIGJ5IGEgc2xhc2guXG4gICAgICogRXhhbXBsZTogdmVydGVzaWEvZG9jZ2VuLWFnZW50XG4gICAgICovXG4gICAgYWdlbnRJZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnZpcm9ubWVudCB0byBkZXBsb3kgdGhlIGFnZW50IHRvLiBUaGlzIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4gICAgICogICAtIGBwcm9kdWN0aW9uYFxuICAgICAqICAgLSBgcHJldmlld2BcbiAgICAgKiAgIC0gYHN0YWdpbmdgXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyB8ICdwcmV2aWV3JyB8ICdzdGFnaW5nJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBhZ2VudCBkb2NrZXIgaW1hZ2UgdmVyc2lvbi4gQSBtYWpvci5taW5vci5wYXRjaFstbW9kaWZpZXJdIHN0cmluZy5cbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBCYXNlT2JqZWN0IH0gZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgeyBDb2x1bW5MYXlvdXQsIENvbnRlbnRPYmplY3RUeXBlUmVmIH0gZnJvbSBcIi4vc3RvcmUuanNcIjtcblxuZXhwb3J0IGVudW0gQ29sbGVjdGlvblN0YXR1cyB7XG4gICAgYWN0aXZlID0gXCJhY3RpdmVcIixcbiAgICBhcmNoaXZlZCA9IFwiYXJjaGl2ZWRcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVDb2xsZWN0aW9uUGF5bG9hZCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGR5bmFtaWM6IGJvb2xlYW47XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIHBhcmVudD86IHN0cmluZyB8IG51bGw7XG4gICAgdGFibGVfbGF5b3V0PzogQ29sdW1uTGF5b3V0W10gfCBudWxsO1xuICAgIGFsbG93ZWRfdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uSXRlbSBleHRlbmRzIEJhc2VPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY29sbGVjdGlvbiBpcyBkeW5hbWljIG9yIHN0YXRpYy5cbiAgICAgKiBJZiB0aGUgY29sbGVjdGlvbiBpcyBkeW5hbWljLCB0aGUgbWVtYmVycyBhcmUgZGV0ZXJtaW5lZCBieSBhIHF1ZXJ5IHVzaW5nIHRoZSBxdWVyeSBmaWVsZC5cbiAgICAgKiBJZiB0aGUgY29sbGVjdGlvbiBpcyBzdGF0aWMsIHRoZSBtZW1iZXJzIGFyZSBleHBsaWNpdGx5IGRlZmluZWQgdXNpbmcgdGhlIG1lbWJlcnMgYXJyYXkuXG4gICAgICovXG4gICAgZHluYW1pYzogYm9vbGVhbjtcbiAgICBzdGF0dXM6IENvbGxlY3Rpb25TdGF0dXM7XG4gICAgLy8gQSByZWYgdG8gdGhlIG9iamVjdCB0eXBlXG4gICAgdHlwZT86IENvbnRlbnRPYmplY3RUeXBlUmVmO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgY29sbGVjdGlvbiBpZiBhbnlcbiAgICAgKi9cbiAgICBwYXJlbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YWJsZSBsYXlvdXQgdG8gdXNlIGZvciB0aGUgY29sbGVjdGlvbi5cbiAgICAgKiBUaGUgbGF5b3V0IGRlZmluZWQgaW4gdGhlIHR5cGUgY291bGQgc2VydmUgYXMgYSBmYWxsYmFjayBpZiBub3QgZGVmaW5lZCBoZXJlLlxuICAgICAqL1xuICAgIHRhYmxlX2xheW91dD86IENvbHVtbkxheW91dFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFsbG93ZWQgdHlwZXMgZm9yIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqL1xuICAgIGFsbG93ZWRfdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uIGV4dGVuZHMgQ29sbGVjdGlvbkl0ZW0ge1xuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0NvbGxlY3Rpb24gZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBkeW5hbWljOiBmYWxzZTtcbiAgICBtZW1iZXJzOiBzdHJpbmdbXTtcbiAgICBxdWVyeTogbmV2ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY0NvbGxlY3Rpb24gZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBkeW5hbWljOiB0cnVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25TZWFyY2hQYXlsb2FkIHtcbiAgICBkeW5hbWljPzogYm9vbGVhbjtcbiAgICBzdGF0dXM/OiBDb2xsZWN0aW9uU3RhdHVzO1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbiIsIi8qKlxuICogQmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBkb21haW4gb2JqZWN0cyBpbiB0aGUgc3lzdGVtLlxuICogUHJvdmlkZXMgY29tbW9uIHByb3BlcnRpZXMgc2hhcmVkIGFjcm9zcyBhbGwgYnVzaW5lc3MgZW50aXRpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU9iamVjdCB7XG4gICAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0ICovXG4gICAgaWQ6IHN0cmluZztcblxuICAgIC8qKiBIdW1hbi1yZWFkYWJsZSBuYW1lIG9yIHRpdGxlICovXG4gICAgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIE9wdGlvbmFsIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAgIC8qKiBPcHRpb25hbCBhcnJheSBvZiBjYXRlZ29yaXphdGlvbiB0YWdzICovXG4gICAgdGFncz86IHN0cmluZ1tdO1xuXG4gICAgLyoqIElkZW50aWZpZXIgb2YgdGhlIHVzZXIgd2hvIGxhc3QgbW9kaWZpZWQgdGhlIG9iamVjdCAqL1xuICAgIHVwZGF0ZWRfYnk6IHN0cmluZztcblxuICAgIC8qKiBJZGVudGlmaWVyIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBvYmplY3QgKi9cbiAgICBjcmVhdGVkX2J5OiBzdHJpbmc7XG5cbiAgICAvKiogSVNPIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG5cbiAgICAvKiogSVNPIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBvYmplY3Qgd2FzIGxhc3QgdXBkYXRlZCAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcblxufSIsImltcG9ydCB7IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCwgV29ya2Zsb3dSdW5TdGF0dXMgfSBmcm9tIFwiLi93b3JrZmxvdy5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBkZlRvUmljaHRleHRPcHRpb25zIHtcbiAgICBmZWF0dXJlczogc3RyaW5nW107XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZGZUb1JpY2hUZXh0V29ya2Zsb3dQYXlsb2FkIGV4dGVuZHMgT21pdDxXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsIFwidmFyc1wiPiB7XG4gICAgdmFyczogUGRmVG9SaWNodGV4dE9wdGlvbnM7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGltYWdlIGluIGEgZG9jdW1lbnQgdGhhdCBoYXMgYmVlbiBhbmFseXplZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY0ltYWdlIHtcbiAgICBpZD86IHN0cmluZztcbiAgICBwYWdlX251bWJlcj86IG51bWJlcjtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBpc19tZWFuaW5nZnVsPzogYm9vbGVhbjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGV4cG9ydCB0eXBlIGZvcm1hdHMgZm9yIHRhYmxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgRXhwb3J0VGFibGVGb3JtYXRzID0gJ2pzb24nIHwgJ2NzdicgfCAneG1sJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGFibGUgaW4gYSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIGFuYWx5emVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jVGFibGUge1xuICAgIHBhZ2VfbnVtYmVyPzogbnVtYmVyO1xuICAgIHRhYmxlX251bWJlcj86IG51bWJlcjtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBmb3JtYXQ6IFwiYXBwbGljYXRpb24vY3N2XCIgfCBcImFwcGxpY2F0aW9uL2pzb25cIjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdGFibGUgaW4gYSBkb2N1bWVudCB0aGF0IGhhcyBiZWVuIGFuYWx5emVkIGluIENTViBmb3JtYXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NUYWJsZUNzdiBleHRlbmRzIERvY1RhYmxlIHtcbiAgICBmb3JtYXQ6IFwiYXBwbGljYXRpb24vY3N2XCI7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0YWJsZSBpbiBhIGRvY3VtZW50IHRoYXQgaGFzIGJlZW4gYW5hbHl6ZWQgaW4gSlNPTiBmb3JtYXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2NUYWJsZUpzb24gZXh0ZW5kcyBEb2NUYWJsZSB7XG4gICAgZm9ybWF0OiBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICB0aXRsZT86IHN0cmluZztcbiAgICBkYXRhOiBPYmplY3RbXTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZG9jdW1lbnQgYW5hbHlzaXMgcnVuIHN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY0FuYWx5emVSdW5TdGF0dXNSZXNwb25zZSBleHRlbmRzIFdvcmtmbG93UnVuU3RhdHVzIHtcbiAgICBwcm9ncmVzcz86IERvY0FuYWx5emVyUHJvZ3Jlc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jQW5hbHl6ZXJSZXN1bHRSZXNwb25zZSB7XG4gICAgZG9jdW1lbnQ/OiBzdHJpbmc7XG4gICAgdGFibGVzPzogRG9jVGFibGVDc3ZbXSB8IERvY1RhYmxlSnNvbltdO1xuICAgIGltYWdlcz86IERvY0ltYWdlW107XG4gICAgYW5ub3RhdGVkPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2NBbmFseXplclByb2dyZXNzIHtcbiAgICBwYWdlczogRG9jQW5hbHl6ZXJQcm9ncmVzc1N0YXR1cztcbiAgICBpbWFnZXM6IERvY0FuYWx5emVyUHJvZ3Jlc3NTdGF0dXM7XG4gICAgdGFibGVzOiBEb2NBbmFseXplclByb2dyZXNzU3RhdHVzO1xuICAgIHZpc3VhbHM6IERvY0FuYWx5emVyUHJvZ3Jlc3NTdGF0dXM7XG4gICAgc3RhcnRlZF9hdD86IG51bWJlcjtcbiAgICBwZXJjZW50OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEb2NBbmFseXplclByb2dyZXNzU3RhdHVzIHtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIHByb2Nlc3NlZDogbnVtYmVyO1xuICAgIHN1Y2Nlc3M6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBZGFwdCBUYWJsZXMgUGFyYW1ldGVycywgcGFydCBvZiB0aGUgcmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0VGFibGVzUGFyYW1zIHtcbiAgICAvKipcbiAgICAgKiBKU09OIFNjaGVtYSB0byB0byBjb252ZXJ0IHRoZSB0YWJsZSBpbnRvXG4gICAgICovXG4gICAgdGFyZ2V0X3NjaGVtYTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogTmF0dXJhbCBsYW5ndWFnZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBpdGVtIHRoZSB0YWJsZSBhcmUgY29tcG9zZWQgb2ZcbiAgICAgKi9cbiAgICBpdGVtX25hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE5hdHVyYWwgbGFuZ3VhZ2UgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgdGFibGUgb3IgaXRlbSB0byBjb252ZXJ0XG4gICAgICovXG4gICAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRm9ybWF0IHRvIHJldHVybiB0aGUgZGF0YSBpbiAoY3N2LCBqc29uKVxuICAgICAqL1xuICAgIGZvcm1hdD86IFwiY3N2XCIgfCBcImpzb25cIjtcblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIHRhYmxlIGFzIGEgd2hvbGUgb3IgYnkgcGFnZVxuICAgICAqL1xuICAgIHByb2Nlc3NfYXM/OiBcInBhZ2VcIiB8IFwidGFibGVcIjtcblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIHRhYmxlIGFzIGEgQ1NWIGZpbGVcbiAgICAgKi9cbiAgICBwcm9jZXNzX2FzX2Nzdj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBEb2NBbmFseXplclJlcXVlc3RCYXNlIHtcbiAgICBzeW5jaHJvbm91cz86IGJvb2xlYW47XG5cbiAgICBub3RpZnlfZW5kcG9pbnRzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBXaGF0IGVudmlyb25tZW50IHRvIHVzZSB0byBydW4gdGhlIHJlcXVlc3RcbiAgICAgKiBJZiBub25lIHNwZWNpZmllZCB0aGUgcHJvamVjdCBlbWJlZGRlZCBlbnZpcm9ubWVudCB3aWxsIGJlIHVzZWRcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdFRhYmxlc1JlcXVlc3QgZXh0ZW5kcyBEb2NBbmFseXplclJlcXVlc3RCYXNlLCBBZGFwdFRhYmxlc1BhcmFtcyB7fVxuXG4vKipcbiAqIEdldCBBZGFwdGVkIFRhYmxlcyBSZXF1ZXN0XG4gKiBAcGFyYW0gcmF3IElmIHRydWUsIHRoZSByYXcgZGF0YSB3aWxsIGJlIHJldHVybmVkXG4gKiBAcGFyYW0gZm9ybWF0IFRoZSBmb3JtYXQgdG8gcmV0dXJuIHRoZSBkYXRhIGluIChjc3YsIGpzb24pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWRhcHRlZFRhYmxlc1JlcXVlc3RRdWVyeSB7XG4gICAgcmF3PzogYm9vbGVhbjtcbiAgICBmb3JtYXQ6IFwiY3N2XCIgfCBcImpzb25cIjtcbn1cbi8qKlxuICogVGhlIGFkYXB0ZWQgdGFibGUgcmVzdWx0IGZvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZWRUYWJsZSB7XG4gICAgY29tbWVudD86IHN0cmluZztcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG59XG4iLCJpbXBvcnQgeyBTdHJpbmdWYWx1ZSB9IGZyb20gXCJtc1wiO1xuaW1wb3J0IHsgQmFzZU9iamVjdCB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0IHsgV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIH0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7IFBhcmVudENsb3NlUG9saWN5VHlwZSB9IGZyb20gXCIuL3RlbXBvcmFsaW8uanNcIjtcblxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNlbnQgd2hlbiBzdGFydGluZyBhIHdvcmtmbG93IGZyb20gdGhlIHRlbXBvcmFsIGNsaWVudCB0byB0aGUgd29ya2Zsb3cgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRFNMV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIGV4dGVuZHMgV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd29ya2Zsb3cgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGJ5IHRoZSBEU0wgd29ya2Zsb3cuXG4gICAgICogSWYgYSBkc2wgd29ya2Zsb3cgaXMgZXhlY3V0ZWQgYW5kIG5vIGRlZmluaXRpb24gaXMgcHJvdmlkZWQgdGhlIHdvcmtmbG93IHdpbGwgZmFpbC5cbiAgICAgKi9cbiAgICB3b3JrZmxvdzogRFNMV29ya2Zsb3dTcGVjO1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIGZvciBhIERTTCBhY3Rpdml0eSBvcHRpb25zLlxuICpcbiAqIEBzZWUgQWN0aXZpdHlPcHRpb25zIGluIEB0ZW1wb3JhbGlvL2NvbW1vblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERTTEFjdGl2aXR5T3B0aW9ucyB7XG4gICAgc3RhcnRUb0Nsb3NlVGltZW91dD86IFN0cmluZ1ZhbHVlIHwgbnVtYmVyO1xuICAgIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcbiAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogU3RyaW5nVmFsdWUgfCBudW1iZXI7XG4gICAgcmV0cnk/OiBEU0xSZXRyeVBvbGljeTtcbn1cblxuLyoqXG4gKiBUaGUgcGF5bG9hZCBmb3IgYSBEU0wgcmV0cnkgcG9saWN5LlxuICpcbiAqIEBzZWUgUmV0cnlQb2xpY3kgaW4gQHRlbXBvcmFsaW8vY29tbW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRFNMUmV0cnlQb2xpY3kge1xuICAgIGJhY2tvZmZDb2VmZmljaWVudD86IG51bWJlcjtcbiAgICBpbml0aWFsSW50ZXJ2YWw/OiBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcbiAgICBtYXhpbXVtQXR0ZW1wdHM/OiBudW1iZXI7XG4gICAgbWF4aW11bUludGVydmFsPzogU3RyaW5nVmFsdWUgfCBudW1iZXI7XG4gICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIGZvciBhIERTTCBhY3Rpdml0eSBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRFNMQWN0aXZpdHlFeGVjdXRpb25QYXlsb2FkPFBhcmFtc1QgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiBleHRlbmRzIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB7XG4gICAgYWN0aXZpdHk6IERTTEFjdGl2aXR5U3BlYztcbiAgICBwYXJhbXM6IFBhcmFtc1Q7XG4gICAgd29ya2Zsb3dfbmFtZTogc3RyaW5nO1xuICAgIGRlYnVnX21vZGU/OiBib29sZWFuO1xufVxuXG5cbmV4cG9ydCB0eXBlIEltcG9ydFNwZWMgPSAoc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbXTtcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHlGZXRjaFNwZWMge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIHByb3ZpZGVyIG5hbWVcbiAgICAgKi9cbiAgICB0eXBlOiBcImRvY3VtZW50XCIgfCBcImRvY3VtZW50X3R5cGVcIiB8IFwiaW50ZXJhY3Rpb25fcnVuXCI7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgVVJJIHRvIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKi9cbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBkYXRhIHByb3ZpZGVyXG4gICAgICovXG4gICAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgLyoqXG4gICAgICogYSBzdHJpbmcgb2Ygc3BhY2Ugc2VwYXJhdGVkIGZpZWxkIG5hbWVzLlxuICAgICAqIFByZWZpeCBhIGZpZWxkIG5hbWUgd2l0aCBcIi1cIiB0byBleGNsdWRlIGl0IGZyb20gdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBzZWxlY3Q/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuLiBJZiB0aGUgcmVzdWx0IGlzIGxpbWl0ZWQgdG8gMSB0aGUgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgb2JqZWN0XG4gICAgICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBIb3cgdG8gaGFuZGxlIG5vdCBmb3VuZCBvYmplY3RzLlxuICAgICAqIDEuIGlnbm9yZSAtIElnbm9yZSBhbmQgcmV0dXJuIGFuIGVtcHR5IGFycmF5IGZvciBtdWx0aSBvYmplY3RzIHF1ZXJ5IChvciB1bmRlZmluZWQgZm9yIHNpbmdsZSBvYmplY3QgcXVlcnkpIG9yIGVtcHR5IGFycmF5IGZvciBtdWx0aXBsZSBvYmplY3RzIHRocm93IGFuIGVycm9yLlxuICAgICAqIDIuIHRocm93IC0gVGhyb3cgYW4gZXJyb3IgaWYgdGhlIG9iamVjdCBvciBubyBvYmplY3RzIGFyZSBmb3VuZC5cbiAgICAgKi9cbiAgICBvbl9ub3RfZm91bmQ/OiBcImlnbm9yZVwiIHwgXCJ0aHJvd1wiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERTTFdvcmtmbG93U3RlcEJhc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIGZvIHRoZSBzdGVwLlxuICAgICAqIElmIG5vdCBzZXQgZGVmYXVsdHMgdG8gXCJhY3Rpdml0eVwiXG4gICAgICovXG4gICAgdHlwZTogXCJhY3Rpdml0eVwiIHwgXCJ3b3JrZmxvd1wiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERTTEFjdGl2aXR5U3BlYzxQQVJBTVMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY3Rpdml0eSBmdW5jdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaXRsZSBvZiB0aGUgYWN0aXZpdHkgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBVSSB3b3JrZmxvdyBidWlsZGVyXG4gICAgICovXG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpdml0eSB0byBlIGRpc3BsYXllZCBpbiB0aGUgVUkgd29ya2Zsb3cgYnVpbGRlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXRpZXMgcGFyYW1ldGVycy4gVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgZWl0aGVyIGxpdGVyYWxzXG4gICAgICogKGhhcmRjb2RlZCBzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucywgb2JqZWN0cywgYXJyYXlzIGV0Yy4pLCBlaXRoZXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIHRoZSB3b3JrZmxvdyB2YXJpYWJsZXMuXG4gICAgICogVGhlIHdvcmtmbG93IHZhcmlhYmxlcyBhcmUgYnVpbHQgZnJvbSB0aGUgd29ya2Zsb3cgcGFyYW1zIChlLmcuIHRoZSB3b3JrZmxvdyBjb25maWd1cmF0aW9uKVxuICAgICAqIGFuZCBmcm9tIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGFjdGl2aXRpZXMuXG4gICAgICovXG4gICAgcGFyYW1zPzogUEFSQU1TO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdyB2YXJpYWJsZSB0aGF0IHdpbGwgc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHlcbiAgICAgKiBJZiBub3Qgc3BlY2lmaWVkIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgc3RvcmVkXG4gICAgICogVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmUgaG93IHRoZSBhY3R1YWwgcGFyYW1ldGVycyB3aWxsIGJlIG9idGFpbmVkIGZyb20gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiB2YXJzLlxuICAgICAqIHNpbmNlIGl0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gd29ya2Zsb3cgZXhlY3V0aW9uIHZhcnMuXG4gICAgICovXG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQSBKU09OIGV4cHJlc3Npb24gd2hpY2ggZXZhbHVhdGUgdG8gdHJ1ZSBvciBmYWxzZSBzaW1pbGFyIHRvIG1vbmdvIG1hdGNoZXMuXG4gICAgICogV2Ugc3VwcG9ydCBmb3Igbm93IGJhc2ljIGV4cHJlc3Npb24gbGlrZTogJHRydWUsICRmYWxzZSwgJGVxLCAkbmUsICRndCwgJGd0ZSwgJGx0LCAkbHRlLCAkaW4sICRuaW4sICRyZWdleHBcbiAgICAgKiB7JGVxOiB7bmFtZTogdmFsdWV9fSxcbiAgICAgKiBFeDogeyRlcToge3dmVmFyTmFtZTogdmFsdWV9fVxuICAgICAqL1xuICAgIGNvbmRpdGlvbj86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW1wb3J0IHNwZWMgaXMgdXNlZCB0byBpbXBvcnQgZGF0YSBmcm9tIHdvcmtmbG93IHZhcmlhYmxlcy5cbiAgICAgKiBUaGUgaW1wb3J0IHNwZWMgaXMgYSBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzIHRvIGltcG9ydCBmcm9tIHRoZSB3b3JrZmxvdyBjb250ZXh0LlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2Ugb2JqZWN0cyB0byByZW5hbWUgdGhlIGltcG9ydGVkIHZhcmlhYmxlcywgb3IgdG8gcmVmZXJlbmNlIGFuIGV4cHJlc3Npb24uXG4gICAgICogRXhhbXBsZTpcbiAgICAgKiBbXCJydW5JZFwiLCB7XCJ0eXBlSWRcIjogXCJkb2NUeXBlLmlkXCJ9XVxuICAgICAqL1xuICAgIGltcG9ydD86IEltcG9ydFNwZWM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmV0Y2ggcGhhc2UgaXMgdXNlZCB0byBmZXRjaCBkYXRhIGZyb20gZXh0ZXJuYWwgc291cmNlcy5cbiAgICAgKi9cbiAgICBmZXRjaD86IFJlY29yZDxzdHJpbmcsIEFjdGl2aXR5RmV0Y2hTcGVjPjtcblxuICAgIC8qKlxuICAgICAqIFByb2plY3Rpb24gdG8gYXBwbHkgdG8gdGhlIHJlc3VsdC4gTm90IGFsbCBhY3Rpdml0aWVzIHN1cHBvcnQgdGhpcy5cbiAgICAgKi9cbiAgICBwcm9qZWN0aW9uPzogbmV2ZXIgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgLy8gLS0tLS0tLS0tLSBPcHRpb25hbCBmZWF0dXJlcyBub3QgaW1wbGVtZW50ZWQgaW4gYSBmaXJzdCBzdGVwIC0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIElmIHRydWUgdGhlIGFjdGl2aXR5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgb3RoZXIgYWN0aXZpdGllcy5cbiAgICAgKiAoaS5lLiB0aGUgd29ya2Zsb3cgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIGFjdGl2aXR5IHRvIGZpbmlzaCBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQgb25lKVxuICAgICAqL1xuICAgIHBhcmFsbGVsPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEF3YWl0IGZvciBhIHBhcmFsbGVsIGFjdGl2aXR5IGV4ZWN1dGlvbiB0byByZXR1cm4uXG4gICAgICovXG4gICAgYXdhaXQ/OiBzdHJpbmc7IC8vdGhlIGFjdGl2aXR5IG5hbWUgdG8gYXdhaXRcblxuICAgIC8qKlxuICAgICAqIEFjdGl2aXR5IG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBhY3Rpdml0eSBleGVjdXRpb24sIHdoaWNoIG92ZXJyaWRlcyB0aGUgYWN0aXZpdHkgb3B0aW9uc1xuICAgICAqIGRlZmluZWQgYXQgd29ya2Zsb3cgbGV2ZWwuXG4gICAgICovXG4gICAgb3B0aW9ucz86IERTTEFjdGl2aXR5T3B0aW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEU0xBY3Rpdml0eVN0ZXA8UEFSQU1TIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+IGV4dGVuZHMgRFNMQWN0aXZpdHlTcGVjPFBBUkFNUz4sIERTTFdvcmtmbG93U3RlcEJhc2Uge1xuICAgIHR5cGU6IFwiYWN0aXZpdHlcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEU0xDaGlsZFdvcmtmbG93U3RlcCBleHRlbmRzIERTTFdvcmtmbG93U3RlcEJhc2Uge1xuICAgIHR5cGU6IFwid29ya2Zsb3dcIjtcbiAgICAvLyB0aGUgd29ya2Zsb3cgZW5kcG9pbnQgdG8gcnVuXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIGNoaWxkIHdvcmtmbG93LlxuICAgICAqIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSBtZXJnZWQgb3ZlciB0aGUgcGFyZW50IHdvcmtmbG93IHZhcnMgYW5kIHBhc3NlZCBhbHRvZ2V0aGVyIHRvIHRoZSBjaGlsZCB3b3JrZmxvdy5cbiAgICAgKi9cbiAgICB2YXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAvLyB3aGV0aGVyIG9yIG5vdCB0byB3YWl0IGZvciB0aGUgd29ya2Zsb3cgdG8gZmluaXNoLlxuICAgIC8vIGRlZmF1bHQgaXMgZmFsc2UuICh0aGUgcGFyZW50IHdvcmtmbG93IHdpbGwgYXdhaXQgZm9yIHRoZSB3b3JrZmxvdyB0byBmaW5pc2gpXG4gICAgYXN5bmM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdyB2YXJpYWJsZSB0aGF0IHdpbGwgc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgd29ya2Zsb3cgKGlmIGFzeW5jIHRoZSB3b3JrZmxvdyBpZCBpcyBzdG9yZWQpXG4gICAgICogSWYgbm90IHNwZWNpZmllZCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIHN0b3JlZFxuICAgICAqIFRoZSBwYXJhbWV0ZXJzIGRlc2NyaWJlIGhvdyB0aGUgYWN0dWFsIHBhcmFtZXRlcnMgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gdmFycy5cbiAgICAgKiBzaW5jZSBpdCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHdvcmtmbG93IGV4ZWN1dGlvbiB2YXJzLlxuICAgICAqL1xuICAgIG91dHB1dD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiBjYXNlIHRoZSBkc2xXb3JrZmxvdyBpcyB1c2VkIGFzIGEgY2hpbGQgd29ya2Zsb3cgdGhlIHNwZWMgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGNoaWxkIHdvcmtmbG93LlxuICAgICAqIElmIHNwZWMgaXMgZGVmaW5lZCB0aGVuIHRoZSBuYW1lIG11c3QgYmUgXCJkc2xXb3JrZmxvd1wiXG4gICAgICovXG4gICAgc3BlYz86IERTTFdvcmtmbG93U3BlYztcbiAgICBvcHRpb25zPzoge1xuICAgICAgICBtZW1vPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgcmV0cnk/OiBEU0xSZXRyeVBvbGljeTtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgbnVtYmVyW10gfCBib29sZWFuW10gfCBEYXRlW10+O1xuICAgICAgICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gICAgICAgIHdvcmtmbG93RXhlY3V0aW9uVGltZW91dD86IFN0cmluZ1ZhbHVlIHwgbnVtYmVyO1xuICAgICAgICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcbiAgICAgICAgd29ya2Zsb3dUYXNrVGltZW91dD86IFN0cmluZ1ZhbHVlIHwgbnVtYmVyO1xuICAgICAgICB3b3JrZmxvd0lkPzogc3RyaW5nO1xuICAgICAgICBjcm9uU2NoZWR1bGU/OiBzdHJpbmc7XG4gICAgICAgIHBhcmVudENsb3NlUG9saWN5PzogUGFyZW50Q2xvc2VQb2xpY3lUeXBlO1xuICAgICAgICAvL1RPRE9cbiAgICAgICAgLy9jYW5jZWxsYXRpb25UeXBlXG4gICAgICAgIC8vdmVyc2lvbmluZ0ludGVudFxuICAgICAgICAvL3dvcmtmbG93SWRSZXVzZVBvbGljeVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRFNMV29ya2Zsb3dTdGVwID0gRFNMQWN0aXZpdHlTdGVwIHwgRFNMQ2hpbGRXb3JrZmxvd1N0ZXA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRFNMV29ya2Zsb3dTcGVjQmFzZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcblxuICAgIHN0ZXBzPzogRFNMV29ya2Zsb3dTdGVwW10gfCBuZXZlcjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc3RlcHMgaW5zdGVhZFxuICAgICAqL1xuICAgIGFjdGl2aXRpZXM/OiBEU0xBY3Rpdml0eVNwZWNbXSB8IG5ldmVyO1xuXG4gICAgLy8gYSBkaWN0aW9uYXJ5IG9mIHZhcnMgdG8gaW5pdGlhbGl6ZSB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHZhcnNcbiAgICAvLyBJbml0aWFsIHZhcnMgY2Fubm90IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgdmFyc1xuICAgIHZhcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgLy8gYWN0aXZpdHkgb3B0aW9ucyB0aGF0IGFwcGx5IHRvIGFsbCBhY3Rpdml0aWVzIHdpdGhpbiB0aGUgd29ya2Zsb3dcbiAgICBvcHRpb25zPzogRFNMQWN0aXZpdHlPcHRpb25zO1xuICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgaG9sZCB0aGUgd29ya2Zsb3cgcmVzdWx0XG4gICAgLy8gaWYgbm90IHNwZWNpZmllZCBcInJlc3VsdFwiIHdpbGwgYmUgYXNzdW1lZFxuICAgIHJlc3VsdD86IHN0cmluZztcbiAgICBkZWJ1Z19tb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEU0xXb3JrZmxvd1NwZWNXaXRoU3RlcHMgZXh0ZW5kcyBEU0xXb3JrZmxvd1NwZWNCYXNlIHtcbiAgICBzdGVwczogRFNMV29ya2Zsb3dTdGVwW107XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHN0ZXBzIGluc3RlYWRcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzPzogbmV2ZXI7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHN0ZXBzIGluc3RlYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEU0xXb3JrZmxvd1NwZWNXaXRoQWN0aXZpdGllcyBleHRlbmRzIERTTFdvcmtmbG93U3BlY0Jhc2Uge1xuICAgIHN0ZXBzPzogbmV2ZXI7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHN0ZXBzIGluc3RlYWRcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzOiBEU0xBY3Rpdml0eVNwZWNbXTtcbn1cblxuLyoqXG4gKiBhY3Rpdml0aWVzIGFuZCBzdGVwcyBmaWVsZHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxuICogc3RlcHMgd2FzIGFkZGVkIGFmdGVyIGFjdGl2aXRpZXMgYW5kIG1heSBjb250YWluIGEgbWl4IG9mIGFjdGl2aXRpZXMgYW5kIG90aGVyIHRhc2tzIGxpa2UgZXhlYyBjaGlsZCB3b3JrZmxvd3MuXG4gKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3ZSBrZWVwIHRoZSBhY3Rpdml0aWVzIGZpZWxkIGFzIGEgZmFsbGJhY2sgYnV0IG9uZSBzaG91bGQgdXNlIG9uZSBvciB0aGUgb3RoZXIgbm90IGJvdGguXG4gKi9cbmV4cG9ydCB0eXBlIERTTFdvcmtmbG93U3BlYyA9IERTTFdvcmtmbG93U3BlY1dpdGhTdGVwcyB8IERTTFdvcmtmbG93U3BlY1dpdGhBY3Rpdml0aWVzO1xuXG5leHBvcnQgaW50ZXJmYWNlIERTTFdvcmtmbG93RGVmaW5pdGlvbiBleHRlbmRzIEJhc2VPYmplY3QsIERTTFdvcmtmbG93U3BlY0Jhc2Uge1xuICAgIC8vIGFuIG9wdGlvbmFsIEpTT04gc2NoZW1hIHRvIGRlc2NyaWJlIHRoZSBpbnB1dCB2YXJzIG9mIHRoZSB3b3JrZmxvdy5cbiAgICBpbnB1dF9zY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGFjdGl2aXRpZXM/OiBEU0xBY3Rpdml0eVNwZWNbXTtcbiAgICBzdGVwcz86IERTTFdvcmtmbG93U3RlcFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RGVmaW5pdGlvblJlZiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbn1cblxuZXhwb3J0IGNvbnN0IFdvcmtmbG93RGVmaW5pdGlvblJlZlBvcHVsYXRlID0gXCJpZCBuYW1lIGRlc2NyaXB0aW9uIHRhZ3MgY3JlYXRlZF9hdCB1cGRhdGVkX2F0XCJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2FjdGl2aXR5LWNhdGFsb2cuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FnZW50LmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb2xsZWN0aW9ucy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kb2MtYW5hbHl6ZXIuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RzbC13b3JrZmxvdy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb2JqZWN0LXR5cGVzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zdG9yZS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVtcG9yYWxpby5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd29ya2Zsb3cuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpZ25hbHMuanNcIjtcbiIsImltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYVR5cGUgfSBmcm9tIFwiYWp2XCJcblxuLypEZWZhdWx0IEpTT04gU2NoZW1hIHR5cGUgZm9yIHJlbmRpdGlvbiovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGl0aW9uUHJvcGVydGllcyB7XG4gICAgbWltZV90eXBlOiBzdHJpbmcsXG4gICAgc291cmNlX2V0YWc/OiBzdHJpbmcsXG4gICAgaGVpZ2h0PzogbnVtYmVyLFxuICAgIHdpZHRoPzogbnVtYmVyLFxuICAgIG11bHRpcGFydD86IGJvb2xlYW4sXG4gICAgdG90YWxfcGFydHM/OiBudW1iZXIsXG59XG5cbmV4cG9ydCBjb25zdCBSZW5kaXRpb25TY2hlbWE6IEpTT05TY2hlbWFUeXBlPFJlbmRpdGlvblByb3BlcnRpZXM+ID0ge1xuXG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZXByZXNlbnQgYSByZW5kaXRpb24gb2YgYSBmaWxlIHN0b3JlZCBpbiBhbiBvYmplY3QuIEl0IHdpbGwgYmUgc3RvcmVkIGFzIGEgc2VwYXJhdGUgb2JqZWN0IGluIHRoZSBkYXRhYmFzZS5cIixcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIG1pbWVfdHlwZToge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBmb3JtYXQgb2YgdGhlIHJlbmRpdGlvbi4gVGhpcyBpcyBhIE1JTUUgdHlwZS5cIlxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2VfZXRhZzoge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBFVGFnIG9mIHRoZSBmaWxlIHVzZWQgZm9yIHRoZSByZW5kaXRpb24uXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBoZWlnaHQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGhlaWdodCBvZiB0aGUgcmVuZGl0aW9uXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICB3aWR0aDoge1xuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgd2lkdGggb2YgdGhlIHJlbmRpdGlvblwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlwYXJ0OiB7XG4gICAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIklmIHRoZSByZW5kaXRpb24gaXMgYSBtdWx0aS1wYXJ0IHJlbmRpdGlvblwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB0b3RhbF9wYXJ0czoge1xuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgdG90YWwgbnVtYmVyIG9mIHBhcnRzIGluIHRoZSByZW5kaXRpb25cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbXCJtaW1lX3R5cGVcIl0sXG59XG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50UGFydFByb3BlcnRpZXMge1xuXG4gICAgc291cmNlX2V0YWc/OiBzdHJpbmcsXG4gICAgcGFydF9udW1iZXI6IG51bWJlcixcbiAgICB0aXRsZT86IHN0cmluZyxcbiAgICBzb3VyY2VfbGluZV9zdGFydD86IG51bWJlcixcbiAgICBzb3VyY2VfbGluZV9lbmQ/OiBudW1iZXIsXG4gICAgdHlwZT86ICd0ZXh0JyB8ICdpbWFnZScgfCAndGFibGUnIHwgJ2NoYXJ0JyB8ICdkaWFncmFtJyB8ICdjb2RlJyB8ICdvdGhlcicsXG4gICAgcGFnZV9udW1iZXI/OiBudW1iZXIsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgaGVpZ2h0PzogbnVtYmVyLFxuICAgIHdpZHRoPzogbnVtYmVyLFxuXG59XG5cblxuZXhwb3J0IGNvbnN0IERvY3VtZW50UGFydFNjaGVtYTogSlNPTlNjaGVtYVR5cGU8RG9jdW1lbnRQYXJ0UHJvcGVydGllcz4gPSB7XG4gICAgdHlwZTogXCJvYmplY3RcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZXByZXNlbnQgYSBzZW1hbnRpYyBjaHVuayBvZiBhIGRvY3VtZW50XCIsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgICBzb3VyY2VfZXRhZzoge1xuICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBFVGFnIG9mIHRoZSBmaWxlIHVzZWQgZm9yIHRoZSByZW5kaXRpb24uXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwYXJ0X251bWJlcjoge1xuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgcGFydCBudW1iZXIgb2YgdGhlIGNodW5rXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHRpdGxlIG9mIHRoZSBjaHVua1wiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlX2xpbmVfc3RhcnQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBjaHVuayBzdGFydHNcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZV9saW5lX2VuZDoge1xuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGNodW5rIGVuZHNcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgdHlwZSBvZiB0aGUgY2h1bmtcIixcbiAgICAgICAgICAgIGVudW06IFsndGV4dCcsICdpbWFnZScsICd0YWJsZScsICdjaGFydCcsICdkaWFncmFtJywgJ2NvZGUnLCAnb3RoZXInXSxcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHBhZ2VfbnVtYmVyOiB7XG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBwYWdlIG51bWJlciBvZiB0aGUgZG9jdW1lbnQgcGFydFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRvY3VtZW50IHBhcnQsIGlmIGl0J3MgYW4gaW1hZ2UsIHRoZSBleGhhdXN0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbWFnZVwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgaGVpZ2h0OiB7XG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWlnaHQgb2YgdGhlIHJlbmRpdGlvblwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgd2lkdGg6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHdpZHRoIG9mIHRoZSByZW5kaXRpb25cIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbXCJwYXJ0X251bWJlclwiXSxcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgVXNlcklucHV0U2lnbmFsIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGF1dGhfdG9rZW4/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBTZWFyY2hQYXlsb2FkIH0gZnJvbSBcIi4uL3BheWxvYWQuanNcIjtcbmltcG9ydCB7IFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzIH0gZnJvbSBcIi4uL3Byb2plY3QuanNcIjtcbmltcG9ydCB7IENvbXBsZXhTZWFyY2hRdWVyeSB9IGZyb20gXCIuLi9xdWVyeS5qc1wiO1xuaW1wb3J0IHsgQmFzZU9iamVjdCB9IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuXG5leHBvcnQgZW51bSBDb250ZW50T2JqZWN0U3RhdHVzIHtcbiAgICBjcmVhdGVkID0gXCJjcmVhdGVkXCIsXG4gICAgcHJvY2Vzc2luZyA9IFwicHJvY2Vzc2luZ1wiLCAvLyB0aGUgd2FzIGNyZWF0ZWQgYW5kIHN0aWxsIHByb2Nlc3NpbmdcbiAgICBjb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiLFxuICAgIGZhaWxlZCA9IFwiZmFpbGVkXCIsXG4gICAgYXJjaGl2ZWQgPSBcImFyY2hpdmVkXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1iZWRkaW5nIHtcbiAgICBtb2RlbDogc3RyaW5nOyAvL3RoZSBtb2RlbCB1c2VkIHRvIGdlbmVyYXRlIHRoaXMgZW1iZWRkaW5nXG4gICAgdmFsdWVzOiBudW1iZXJbXTtcbiAgICBldGFnPzogc3RyaW5nOyAvLyB0aGUgZXRhZyBvZiB0aGUgdGV4dCB1c2VkIGZvciB0aGUgZW1iZWRkaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudE9iamVjdDxUID0gYW55PiBleHRlbmRzIENvbnRlbnRPYmplY3RJdGVtPFQ+IHtcbiAgICB0ZXh0Pzogc3RyaW5nOyAvLyB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0XG4gICAgdGV4dF9ldGFnPzogc3RyaW5nO1xuICAgIGVtYmVkZGluZ3M6IFBhcnRpYWw8UmVjb3JkPFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzLCBFbWJlZGRpbmc+PjtcbiAgICBwYXJ0cz86IHN0cmluZ1tdOyAvLyB0aGUgbGlzdCBvZiBvYmplY3RJZCBvZiB0aGUgcGFydHMgb2YgdGhlIG9iamVjdFxuICAgIHBhcnRzX2V0YWc/OiBzdHJpbmc7IC8vIHRoZSBldGFnIG9mIHRoZSB0ZXh0IHVzZWQgZm9yIHRoZSBwYXJ0cyBsaXN0XG4gICAgdHJhbnNjcmlwdD86IFRyYW5zY3JpcHQ7XG59XG5cbmV4cG9ydCB0eXBlIENvbnRlbnROYXR1cmUgPVxuICAgIHwgXCJ2aWRlb1wiXG4gICAgfCBcImltYWdlXCJcbiAgICB8IFwiYXVkaW9cIlxuICAgIHwgXCJkb2N1bWVudFwiXG4gICAgfCBcImNvZGVcIlxuICAgIHwgXCJvdGhlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICAgIGxhdGl0dWRlOiBudW1iZXI7XG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGlvblJ1bk1ldGFkYXRhIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRhdGU6IHN0cmluZztcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50TWV0YWRhdGEge1xuICAgIC8vIENvbW1vbiBmaWVsZHMgZm9yIGFsbCBtZWRpYSB0eXBlc1xuICAgIHR5cGU/OiBDb250ZW50TmF0dXJlO1xuICAgIHNpemU/OiBudW1iZXI7IC8vIGluIGJ5dGVzXG4gICAgbGFuZ3VhZ2VzPzogc3RyaW5nW107XG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICBnZW5lcmF0aW9uX3J1bnM6IEdlbmVyYXRpb25SdW5NZXRhZGF0YVtdO1xuICAgIGV0YWc/OiBzdHJpbmc7XG59XG5cbi8vIEV4YW1wbGUgb2YgdHlwZS1zcGVjaWZpYyBtZXRhZGF0YSBpbnRlcmZhY2VzIChvcHRpb25hbCwgZm9yIGJldHRlciB0eXBlIHNhZmV0eSlcbmV4cG9ydCBpbnRlcmZhY2UgVGVtcG9yYWxNZWRpYU1ldGFkYXRhIGV4dGVuZHMgQ29udGVudE1ldGFkYXRhIHtcbiAgICBkdXJhdGlvbj86IG51bWJlcjsgLy8gaW4gc2Vjb25kc1xuICAgIHRyYW5zY3JpcHQ/OiBUcmFuc2NyaXB0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlTWV0YWRhdGEgZXh0ZW5kcyBDb250ZW50TWV0YWRhdGEge1xuICAgIHR5cGU6IFwiaW1hZ2VcIjtcbiAgICBkaW1lbnNpb25zPzogRGltZW5zaW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdWRpb01ldGFkYXRhIGV4dGVuZHMgVGVtcG9yYWxNZWRpYU1ldGFkYXRhIHtcbiAgICB0eXBlOiBcImF1ZGlvXCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9NZXRhZGF0YSBleHRlbmRzIFRlbXBvcmFsTWVkaWFNZXRhZGF0YSB7XG4gICAgdHlwZTogXCJ2aWRlb1wiO1xuICAgIGRpbWVuc2lvbnM/OiBEaW1lbnNpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEgZXh0ZW5kcyBDb250ZW50TWV0YWRhdGEge1xuICAgIHR5cGU6IFwiZG9jdW1lbnRcIjtcbiAgICBwYWdlX2NvdW50PzogbnVtYmVyO1xuICAgIGNvbnRlbnRfcHJvY2Vzc29yPzoge1xuICAgICAgICB0eXBlPzogc3RyaW5nO1xuICAgICAgICBmZWF0dXJlc19yZXF1ZXN0ZWQ/OiBzdHJpbmdbXTtcbiAgICAgICAgem9uZXNfcmVxdWVzdGVkPzogc3RyaW5nW107XG4gICAgICAgIHRhYmxlX2NvdW50PzogbnVtYmVyO1xuICAgICAgICBpbWFnZV9jb3VudDogbnVtYmVyO1xuICAgICAgICB6b25lX2NvdW50OiBudW1iZXI7XG4gICAgICAgIG5lZWRzX29jcl9jb3VudD86IG51bWJlcjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zY3JpcHQge1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgc2VnbWVudHM/OiBUcmFuc2NyaXB0U2VnbWVudFtdO1xuICAgIGV0YWc/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdFNlZ21lbnQge1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHNwZWFrZXI/OiBudW1iZXI7XG4gICAgZW5kPzogbnVtYmVyO1xuICAgIGNvbmZpZGVuY2U/OiBudW1iZXI7XG4gICAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudFNvdXJjZSB7XG4gICAgLy8gdGhlIFVSSSBvZiB0aGUgY29udGVudCBzb3VyY2UuIFVzdWFsbHkgYW4gVVJMIHRvIHRoZSB1cGxvYWRlZCBmaWxlIGluc2lkZSBhIGNsb3VkIGZpbGUgc3RvcmFnZSBsaWtlIHMzLlxuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICAvLyB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50IHNvdXJjZS5cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8vIHRoZSBvcmlnaW5hbCBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGlmIGFueVxuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLy8gdGhlIGV0YWcgb2YgdGhlIGNvbnRlbnQgc291cmNlIGlmIGFueVxuICAgIGV0YWc/OiBzdHJpbmc7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZpc2lvbkluZm8ge1xuICAgIC8qKiBEaXJlY3QgcGFyZW50IHJldmlzaW9uIGlkIChvbWl0IG9uIHRoZSBmaXJzdCByZXZpc2lvbikgKi9cbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG5cbiAgICAvKiogVGhlIHJvb3QgcmV2aXNpb24gaWQgKG9taXQgb24gdGhlIGZpcnN0IHJldmlzaW9uKSAqL1xuICAgIHJvb3Q6IHN0cmluZztcblxuICAgIC8qKiBUcnVlIGlmIHRoaXMgcmV2aXNpb24gaXMgdGhlIGhlYWQgcmV2aXNpb24gKi9cbiAgICBoZWFkOiBib29sZWFuO1xuXG4gICAgLyoqIEh1bWFu4oCRZnJpZW5kbHkgdGFnIG9yIHN0YXRlIChcInYxLjJcIiwgXCJhcHByb3ZlZFwiKSAqL1xuICAgIGxhYmVsPzogc3RyaW5nO1xuXG4gICAgLyoqIEV4dHJhIHBhcmVudHMgd2hlbiB0d28gYnJhbmNoZXMgYXJlIG1lcmdlZCAobGVhdmUgdW5kZWZpbmVkIHVudGlsIG5lZWRlZCkgKi9cbiAgICAvL21lcmdlX3BhcmVudHM/OiBzdHJpbmdbXTsgLy9tYXliZSBsYXRlclxuXG4gICAgLyoqIFBvaW50ZXIgdG8gYSBkaWZmIC8gcGF0Y2ggYmxvYiBpZiB5b3Ugc3RvcmUgZGVsdGFzIGluc3RlYWQgb2YgZnVsbCBjb250ZW50ICovXG4gICAgLy9kZWx0YV9yZWY/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGNvbnRlbnQgb2JqZWN0IGl0ZW0gaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIENvbnRlbnRPYmplY3QgdGhhdCBpcyByZXR1cm5lZCBieSB0aGUgc3RvcmUgQVBJIHdoZW4gbGlzdGluZyBvYmplY3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRPYmplY3RJdGVtPFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiBleHRlbmRzIEJhc2VPYmplY3Qge1xuICAgIHBhcmVudDogc3RyaW5nOyAvLyB0aGUgaWQgb2YgdGhlIGRpcmVjdCBwYXJlbnQgb2JqZWN0LiBUaGUgcm9vdCBvYmplY3QgZG9lc24ndCBoYXZlIHRoZSBwYXJlbnQgZmllbGQgc2V0LlxuXG4gICAgLyoqIEFuIG9wdGlvbmFsIHBhdGggYmFzZWQgbG9jYXRpb24gZm9yIHRoZSBvYmplY3QgKi9cbiAgICBsb2NhdGlvbjogc3RyaW5nOyAvLyB0aGUgcGF0aCBvZiB0aGUgcGFyZW50IG9iamVjdFxuXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHN0YXR1cy5cbiAgICAgKiAtIGNyZWF0ZWQ6IHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYW5kIGlzIGJlaW5nIHByb2Nlc3NlZFxuICAgICAqIC0gcHJvY2Vzc2luZzogdGhlIG9iamVjdCBpcyBiZWluZyBwcm9jZXNzZWRcbiAgICAgKiAtIGNvbXBsZXRlZDogdGhlIG9iamVjdCB3YXMgcHJvY2Vzc2VkIGFuZCBpcyByZWFkeSB0byB1c2VcbiAgICAgKiAtIGZhaWxlZDogdGhlIG9iamVjdCBwcm9jZXNzaW5nIGZhaWxlZFxuICAgICAqIC0gYXJjaGl2ZWQ6IHRoZSBvYmplY3Qgd2FzIGFyY2hpdmVkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlXG4gICAgICovXG4gICAgc3RhdHVzOiBDb250ZW50T2JqZWN0U3RhdHVzO1xuXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHR5cGUgaWQuXG4gICAgICovXG4gICAgdHlwZT86IENvbnRlbnRPYmplY3RUeXBlUmVmO1xuXG4gICAgLyoqXG4gICAgICogQ29udGVudCBzb3VyY2UgaW5mb3JtYXRpb24sIHR5cGljYWxseSBhIGxpbmsgdG8gYW4gb2JqZWN0IHN0b3JlXG4gICAgICovXG4gICAgY29udGVudDogQ29udGVudFNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIEV4dGVybmFsIGlkZW50aWZpZXIgZm9yIGludGVncmF0aW9uIHdpdGggb3RoZXIgc3lzdGVtc1xuICAgICAqL1xuICAgIGV4dGVybmFsX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqIFRoZSBvYmplY3QgcHJvcGVydGllcy4gVGhpcyBpcyBhIEpTT04gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBvYmplY3QsIG1hdGNoaW5nIHRoZSBvYmplY3QgdHlwZSBzY2hlbWEgKi9cbiAgICBwcm9wZXJ0aWVzOiBUOyAvLyBhIEpTT04gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBvYmplY3RcblxuICAgIC8qKiBUZWNobmljYWwgbWV0YWRhdGEgb2YgdGhlIG9iamVjdCAqL1xuICAgIG1ldGFkYXRhPzpcbiAgICB8IFZpZGVvTWV0YWRhdGFcbiAgICB8IEF1ZGlvTWV0YWRhdGFcbiAgICB8IEltYWdlTWV0YWRhdGFcbiAgICB8IERvY3VtZW50TWV0YWRhdGFcbiAgICB8IENvbnRlbnRNZXRhZGF0YTtcblxuICAgIC8qKiBUb2tlbiBpbmZvcm1hdGlvbiAgKi9cbiAgICB0b2tlbnM/OiB7XG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIHRoZSBudW1iZXIgb2YgdG9rZW5zIGluIHRoZSB0ZXh0XG4gICAgICAgIGVuY29kaW5nOiBzdHJpbmc7IC8vIHRoZSBlbmNvZGluZyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdG9rZW5zXG4gICAgICAgIGV0YWc6IHN0cmluZzsgLy90aGUgZXRhZyBvZiB0aGUgdGV4dCB1c2VkIGZvciB0aGUgdG9rZW4gY291bnRcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV2aXNpb24gaW5mb3JtYXRpb24uIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgaGlzdG9yeSBvZiB0aGUgb2JqZWN0LlxuICAgICAqL1xuICAgIHJldmlzaW9uOiBSZXZpc2lvbkluZm87IC8vIHRoZSByZXZpc2lvbiBpbmZvIG9mIHRoZSBvYmplY3RcblxuICAgIC8qKlxuICAgICAqIFNvZnQgZGVsZXRlIGZsYWcuIFdoZW4gdHJ1ZSwgdGhlIG9iamVjdCBzaG91bGQgYmUgY29uc2lkZXJlZCBkZWxldGVkXG4gICAgICogYnV0IGlzIHN0aWxsIHJldGFpbmVkIGluIHRoZSBkYXRhYmFzZSBmb3IgaGlzdG9yaWNhbCBwdXJwb3Nlcy5cbiAgICAgKi9cbiAgICBpc19kZWxldGVkPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNvZnQgbG9jayBmbGFnLiBXaGVuIHRydWUsIHRoZSBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVhZC1vbmx5XG4gICAgICogYW5kIG1vZGlmaWNhdGlvbiBhdHRlbXB0cyBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICovXG4gICAgaXNfbG9ja2VkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXaGVuIGNyZWF0aW5nIGZyb20gYW4gdXBsb2FkZWQgZmlsZSB0aGUgY29udGVudCBzaG91bGQgYmUgYW4gVVJMIHRvIHRoZSB1cGxvYWRlZCBmaWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQ29udGVudE9iamVjdFBheWxvYWQ8VCA9IGFueT5cbiAgICBleHRlbmRzIFBhcnRpYWw8XG4gICAgICAgIE9taXQ8XG4gICAgICAgICAgICBDb250ZW50T2JqZWN0PFQ+LFxuICAgICAgICAgICAgXCJpZFwiIHwgXCJyb290XCIgfCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJ0eXBlXCIgfCBcIm93bmVyXCJcbiAgICAgICAgPlxuICAgID4ge1xuICAgIGlkPzogc3RyaW5nOyAvLyBBbiBvcHRpb25hbCBleGlzdGluZyBvYmplY3QgSUQgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBvbmVcbiAgICB0eXBlPzogc3RyaW5nOyAvLyB0aGUgb2JqZWN0IHR5cGUgSURcbiAgICBnZW5lcmF0aW9uX3J1bl9pbmZvPzogR2VuZXJhdGlvblJ1bk1ldGFkYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRPYmplY3RUeXBlUmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4U2VhcmNoUGF5bG9hZCBleHRlbmRzIE9taXQ8U2VhcmNoUGF5bG9hZCwgXCJxdWVyeVwiPiB7XG4gICAgcXVlcnk/OiBDb21wbGV4U2VhcmNoUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uTGF5b3V0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF0aCBvZiB0aGUgZmllbGQgdG8gdXNlIChlLmcuIFwicHJvcGVydGllcy50aXRsZVwiKVxuICAgICAqL1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdG8gZGlzcGxheSBpbiB0aGUgdGFibGUgY29sdW1uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCBzcGVjaWZpZXMgaG93IHRoZSByZW5kZXJpbmcgd2lsbCBiZSBkb25lLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBzdHJpbmcgdHlwZSB3aWxsIGJlIHVzZWQuXG4gICAgICogVGhlIHR5cGUgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHByZXBlbmRlZCB1c2luZyBhIHdlYi1saWtlIHF1ZXJ5IHN0cmluZyBzeW50YXg6IGRhdGU/TExMXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvKlxuICAgICAqIGEgZmFsbGJhY2sgZmllbGQgdG8gdXNlIGlmIHRoZSBmaWVsZCBpcyBub3QgcHJlc2VudCBpbiB0aGUgb2JqZWN0XG4gICAgICovXG4gICAgZmFsbGJhY2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgaWYgdGhlIGZpZWxkIGlzIG5vdCBwcmVzZW50IGluIHRoZSBvYmplY3RcbiAgICAgKi9cbiAgICBkZWZhdWx0PzogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50T2JqZWN0VHlwZSBleHRlbmRzIENvbnRlbnRPYmplY3RUeXBlSXRlbSB7IH1cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudE9iamVjdFR5cGVJdGVtIGV4dGVuZHMgQmFzZU9iamVjdCB7XG4gICAgaXNfY2h1bmthYmxlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG9ubHkgaW5jbHVkZWQgaW4gQ29udGVudE9iamVjdFR5cGVJdGVtIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkXG4gICAgICogSXQgaXMgYWx3YXlzIGluY2x1ZGVkIGluIENvbnRlbnRPYmplY3RUeXBlXG4gICAgICovXG4gICAgdGFibGVfbGF5b3V0PzogQ29sdW1uTGF5b3V0W107XG4gICAgLyoqXG4gICAgICogdGhpcyBpcyBvbmx5IGluY2x1ZGVkIGluIENvbnRlbnRPYmplY3RUeXBlSXRlbSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZFxuICAgICAqIEl0IGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBDb250ZW50T2JqZWN0VHlwZVxuICAgICAqL1xuICAgIG9iamVjdF9zY2hlbWE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyAvLyBhbiBvcHRpb25hbCBKU09OIHNjaGVtYSBmb3IgdGhlIG9iamVjdCBwcm9wZXJ0aWVzLlxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY29udGVudCB3aWxsIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBvYmplY3Qgc2NoZW1hIGEgZ2VuZXJhdGlvbiB0aW1lIGFuZCBzYXZlL3VwZGF0ZSB0aW1lLlxuICAgICAqL1xuICAgIHN0cmljdF9tb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVDb250ZW50T2JqZWN0VHlwZVBheWxvYWRcbiAgICBleHRlbmRzIE9taXQ8XG4gICAgICAgIENvbnRlbnRPYmplY3RUeXBlLFxuICAgICAgICBcImlkXCIgfCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJjcmVhdGVkX2J5XCIgfCBcInVwZGF0ZWRfYnlcIlxuICAgID4geyB9XG5cbmV4cG9ydCBlbnVtIFdvcmtmbG93UnVsZUlucHV0VHlwZSB7XG4gICAgc2luZ2xlID0gXCJzaW5nbGVcIixcbiAgICBtdWx0aXBsZSA9IFwibXVsdGlwbGVcIixcbiAgICBub25lID0gXCJub25lXCIsXG59XG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UnVsZUl0ZW0gZXh0ZW5kcyBCYXNlT2JqZWN0IHtcbiAgICAvLyB0aGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICBlbmRwb2ludDogc3RyaW5nO1xuICAgIGlucHV0X3R5cGU6IFdvcmtmbG93UnVsZUlucHV0VHlwZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dSdWxlIGV4dGVuZHMgV29ya2Zsb3dSdWxlSXRlbSB7XG4gICAgLypcbiAgICAgKiBtb25nbyBtYXRjaGluZyBydWxlcyBmb3IgYSBjb250ZW50IGV2ZW50XG4gICAgICovXG4gICAgbWF0Y2g/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIC8qKlxuICAgICAqIEFjdGl2aXRpZXMgY29uZmlndXJhdGlvbiBpZiBhbnkuXG4gICAgICovXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqIERlYnVnIG1vZGUgZm9yIHRoZSBydWxlXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b21lciBvdmVycmlkZSBmb3IgdGhlIHJ1bGVcbiAgICAgKiBXaGVuIHNldCB0byB0cnVlIHRoZSBydWxlIHdpbGwgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIHN5c3RlbVxuICAgICAqL1xuICAgIGN1c3RvbWVyX292ZXJyaWRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVXb3JrZmxvd1J1bGVQYXlsb2FkIGV4dGVuZHMgVXBsb2FkV29ya2Zsb3dSdWxlUGF5bG9hZCB7XG4gICAgbmFtZTogc3RyaW5nOyAvLyByZXF1aXJlZFxuICAgIGVuZHBvaW50OiBzdHJpbmc7IC8vIHJlcXVpcmVkXG59XG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFdvcmtmbG93UnVsZVBheWxvYWRcbiAgICBleHRlbmRzIFBhcnRpYWw8XG4gICAgICAgIE9taXQ8V29ya2Zsb3dSdWxlLCBcImlkXCIgfCBcImNyZWF0ZWRfYXRcIiB8IFwidXBkYXRlZF9hdFwiIHwgXCJvd25lclwiPlxuICAgID4geyB9XG5cbmV4cG9ydCBlbnVtIEltYWdlUmVuZGl0aW9uRm9ybWF0IHtcbiAgICBqcGVnID0gXCJqcGVnXCIsXG4gICAgcG5nID0gXCJwbmdcIixcbiAgICB3ZWJwID0gXCJ3ZWJwXCIsXG59XG5cbmV4cG9ydCBlbnVtIE1hcmtkb3duUmVuZGl0aW9uRm9ybWF0IHtcbiAgICBkb2N4ID0gXCJkb2N4XCIsXG4gICAgcGRmID0gXCJwZGZcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRSZW5kaXRpb25QYXJhbXMge1xuICAgIGZvcm1hdDogSW1hZ2VSZW5kaXRpb25Gb3JtYXQgfCBNYXJrZG93blJlbmRpdGlvbkZvcm1hdDtcbiAgICBtYXhfaHc/OiBudW1iZXI7XG4gICAgZ2VuZXJhdGVfaWZfbWlzc2luZz86IGJvb2xlYW47XG4gICAgc2lnbl91cmw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlbmRpdGlvblJlc3BvbnNlIHtcbiAgICBzdGF0dXM6IFwiZm91bmRcIiB8IFwiZ2VuZXJhdGluZ1wiIHwgXCJmYWlsZWRcIjtcbiAgICByZW5kaXRpb25zPzogc3RyaW5nW107IC8vZmlsZSBwYXRocyBmb3IgdGhlIHJlbmRpdGlvbnNcbiAgICB3b3JrZmxvd19ydW5faWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VXBsb2FkVXJsUGF5bG9hZCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG1pbWVfdHlwZT86IHN0cmluZztcbiAgICB0dGw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZVVybFBheWxvYWQge1xuICAgIGZpbGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRGaWxlVXJsUmVzcG9uc2Uge1xuICAgIHVybDogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWltZV90eXBlOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xufVxuIiwiLyoqXG4gKiBDb3BpZWQgZnJvbSB0ZW1wb3JhbGlvXG4gKiBUaGUgdGVtcG9yYWxpbyBQYXJlbnRDbG9zZVBvbGljeVxuICovXG5leHBvcnQgdHlwZSBQYXJlbnRDbG9zZVBvbGljeVR5cGUgPSBcIlRFUk1JTkFURVwiIHwgXCJBQkFORE9OXCIgfCBcIlJFUVVFU1RfQ0FOQ0VMXCIgfCB1bmRlZmluZWQ7XG5pbnRlcmZhY2UgUGFyZW50Q2xvc2VQb2xpY3lJIHtcbiAgICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCIsXG4gICAgQUJBTkRPTjogXCJBQkFORE9OXCIsXG4gICAgUkVRVUVTVF9DQU5DRUw6IFwiUkVRVUVTVF9DQU5DRUxcIixcbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG4gICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU6IFwiVEVSTUlOQVRFXCIsXG4gICAgUEFSRU5UX0NMT1NFX1BPTElDWV9BQkFORE9OOiBcIkFCQU5ET05cIixcbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1JFUVVFU1RfQ0FOQ0VMOiBcIlJFUVVFU1RfQ0FOQ0VMXCJcbn1cbmV4cG9ydCBjb25zdCBQYXJlbnRDbG9zZVBvbGljeSA9IHtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0XG4gICAgICovXG4gICAgVEVSTUlOQVRFOiBcIlRFUk1JTkFURVwiLFxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAgICovXG4gICAgQUJBTkRPTjogXCJBQkFORE9OXCIsXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICAgKi9cbiAgICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiLFxuICAgIC8qKlxuICAgICAqIElmIGEgYFBhcmVudENsb3NlUG9saWN5YCBpcyBzZXQgdG8gdGhpcywgb3IgaXMgbm90IHNldCBhdCBhbGwsIHRoZSBzZXJ2ZXIgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHNldCBhbiBleHBsaWNpdCBwb2xpY3kgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIFRlcm1pbmF0ZWQuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURX0gaW5zdGVhZC5cbiAgICAgKi9cbiAgICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURTogXCJURVJNSU5BVEVcIixcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCBub3RoaW5nIGlzIGRvbmUgdG8gdGhlIENoaWxkLlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTjogXCJBQkFORE9OXCIsXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIENhbmNlbGxlZC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUx9IGluc3RlYWQuXG4gICAgICovXG4gICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiXG59IGFzIFBhcmVudENsb3NlUG9saWN5STtcbiIsImV4cG9ydCBlbnVtIENvbnRlbnRFdmVudE5hbWUge1xuICAgIGNyZWF0ZSA9IFwiY3JlYXRlXCIsXG4gICAgY2hhbmdlX3R5cGUgPSBcImNoYW5nZV90eXBlXCIsXG4gICAgdXBkYXRlID0gXCJ1cGRhdGVcIixcbiAgICByZXZpc2lvbl9jcmVhdGVkID0gXCJyZXZpc2lvbl9jcmVhdGVkXCIsXG4gICAgZGVsZXRlID0gXCJkZWxldGVcIixcbiAgICB3b3JrZmxvd19maW5pc2hlZCA9IFwid29ya2Zsb3dfZmluaXNoZWRcIixcbiAgICB3b3JrZmxvd19leGVjdXRpb25fcmVxdWVzdCA9IFwid29ya2Zsb3dfZXhlY3V0aW9uX3JlcXVlc3RcIixcbiAgICBhcGlfcmVxdWVzdCA9IFwiYXBpX3JlcXVlc3RcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0V4ZWN1dGlvbkJhc2VQYXJhbXM8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVmIG9mIHRoZSB1c2VyIHdobyBpbml0aWF0ZWQgdGhlIHdvcmtmbG93LlxuICAgICAqL1xuICAgIGluaXRpYXRlZF9ieT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIG9mIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBhY3Rpdml0eS5cbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCB0byBzZWxlY3QgdGhlIHJpZ2h0IGRhdGFiYXNlIHRvIHdvcmsgb24uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHByb2plY3QgSUQgb2YgdGhlIGFjY291bnQgd2hvIGNyZWF0ZWQgdGhlIGFjdGl2aXR5LlxuICAgICAqL1xuICAgIHByb2plY3RfaWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB2YXJzIGZpZWxkIGlzIG1haW5seSB1c2VkIHRvIHBhc3MgdGhlIHVzZXIgaW5wdXQgdG8gdGhlIHdvcmtmbG93LlxuICAgICAqIFRoZSB1c2VyIGlucHV0IGFyIGN1c3RvbSB1c2VyIG9wdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHdvcmtmbG93LlxuICAgICAqIFlvdSBjYW4gc2VlIHRoZSB1c2VyIGlucHV0IGFzIHRoZSBhcmd1bWVudHMgZm9yIGEgY29tbWFuZCBsaW5lIGFwcC5cbiAgICAgKlxuICAgICAqIEluIHRoZSBjYXNlIG9mIHdvcmtmbG93cyBzdGFydGVkIGJ5IGV2ZW50cyAoZS5nLiB1c2luZyBhIGEgd29ya2Zsb3cgcnVsZSkgdGhlIHVzZXIgaW5wdXQgdmFycyB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIHdvcmtmbG93IHJ1bGUgY29uZmlndXJhdGlvbiBmaWVsZC5cbiAgICAgKlxuICAgICAqIEluIGNhc2Ugb2YgZHNsIHdvcmtmbG93cyB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHBheWxvYWQgdmFycyB3aWxsIGJlIGFwcGxpZWQgb3ZlciB0aGUgZGVmYXVsdCB2YXJzIHZhbHVlcyBzdG9yZWQgaW4gdGhlIERTTCB2YXJzIGZpZWxkLlxuICAgICAqL1xuICAgIHZhcnM6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBBdXRoIFRva2VuIHRvIGFjY2VzcyBaZW5vIGFuZCBDb21wb3NhYmxlIGZyb20gdGhlIHdvcmtlcnNcbiAgICAgKi9cbiAgICBhdXRoX3Rva2VuPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAgICovXG4gICAgY29uZmlnPzoge1xuICAgICAgICBzdHVkaW9fdXJsOiBzdHJpbmc7XG4gICAgICAgIHN0b3JlX3VybDogc3RyaW5nO1xuICAgICAgICBzbGFja19hcHBfdXJsPzogc3RyaW5nO1xuICAgICAgICBlbmFibGVkX2ludGVncmF0aW9ucz86IHN0cmluZ1tdOyAvL2xpc3Qgb2YgZW5hYmxlZCBpbnRlZ3JhdGlvbnNcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgZW5kcG9pbnRzIHRvIG5vdGlmeSB3aGVuIHRoZSB3b3JrZmxvdyBmaW5pc2hlcy5cbiAgICAgKiBJdCBpcyBoYW5kbGVkIGJ5IGEgc3ViLXdvcmtmbG93IGV4ZWN1dGlvbiwgc28gdGhlIG1haW4gd29ya2Zsb3cgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiB0byBiZSBzZW50LlxuICAgICAqL1xuICAgIG5vdGlmeV9lbmRwb2ludHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKiBJZiB0aGlzIGlzIGEgY2hpbGQgd29ya2Zsb3csIHBhcmVudCBjb250YWlucyBwYXJlbnQncyBpZHMgICovXG4gICAgcGFyZW50Pzoge1xuICAgICAgICBydW5faWQ6IHN0cmluZztcbiAgICAgICAgd29ya2Zsb3dfaWQ6IHN0cmluZztcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZDxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4gZXh0ZW5kcyBXb3JrZmxvd0V4ZWN1dGlvbkJhc2VQYXJhbXM8VD4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB3aGljaCBzdGFydGVkIHRoZSB3b3JrZmxvdyB3aG8gY3JlYXRlZCB0aGUgYWN0aXZpdHkuXG4gICAgICovXG4gICAgZXZlbnQ6IENvbnRlbnRFdmVudE5hbWU7XG5cbiAgICAvKlxuICAgICAqIFRoZSBXb3JrZmxvdyBSdWxlIElEIGlmIGFueS4gSWYgdGhlIHdvcmtmbG93IHdhcyBzdGFydGVkIGJ5IGEgcnVsZSB0aGlzIGZpZWxkIHdpbGwgY29udGFpbiB0aGUgcnVsZSBJRFxuICAgICAqIG90aGVyd2lzZSBpZiB0aGUgd29ya2Zsb3cgd2FzIHN0YXJ0ZWQgb24gZGVtYW5kIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHVuZGVmaW5lZC5cbiAgICAgKi9cbiAgICB3Zl9ydWxlX25hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRhcmdldCBvYmplY3RzIHByb2Nlc3NlZCBieSB0aGUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgb2JqZWN0SWRzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEF1dGggVG9rZW4gdG8gYWNjZXNzIFplbm8gYW5kIENvbXBvc2FibGUgZnJvbSB0aGUgd29ya2Vyc1xuICAgICAqL1xuICAgIGF1dGhfdG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERvY3VtZW50SWRzKHBheWxvYWQ6IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoXCJvYmplY3RJZHNcIiBpbiBwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiBwYXlsb2FkLm9iamVjdElkcztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVXb3JrZmxvd1BheWxvYWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXNrIHF1ZXVlIHRvIGFzc2lnbiB0aGUgd29ya2Zsb3cgdG8uIERlcHJlY2F0ZWQsIHF1ZXVlcyBhcmUgY2hvb3NlbmQgc2VydmVyIHNpZGVcbiAgICAgKi9cbiAgICAvL0BkZXByZWNhdGVkXG4gICAgdGFza19xdWV1ZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERvY3V1bWVudCBJRHMgcG9uIHdoaWNoIHRoZSB3b3JrZmxvdyB3aWxsIGJlIGV4ZWN1dGVkLCBkZXByZWNhdGVkLCByZXBsYWNlZCBwYXJhbXMgaW4gdmFyc1xuICAgICAqL1xuICAgIC8vQGRlcHJlY2F0ZWRcbiAgICBvYmplY3RJZHM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3dcbiAgICAgKi9cbiAgICB2YXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIC8qKlxuICAgICAqIE1ha2UgdGhlIHdvcmtmbG93IElEIHVuaXF1ZSBieSBhbHdheXMgYWRkaW5nIGEgcmFuZG9tIHRva2VuIHRvIHRoZSBJRC5cbiAgICAgKi9cbiAgICB1bmlxdWU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQSBjdXN0b20gSUQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGlkIGluc3RlYWQgb2YgdGhlIGdlbmVyYXRlZCBvbmUuXG4gICAgICovXG4gICAgY3VzdG9tX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGltZW91dCBmb3IgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiB0byBjb21wbGV0ZSwgaW4gc2Vjb25kcy5cbiAgICAgKi9cbiAgICB0aW1lb3V0PzogbnVtYmVyOyAvL3RpbWVvdXQgaW4gc2Vjb25kc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RXb3JrZmxvd1J1bnNQYXlsb2FkIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZG9jdW1lbnQgSUQgcGFzc2VkIHRvIGEgd29ya2Zsb3cgcnVuLlxuICAgICAqL1xuXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGUgd29ya2Zsb3cuXG4gICAgICovXG4gICAgZXZlbnRfbmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB3b3JrZmxvdyBydWxlIElEIHRoYXQgdHJpZ2dlcmVkIHRoZSB3b3JrZmxvdy5cbiAgICAgKi9cbiAgICBydWxlX2lkPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IHRpbWUgZm9yIGZpbHRlcmluZyB3b3JrZmxvdyBydW5zLlxuICAgICAqL1xuICAgIHN0YXJ0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGVuZCB0aW1lIGZvciBmaWx0ZXJpbmcgd29ya2Zsb3cgcnVucy5cbiAgICAgKi9cbiAgICBlbmQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSB3b3JrZmxvdyBydW4uXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogc2VhcmNoIHRlcm0gdG8gZmlsdGVyIG9uIHdvcmtmbG93IGlkIGFuZCBydW4gaWRcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIG9yIHNlcnZpY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgd29ya2Zsb3cgcnVuLlxuICAgICAqL1xuICAgIGluaXRpYXRlZF9ieT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEx1Y2VuZSBxdWVyeSBzdHJpbmcgdG8gc2VhcmNoIGZvciB0aGUgd29ya2Zsb3cgcnVucy5cbiAgICAgKiBUaGlzIGlzIGEgZnVsbCB0ZXh0IHNlYXJjaCBvbiB0aGUgd29ya2Zsb3cgcnVuIGhpc3RvcnkuXG4gICAgICovXG4gICAgcXVlcnk/OiBzdHJpbmc7XG5cbiAgICB0eXBlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgV29ya2Zsb3dSdW5FdmVudCB7XG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICBldmVudF90aW1lOiBudW1iZXI7XG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIHRhc2tfaWQ6IHN0cmluZztcbiAgICBhdHRlbXB0OiBudW1iZXI7XG5cbiAgICBhY3Rpdml0eT86IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICBpbnB1dD86IGFueTtcbiAgICB9O1xuXG4gICAgZXJyb3I/OiB7XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgc291cmNlOiBzdHJpbmc7XG4gICAgICAgIHN0YWNrdHJhY2U6IHN0cmluZztcbiAgICAgICAgdHlwZT86IHN0cmluZztcbiAgICB9O1xuXG4gICAgcmVzdWx0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93UnVuIHtcbiAgICBzdGF0dXM/OiBXb3JrZmxvd0V4ZWN1dGlvblN0YXR1cyB8IHN0cmluZztcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIHN0YXJ0ZWRfYXQ/OiBudW1iZXI7XG4gICAgY2xvc2VkX2F0PzogbnVtYmVyO1xuICAgIGV4ZWN1dGlvbl9kdXJhdGlvbj86IG51bWJlcjtcbiAgICBydW5faWQ/OiBzdHJpbmc7XG4gICAgd29ya2Zsb3dfaWQ/OiBzdHJpbmc7XG4gICAgaW5pdGlhdGVkX2J5Pzogc3RyaW5nO1xuICAgIHJlc3VsdD86IGFueTtcbiAgICByYXc/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dSdW5XaXRoRGV0YWlscyBleHRlbmRzIFdvcmtmbG93UnVuIHtcbiAgICBoaXN0b3J5PzogV29ya2Zsb3dSdW5FdmVudFtdO1xuICAgIG1lbW8/OiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICB9IHwgbnVsbDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFdvcmtmbG93UnVuc1Jlc3BvbnNlIHtcbiAgICBydW5zOiBXb3JrZmxvd1J1bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRzSW50ZXJhY3Rpb25QYXJhbXMgZXh0ZW5kcyBPbWl0PFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCwgXCJjb25maWdcIj4ge1xuICAgIGNvbmZpZzoge1xuICAgICAgICBpbnRlcmFjdGlvbk5hbWU6IHN0cmluZztcbiAgICAgICAgYWN0aW9uOiBEb2N1bWVudEFjdGlvbkNvbmZpZztcbiAgICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QWN0aW9uQ29uZmlnIHtcbiAgICBjb250ZW50VHlwZU5hbWU/OiBzdHJpbmc7IC8vY29udGVudCB0eXBlIHRvIHVzZVxuICAgIHNldEFzUHJvcGVydGllczogYm9vbGVhbjsgLy9zZXQgcmVzdWx0IGFzIHByb3BlcnRpZXNcbiAgICBzZXRBc1RleHQ6IHN0cmluZzsgLy9zZXQgcmVzdWx0IGFzIHRleHQsIGlmIHJlc3VsdCBzZXQgdGhlIHdob2xlIHJlc3VsdCBhcyB0ZXh0XG4gICAgc2V0TmFtZUZyb206IHN0cmluZzsgLy9yZXN1bHQgcHJvcGVydHkgdG8gdXNlIGFzIG5hbWVcbiAgICB1cHNlcnQ6IGJvb2xlYW47IC8vd2V0aGVyIHRvIHVwc2VydCBvciB1cGRhdGUgb25seVxuICAgIGRvY3VtZW50SWQ/OiBzdHJpbmc7IC8vZG9jIElkIHRvIHVwZGF0ZVxuICAgIHBhcmVudElkPzogc3RyaW5nOyAvL3BhcmVudElkIGZvciB0aGUgY3JlYXRlZCBkb2Ncbn1cblxuZXhwb3J0IGVudW0gV29ya2Zsb3dFeGVjdXRpb25TdGF0dXMge1xuICAgIFVOS05PV04gPSAwLFxuICAgIFJVTk5JTkcgPSAxLFxuICAgIENPTVBMRVRFRCA9IDIsXG4gICAgRkFJTEVEID0gMyxcbiAgICBDQU5DRUxFRCA9IDQsXG4gICAgVEVSTUlOQVRFRCA9IDUsXG4gICAgQ09OVElOVUVEX0FTX05FVyA9IDYsXG4gICAgVElNRURfT1VUID0gNyxcbn1cblxuLyoqXG4gKiBCYXNpYyByZXNwb25zZSBmb3IgYW55dGhpbmcgcnVuIHdpdGggYW4gYXN5bmMgd29ya2Zsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd1J1blN0YXR1cyB7XG4gICAgd29ya2Zsb3dfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgd29ya2Zsb3dfcnVuX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIHN0YXR1czogV29ya2Zsb3dFeGVjdXRpb25TdGF0dXM7XG59XG5cbi8qKlxuICogV29ya2Zsb3cgVXBkYXRlIE1lc3NhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZ2VudE1lc3NhZ2Uge1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgIHdvcmtmbG93X3J1bl9pZDogc3RyaW5nO1xuICAgIHR5cGU6IEFnZW50TWVzc2FnZVR5cGU7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGRldGFpbHM/OiBhbnk7XG4gICAgd29ya3N0cmVhbV9pZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGVudW0gQWdlbnRNZXNzYWdlVHlwZSB7XG4gICAgU1lTVEVNID0gXCJzeXN0ZW1cIixcbiAgICBUSE9VR0hUID0gXCJ0aG91Z2h0XCIsXG4gICAgUExBTiA9IFwicGxhblwiLFxuICAgIFVQREFURSA9IFwidXBkYXRlXCIsXG4gICAgQ09NUExFVEUgPSBcImNvbXBsZXRlXCIsXG4gICAgV0FSTklORyA9IFwid2FybmluZ1wiLFxuICAgIEVSUk9SID0gXCJlcnJvclwiLFxuICAgIEFOU1dFUiA9IFwiYW5zd2VyXCIsXG4gICAgUVVFU1RJT04gPSBcInF1ZXN0aW9uXCIsXG4gICAgUkVRVUVTVF9JTlBVVCA9IFwicmVxdWVzdF9pbnB1dFwiLFxuICAgIElETEUgPSBcImlkbGVcIixcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGFuVGFzayB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBnb2FsOiBzdHJpbmc7XG4gICAgaW5zdHJ1Y3Rpb25zOiBzdHJpbmdbXTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIHN0YXR1cz86IFwicGVuZGluZ1wiIHwgXCJpbl9wcm9ncmVzc1wiIHwgXCJjb21wbGV0ZWRcIiB8IFwic2tpcHBlZFwiO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYW4ge1xuICAgIHBsYW46IFBsYW5UYXNrW107XG4gICAgY29tbWVudD86IHN0cmluZztcbn1cbiIsIi8qKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBvbmx5IG9uIHRoZSBjbGllbnQgc2lkZSBhbmQgaXMgc2hhcmVkIGJldHdlZW4gQHZlcnRlc2lhL3VpL3Nlc3Npb24gYW5kIHRoZSBtYWluIGFwcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVSVJlc29sdmVkVGVuYW50IHtcbiAgICBmaXJlYmFzZVRlbmFudElkOiBzdHJpbmc7XG4gICAgbGFiZWw/OiBzdHJpbmc7XG4gICAgbG9nbz86IHN0cmluZztcbiAgICBwcm92aWRlcj86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBUcmFpbmluZ0pvYiB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB7IEV4ZWN1dGlvbkVudmlyb25tZW50UmVmIH0gZnJvbSBcIi4vZW52aXJvbm1lbnQuanNcIjtcblxuZXhwb3J0IGVudW0gVHJhaW5pbmdTZXNzaW9uU3RhdHVzIHtcbiAgICAnY3JlYXRlZCcgPSAnY3JlYXRlZCcsXG4gICAgJ2J1aWxkaW5nJyA9ICdidWlsZGluZycsXG4gICAgJ3ByZXBhcmVkJyA9ICdwcmVwYXJlZCcsXG4gICAgJ3Byb2Nlc3NpbmcnID0gJ3Byb2Nlc3NpbmcnLFxuICAgICdjb21wbGV0ZWQnID0gJ2NvbXBsZXRlZCcsXG4gICAgJ2NhbmNlbGxlZCcgPSAnY2FuY2VsbGVkJyxcbiAgICAnZmFpbGVkJyA9ICdmYWlsZWQnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhaW5pbmdTZXNzaW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHByb2plY3Q6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBlbnY6IEV4ZWN1dGlvbkVudmlyb25tZW50UmVmLFxuICAgIG1vZGVsOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBUcmFpbmluZ1Nlc3Npb25TdGF0dXMsXG4gICAgcnVuczogc3RyaW5nW10sXG4gICAgZGF0YXNldDogc3RyaW5nLCAvL3RoZSBuYW1lIG9mIHRoZSBmaWxlIGRhdGFzZXQgd2hpY2ggd2FzIGdlbmVyYXRlZCBpbiBHQ1NcbiAgICBqb2I6IFRyYWluaW5nSm9iLFxuICAgIGNyZWF0ZWRfYnk6IHN0cmluZyxcbiAgICB1cGRhdGVkX2J5OiBzdHJpbmcsXG4gICAgY3JlYXRlZF9hdDogRGF0ZSxcbiAgICB1cGRhdGVkX2F0OiBEYXRlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nU2Vzc2lvblJlZiBleHRlbmRzIE9taXQ8VHJhaW5pbmdTZXNzaW9uLCAncnVucyc+IHtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWluaW5nU2Vzc2lvbkNyZWF0ZVBheWxvYWQge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGVudjogc3RyaW5nLFxuICAgIG1vZGVsOiBzdHJpbmcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFRyYWluaW5nU2Vzc2lvbnNRdWVyeSB7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIHN0YXR1cz86IFRyYWluaW5nU2Vzc2lvblN0YXR1cztcbn0iLCJpbXBvcnQgeyBQcm9qZWN0Um9sZXMgfSBmcm9tIFwiLi9wcm9qZWN0LmpzXCI7XG5pbXBvcnQgeyBBY2NvdW50UmVmIH0gZnJvbSBcIi4vdXNlci5qc1wiO1xuXG5cbmV4cG9ydCBlbnVtIFRyYW5zaWVudFRva2VuVHlwZSB7XG4gICAgdXNlckludml0ZSA9ICd1c2VyLWludml0ZScsXG4gICAgbWlncmF0aW9uID0gJ21pZ3JhdGlvbicsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNpZW50VG9rZW48VD4ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogVHJhbnNpZW50VG9rZW5UeXBlO1xuICAgIGRhdGE6IFQ7XG4gICAgZXhwaXJlczogRGF0ZTtcbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IERhdGU7XG4gICAgdXBkYXRlZF9hdDogRGF0ZTtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU9yVXBkYXRlVHJhbnNpZW50VG9rZW5QYXlsb2FkPFQ+IGV4dGVuZHMgUGFydGlhbDxUcmFuc2llbnRUb2tlbjxUPj4ge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJbnZpdGVUb2tlbkRhdGEge1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcm9sZTogUHJvamVjdFJvbGVzO1xuICAgIGFjY291bnQ6IEFjY291bnRSZWY7XG4gICAgcHJvamVjdHM/OiBzdHJpbmdbXTtcbiAgICBpbnZpdGVkQnk6IHsgbmFtZTogc3RyaW5nLCBlbWFpbDogc3RyaW5nOyB9O1xufSIsImltcG9ydCB7IEFwaUtleSB9IGZyb20gXCIuL2FwaWtleS5qc1wiO1xuaW1wb3J0IHsgUHJvamVjdFJvbGVzIH0gZnJvbSBcIi4vcHJvamVjdC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJXaXRoQWNjb3VudHMgZXh0ZW5kcyBVc2VyIHtcbiAgICBhY2NvdW50czogQWNjb3VudFJlZltdO1xufVxuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwaWN0dXJlPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIHBob25lPzogc3RyaW5nO1xuICAgIHNpZ25faW5fcHJvdmlkZXI/OiBzdHJpbmc7XG4gICAgbGFzdF9zZWxlY3RlZF9hY2NvdW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJSZWYge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgcGljdHVyZT86IHN0cmluZztcbn1cbmV4cG9ydCBjb25zdCBVc2VyUmVmUG9wdWxhdGUgPSBcImlkIG5hbWUgZW1haWwgcGljdHVyZVwiO1xuXG5leHBvcnQgZW51bSBEYXRhY2VudGVycyB7XG4gICAgYXdzID0gJ2F3cycsXG4gICAgZ2NwID0gJ2djcCcsXG4gICAgYXp1cmUgPSAnYXp1cmUnXG59XG5cbmV4cG9ydCBlbnVtIEJpbGxpbmdNZXRob2Qge1xuICAgIHN0cmlwZSA9ICdzdHJpcGUnLFxuICAgIGludm9pY2UgPSdpbnZvaWNlJ1xufVxuXG5cbmludGVyZmFjZSBBY2NvdW50QmlsbGluZyB7XG4gICAgbWV0aG9kOiBCaWxsaW5nTWV0aG9kO1xuICAgIHN0cmlwZV9jdXN0b21lcl9pZD86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICBlbWFpbF9kb21haW5zOiBzdHJpbmdbXTtcbiAgICBtZW1iZXJzOiB7XG4gICAgICAgIHJvbGU6IFByb2plY3RSb2xlcztcbiAgICAgICAgdXNlcjogVXNlclJlZjtcbiAgICAgICAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgfVtdO1xuXG4gICAgb25ib2FyZGluZzoge1xuICAgICAgICBjb21wbGV0ZWQ6IGJvb2xlYW4sXG4gICAgICAgIGNvbXBsZXRlZF9hdDogRGF0ZSxcbiAgICB9O1xuXG4gICAgZGF0YWNlbnRlcjogc3RyaW5nO1xuXG4gICAgYmlsbGluZzogQWNjb3VudEJpbGxpbmc7XG5cbiAgICBjcmVhdGVkX2J5OiBzdHJpbmc7XG4gICAgdXBkYXRlZF9ieTogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQWNjb3VudFBheWxvYWQge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZW1haWxfZG9tYWlucz86IHN0cmluZ1tdO1xuICAgIGJpbGxpbmc/OiBBY2NvdW50QmlsbGluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50UmVmIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbn1cbmV4cG9ydCBjb25zdCBBY2NvdW50UmVmUG9wdWxhdGUgPSBcImlkIG5hbWVcIjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIEludml0ZVVzZXJSZXF1ZXN0UGF5bG9hZCB7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICByb2xlOiBQcm9qZWN0Um9sZXM7XG4gICAgcHJvamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZpdGVVc2VyUmVzcG9uc2VQYXlsb2FkIHtcbiAgICBhY3Rpb246ICdpbnZpdGVkJyB8ICdhZGRlZCc7XG59XG5cblxudHlwZSBVc2VyT3JBcGlLZXk8VCBleHRlbmRzIFVzZXIgfCBBcGlLZXk+ID0gVCBleHRlbmRzIFVzZXIgPyBVc2VyIDogQXBpS2V5O1xudHlwZSBTZXNzaW9uVHlwZTxUIGV4dGVuZHMgVXNlciB8IEFwaUtleT4gPSBUIGV4dGVuZHMgVXNlciA/IFwidXNlclwiIDogXCJhcGlrZXlcIjtcbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkluZm88VCBleHRlbmRzIFVzZXIgfCBBcGlLZXk+IHtcbiAgICBpc05ldz86IGJvb2xlYW47XG4gICAgdHlwZTogU2Vzc2lvblR5cGU8VD47XG4gICAgc3ViamVjdDogVXNlck9yQXBpS2V5PFQ+O1xuICAgIC8vVXNlciB8IEFwaUtleTsgLy8gbm8gdXNlciBpZiB1c2luZyBhbiBhcGlrZXlcbiAgICBjdXJyZW50X2FjY291bnQ6IEFjY291bnQ7XG4gICAgLy9yb2xlOiBzdHJpbmc7IC8vIFRPRE8gdGhlIHJvbGUgb24gdGhlIHNlbGVjdGVkIGFjY291bnRcbiAgICBhY2NvdW50czogQWNjb3VudFJlZltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTZXNzaW9uSW5mbyBleHRlbmRzIFNlc3Npb25JbmZvPFVzZXI+IHsgfVxuZXhwb3J0IGludGVyZmFjZSBBcGlLZXlTZXNzaW9uSW5mbyBleHRlbmRzIFNlc3Npb25JbmZvPEFwaUtleT4geyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25ib2FyZGluZ1Byb2dyZXNzIHtcbiAgICBpbnRlcmFjdGlvbnM6IGJvb2xlYW4sXG4gICAgcHJvbXB0czogYm9vbGVhbixcbiAgICBlbnZpcm9ubWVudHM6IGJvb2xlYW4sXG4gICAgZGVmYXVsdF9lbnZpcm9ubWVudF9kZWZpbmVkOiBib29sZWFuXG59XG5cblxuLyoqXG4gKiBEYXRhIGNvbGxlY3RlZCBhdCBzaWdudXBcbiAqIHVzZWQgZm9yIG9uYm9hcmRpbmcgYW5kIHNlZ21lbnRzXG4gKiovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ251cERhdGEge1xuICAgIGFjY291bnRUeXBlOiBzdHJpbmc7XG4gICAgY29tcGFueU5hbWU/OiBzdHJpbmc7XG4gICAgY29tcGFueVNpemU/OiBudW1iZXI7XG4gICAgY29tcGFueVdlYnNpdGU/OiBzdHJpbmc7XG4gICAgbWF0dXJpdHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2lnbnVwIFBheWxvYWQ6IHVzZWQgdG8gY3JlYXRlIGEgbmV3IHVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWdudXBQYXlsb2FkIHtcbiAgICBmaXJlYmFzZVRva2VuOiBzdHJpbmc7XG4gICAgc2lnbnVwRGF0YTogU2lnbnVwRGF0YTtcbn0iLCJpbXBvcnQgeyBQcm9qZWN0UmVmIH0gZnJvbSBcIi4uL3Byb2plY3QuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbmFudElkKGFjY291bnRJZDogc3RyaW5nLCBwcm9qZWN0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy91c2UgdGhlIGxhc3QgNiBjaGFyYWN0ZXJzIG9mIHRoZSBhY2NvdW50SWQgYXMgdGhlIGRiIG5hbWVcbiAgICAvL2FzIGluIG1vbmdvIHRoZSBsYXN0IDYgY2hhciBhcmUgYW4gaW5jcmVtZW50aW5nIGNvdW50ZXJcbiAgICBjb25zdCBhY2NvdW50TGFzdDYgPSBhY2NvdW50SWQuc2xpY2UoLTYpO1xuICAgIGNvbnN0IHByb2plY3RMYXN0NiA9IHByb2plY3RJZC5zbGljZSgtNik7XG4gICAgcmV0dXJuIGFjY291bnRMYXN0NiArICdfJyArIHByb2plY3RMYXN0Njtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5hbnRJZEZyb21Qcm9qZWN0KHByb2plY3Q6IFByb2plY3RSZWYpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRUZW5hbnRJZChwcm9qZWN0LmFjY291bnQsIHByb2plY3QuaWQpO1xufVxuIiwiaW1wb3J0IHsgUHJvbXB0Um9sZSB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYSB9IGZyb20gXCJAbGx1bWl2ZXJzZS9jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYTQgfSBmcm9tIFwianNvbi1zY2hlbWFcIjtcbmltcG9ydCB7IEludGVyYWN0aW9uUmVmV2l0aFNjaGVtYSwgUG9wdWxhdGVkSW50ZXJhY3Rpb24gfSBmcm9tIFwiLi4vaW50ZXJhY3Rpb24uanNcIjtcbmltcG9ydCB7IFBvcHVsYXRlZFByb21wdFNlZ21lbnREZWYsIFByb21wdFNlZ21lbnREZWYsIFByb21wdFNlZ21lbnREZWZUeXBlLCBQcm9tcHRUZW1wbGF0ZVJlZldpdGhTY2hlbWEgfSBmcm9tIFwiLi4vcHJvbXB0LmpzXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSlNPTlNjaGVtYXMoc2NoZW1hczogSlNPTlNjaGVtYVtdKSB7XG4gICAgY29uc3QgcHJvcHM6IFJlY29yZDxzdHJpbmcsIEpTT05TY2hlbWE0PiA9IHt9O1xuICAgIGxldCByZXF1aXJlZDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtYSBvZiBzY2hlbWFzKSB7XG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKHNjaGVtYS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBzY2hlbWEucmVxdWlyZWQgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXF1aXJlZC5pbmNsdWRlcyhwcm9wKSkgcmVxdWlyZWQucHVzaChwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BzLCBzY2hlbWEucHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2NoZW1hID0gT2JqZWN0LmtleXMocHJvcHMpLmxlbmd0aCA+IDAgPyB7IHByb3BlcnRpZXM6IHByb3BzLCByZXF1aXJlZCwgdHlwZTogJ29iamVjdCcgfSBhcyBKU09OU2NoZW1hIDogbnVsbDtcbiAgICByZXR1cm4gc2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX21lcmdlUHJvbXB0c1NjaGVtYShwcm9tcHRzOiBQcm9tcHRTZWdtZW50RGVmPFByb21wdFRlbXBsYXRlUmVmV2l0aFNjaGVtYT5bXSB8IFBvcHVsYXRlZFByb21wdFNlZ21lbnREZWZbXSkge1xuICAgIGNvbnN0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBKU09OU2NoZW1hND4gPSB7fTtcbiAgICBsZXQgcmVxdWlyZWQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwcm9tcHQgb2YgcHJvbXB0cykge1xuICAgICAgICBpZiAocHJvbXB0LnRlbXBsYXRlPy5pbnB1dFNjaGVtYT8ucHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gcHJvbXB0LnRlbXBsYXRlPy5pbnB1dFNjaGVtYTtcbiAgICAgICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NoZW1hLnJlcXVpcmVkIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZWQuaW5jbHVkZXMocHJvcCkpIHJlcXVpcmVkLnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wcywgc2NoZW1hLnByb3BlcnRpZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb21wdC50eXBlID09PSBQcm9tcHRTZWdtZW50RGVmVHlwZS5jaGF0KSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BzLCB7XG4gICAgICAgICAgICAgICAgY2hhdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bTogW1Byb21wdFJvbGUuYXNzaXN0YW50LCBQcm9tcHRSb2xlLnVzZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IFsncm9sZScsICdjb250ZW50J11cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVxdWlyZWQucHVzaCgnY2hhdCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykubGVuZ3RoID4gMCA/IHsgcHJvcGVydGllczogcHJvcHMsIHJlcXVpcmVkIH0gYXMgSlNPTlNjaGVtYTQgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VQcm9tcHRzU2NoZW1hKGludGVyYWN0aW9uOiBJbnRlcmFjdGlvblJlZldpdGhTY2hlbWEgfCBQb3B1bGF0ZWRJbnRlcmFjdGlvbikge1xuICAgIGlmICghaW50ZXJhY3Rpb24ucHJvbXB0cykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIF9tZXJnZVByb21wdHNTY2hlbWEoaW50ZXJhY3Rpb24ucHJvbXB0cyk7XG59XG4iLCJpbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuZnVuY3Rpb24gJGV4aXN0cyh2YWx1ZTogYW55LCBhcmc6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKHZhbHVlICE9PSB1bmRlZmluZWQpID09PSBhcmc7XG59XG5mdW5jdGlvbiAkbnVsbCh2YWx1ZTogYW55LCBhcmc6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID09PSBhcmc7XG59XG5cbmZ1bmN0aW9uICRlcSh2YWx1ZTogYW55LCBhcmc6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGVxdWFsKHZhbHVlLCBhcmcpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGVxdWFsKHZhbHVlLCBhcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gYXJnO1xuICAgIH1cbn1cbmZ1bmN0aW9uICRuZSh2YWx1ZTogYW55LCBhcmc6IGFueSkge1xuICAgIHJldHVybiAhJGVxKHZhbHVlLCBhcmcpO1xufVxuZnVuY3Rpb24gJG9yKHZhbHVlOiBhbnksIGFyZzogYW55W10pIHtcbiAgICByZXR1cm4gYXJnLnNvbWUoYyA9PiBtYXRjaENvbmRpdGlvbih2YWx1ZSwgYykpO1xufVxuZnVuY3Rpb24gJGluKHZhbHVlOiBhbnksIGFyZzogYW55W10pIHtcbiAgICByZXR1cm4gYXJnLmluY2x1ZGVzKHZhbHVlKTtcbn1cbmZ1bmN0aW9uICRuaW4odmFsdWU6IGFueSwgYXJnOiBhbnlbXSkge1xuICAgIHJldHVybiAhJGluKHZhbHVlLCBhcmcpO1xufVxuZnVuY3Rpb24gJHJlZ2V4cCh2YWx1ZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGFyZykudGVzdCh2YWx1ZSk7XG59XG5mdW5jdGlvbiAkZW5kc1dpdGgodmFsdWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdmFsdWUuZW5kc1dpdGgoYXJnKTtcbn1cbmZ1bmN0aW9uICRzdGFydHNXaXRoKHZhbHVlOiBzdHJpbmcsIGFyZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN0YXJ0c1dpdGgoYXJnKTtcbn1cbmZ1bmN0aW9uICRjb250YWlucyh2YWx1ZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xuICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhhcmcpO1xufVxuZnVuY3Rpb24gJGx0KHZhbHVlOiBudW1iZXIsIGFyZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlIDwgYXJnO1xufVxuZnVuY3Rpb24gJGd0KHZhbHVlOiBudW1iZXIsIGFyZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlID4gYXJnO1xufVxuZnVuY3Rpb24gJGx0ZSh2YWx1ZTogbnVtYmVyLCBhcmc6IG51bWJlcikge1xuICAgIHJldHVybiB2YWx1ZSA8PSBhcmc7XG59XG5mdW5jdGlvbiAkZ3RlKHZhbHVlOiBudW1iZXIsIGFyZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlID49IGFyZztcbn1cblxuY29uc3QgY29uZGl0aW9uRm5zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICRleGlzdHMsICRudWxsLFxuICAgICRlcSwgJG5lLFxuICAgICRpbiwgJG5pbixcbiAgICAkcmVnZXhwLCAkc3RhcnRzV2l0aCwgJGVuZHNXaXRoLCAkY29udGFpbnMsXG4gICAgJGx0LCAkZ3QsICRsdGUsICRndGUsXG4gICAgJG9yLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hDb25kaXRpb24odmFsdWU6IGFueSwgY29uZGl0aW9uczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmRpdGlvbnMpKSB7XG4gICAgICAgIGNvbnN0IGNvbmQgPSBjb25kaXRpb25GbnNba2V5XTtcbiAgICAgICAgaWYgKCFjb25kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29uZGl0aW9uOiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmQodmFsdWUsIGNvbmRpdGlvbnNba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQge1xuICAgIEFjdGl2aXR5SW50ZXJmYWNlRm9yLFxuICAgIEFjdGl2aXR5T3B0aW9ucyxcbiAgICBDYW5jZWxsYXRpb25TY29wZSxcbiAgICBleGVjdXRlQ2hpbGQsXG4gICAgaXNDYW5jZWxsYXRpb24sXG4gICAgbG9nLFxuICAgIHBhdGNoZWQsXG4gICAgcHJveHlBY3Rpdml0aWVzLFxuICAgIHN0YXJ0Q2hpbGQsXG4gICAgVW50eXBlZEFjdGl2aXRpZXMsXG59IGZyb20gXCJAdGVtcG9yYWxpby93b3JrZmxvd1wiO1xuaW1wb3J0IHtcbiAgICBEU0xBY3Rpdml0eUV4ZWN1dGlvblBheWxvYWQsXG4gICAgRFNMQWN0aXZpdHlPcHRpb25zLFxuICAgIERTTEFjdGl2aXR5U3BlYyxcbiAgICBEU0xDaGlsZFdvcmtmbG93U3RlcCxcbiAgICBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsXG4gICAgRFNMV29ya2Zsb3dTcGVjLFxuICAgIGdldERvY3VtZW50SWRzLFxuICAgIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZFxufSBmcm9tIFwiQHZlcnRlc2lhL2NvbW1vblwiO1xuaW1wb3J0IG1zLCB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IHsgQWN0aXZpdHlQYXJhbUludmFsaWQsIEFjdGl2aXR5UGFyYW1Ob3RGb3VuZCwgTm9Eb2N1bWVudEZvdW5kLCBXb3JrZmxvd1BhcmFtTm90Rm91bmQgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5pbXBvcnQgeyBWYXJzIH0gZnJvbSBcIi4vdmFycy5qc1wiO1xuaW1wb3J0IHsgSGFuZGxlRHNsRXJyb3JQYXJhbXMgfSBmcm9tIFwiLi4vYWN0aXZpdGllcy9oYW5kbGVFcnJvci5qc1wiO1xuaW1wb3J0ICogYXMgYWN0aXZpdGllcyBmcm9tIFwiLi4vYWN0aXZpdGllcy9pbmRleC5qc1wiO1xuXG5pbnRlcmZhY2UgQmFzZUFjdGl2aXR5UGF5bG9hZCBleHRlbmRzIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB7XG4gICAgd29ya2Zsb3dfbmFtZTogc3RyaW5nO1xuICAgIGRlYnVnX21vZGU/OiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBkc2xBY3Rpdml0eVBheWxvYWQ8UGFyYW1zVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KGJhc2VQYXlsb2FkOiBCYXNlQWN0aXZpdHlQYXlsb2FkLCBhY3Rpdml0eTogRFNMQWN0aXZpdHlTcGVjLCBwYXJhbXM6IFBhcmFtc1QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlUGF5bG9hZCxcbiAgICAgICAgYWN0aXZpdHksXG4gICAgICAgIHBhcmFtczogcGFyYW1zIHx8IHt9LFxuICAgIH0gYXMgRFNMQWN0aXZpdHlFeGVjdXRpb25QYXlsb2FkPFBhcmFtc1Q+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkc2xXb3JrZmxvdyhwYXlsb2FkOiBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQpIHtcblxuICAgIGNvbnN0IGRlZmluaXRpb24gPSBwYXlsb2FkLndvcmtmbG93O1xuICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dQYXJhbU5vdEZvdW5kKFwid29ya2Zsb3dcIik7XG4gICAgfVxuICAgIC8vIHRoZSBiYXNlIHBheWxvYWQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWN0aXZpdGllcyBwYXlsb2FkXG4gICAgY29uc3QgYmFzZVBheWxvYWQ6IEJhc2VBY3Rpdml0eVBheWxvYWQgPSB7XG4gICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgIHdvcmtmbG93X25hbWU6IGRlZmluaXRpb24ubmFtZSxcbiAgICAgICAgZGVidWdfbW9kZTogISFkZWZpbml0aW9uLmRlYnVnX21vZGUsXG4gICAgfVxuICAgIGRlbGV0ZSAoYmFzZVBheWxvYWQgYXMgYW55KS53b3JrZmxvdztcblxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmNvbnZlcnREU0xBY3Rpdml0eU9wdGlvbnMoZGVmaW5pdGlvbi5vcHRpb25zKSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogXCI1IG1pbnV0ZVwiLFxuICAgICAgICByZXRyeToge1xuICAgICAgICAgICAgaW5pdGlhbEludGVydmFsOiAnMTBzJyxcbiAgICAgICAgICAgIGJhY2tvZmZDb2VmZmljaWVudDogMixcbiAgICAgICAgICAgIG1heGltdW1BdHRlbXB0czogMTAsXG4gICAgICAgICAgICBtYXhpbXVtSW50ZXJ2YWw6IDEwMCAqIDMwICogMTAwMCwgLy9tc1xuICAgICAgICAgICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogW1xuICAgICAgICAgICAgICAgIE5vRG9jdW1lbnRGb3VuZC5uYW1lLFxuICAgICAgICAgICAgICAgIEFjdGl2aXR5UGFyYW1Ob3RGb3VuZC5uYW1lLFxuICAgICAgICAgICAgICAgIFdvcmtmbG93UGFyYW1Ob3RGb3VuZC5uYW1lLFxuICAgICAgICAgICAgICAgIEFjdGl2aXR5UGFyYW1JbnZhbGlkLm5hbWUsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgIH07XG4gICAgbG9nLmRlYnVnKFwiR2xvYmFsIGFjdGl2aXR5IG9wdGlvbnNcIiwge1xuICAgICAgICBhY3Rpdml0eU9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICAgIH0pO1xuICAgIGNvbnN0IGRlZmF1bHRQcm94eSA9IHByb3h5QWN0aXZpdGllcyhkZWZhdWx0T3B0aW9ucyk7XG4gICAgbG9nLmRlYnVnKFwiRGVmYXVsdCBhY3Rpdml0eSBwcm94eSBpcyByZWFkeVwiKTtcbiAgICAvLyBtZXJnZSBkZWZhdWx0IHZhcnMgd2l0aCB0aGUgcGF5bG9hZCB2YXJzIGFuZCBhZGQgb2JqZWN0SWRzIGFuZCBvYmplY3RJZFxuICAgIGNvbnN0IHZhcnMgPSBuZXcgVmFycyh7XG4gICAgICAgIC4uLmRlZmluaXRpb24udmFycyxcbiAgICAgICAgLi4ucGF5bG9hZC52YXJzLFxuICAgICAgICBvYmplY3RJZHM6IHBheWxvYWQub2JqZWN0SWRzIHx8IFtdLFxuICAgICAgICBvYmplY3RJZDogcGF5bG9hZC5vYmplY3RJZHMgPyBwYXlsb2FkLm9iamVjdElkc1swXSA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgbG9nLmluZm8oXCJFeGVjdXRpbmcgd29ya2Zsb3dcIiwgeyBwYXlsb2FkIH0pO1xuXG4gICAgLy8gVE9ETyhtaHVhbmcpOiByZW1vdmUgcGF0Y2ggd2hlbiBhbGwgd29ya2Zsb3dzIGFyZSBtaWdyYXRlZCB0byB2MlxuICAgIC8vICAgSXQgYXZvaWRzIGJyZWFraW5nIHRoZSBvbmdvaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiBydW5uaW5nIGluIHYxIGFuZCBhbHNvIGFsbG93cyB1cyB0b1xuICAgIC8vICAgZGVwbG95IHRoZSBuZXcgZXJyb3IgaGFuZGxlciBpbiBwcm9kdWN0aW9uLlxuICAgIC8vICAgU2VlIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kZXZlbG9wL3R5cGVzY3JpcHQvdmVyc2lvbmluZ1xuICAgIGlmIChwYXRjaGVkKCdkc2wtd29ya2Zsb3ctZXJyb3ItaGFuZGxpbmcnKSkge1xuICAgICAgICAvLyB2MjogbmV3IHZlcnNpb24gd2l0aCBlcnJvciBoYW5kbGVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBleGVjdXRlU3RlcHMoZGVmaW5pdGlvbiwgcGF5bG9hZCwgYmFzZVBheWxvYWQsIHZhcnMsIGRlZmF1bHRQcm94eSwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVFcnJvcihlLCBiYXNlUGF5bG9hZCwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdjE6IG9sZCB2ZXJzaW9uIHdpdGhvdXQgZXJyb3IgaGFuZGxlciwgZGVwcmVjYXRlZCBzaW5jZSB2MC41Mi4wXG4gICAgICAgIGF3YWl0IGV4ZWN1dGVTdGVwcyhkZWZpbml0aW9uLCBwYXlsb2FkLCBiYXNlUGF5bG9hZCwgdmFycywgZGVmYXVsdFByb3h5LCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhcnMuZ2V0VmFsdWUoZGVmaW5pdGlvbi5yZXN1bHQgfHwgJ3Jlc3VsdCcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlU3RlcHMoZGVmaW5pdGlvbjogRFNMV29ya2Zsb3dTcGVjLCBwYXlsb2FkOiBEU0xXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQsIGJhc2VQYXlsb2FkOiBCYXNlQWN0aXZpdHlQYXlsb2FkLCB2YXJzOiBWYXJzLCBkZWZhdWx0UHJveHk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPFVudHlwZWRBY3Rpdml0aWVzPiwgZGVmYXVsdE9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucykge1xuICAgIGlmIChkZWZpbml0aW9uLnN0ZXBzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBkZWZpbml0aW9uLnN0ZXBzKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwVHlwZSA9IHN0ZXAudHlwZTtcbiAgICAgICAgICAgIGlmIChzdGVwVHlwZSA9PT0gJ3dvcmtmbG93Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkV29ya2Zsb3dTdGVwID0gc3RlcCBhcyBEU0xDaGlsZFdvcmtmbG93U3RlcDtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRXb3JrZmxvd1N0ZXAuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RhcnRDaGlsZFdvcmtmbG93KGNoaWxkV29ya2Zsb3dTdGVwLCBwYXlsb2FkLCB2YXJzLCBiYXNlUGF5bG9hZC5kZWJ1Z19tb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjdXRlQ2hpbGRXb3JrZmxvdyhjaGlsZFdvcmtmbG93U3RlcCwgcGF5bG9hZCwgdmFycywgYmFzZVBheWxvYWQuZGVidWdfbW9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWN0aXZpdHlcbiAgICAgICAgICAgICAgICBhd2FpdCBydW5BY3Rpdml0eShzdGVwIGFzIERTTEFjdGl2aXR5U3BlYywgYmFzZVBheWxvYWQsIHZhcnMsIGRlZmF1bHRQcm94eSwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChkZWZpbml0aW9uLmFjdGl2aXRpZXMpIHsgLy8gbGVnYWN5IHN1cHBvcnRcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpdml0eSBvZiBkZWZpbml0aW9uLmFjdGl2aXRpZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1bkFjdGl2aXR5KGFjdGl2aXR5LCBiYXNlUGF5bG9hZCwgdmFycywgZGVmYXVsdFByb3h5LCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzdGVwcyBvciBhY3Rpdml0aWVzIGZvdW5kIGluIHRoZSB3b3JrZmxvdyBkZWZpbml0aW9uXCIpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXJyb3Iob3JpZ2luYWxFcnJvcjogYW55LCBiYXNlUGF5bG9hZDogQmFzZUFjdGl2aXR5UGF5bG9hZCwgZGVmYXVsdE9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucykge1xuICAgIGNvbnN0IHsgaGFuZGxlRHNsRXJyb3IgfSA9IHByb3h5QWN0aXZpdGllczx0eXBlb2YgYWN0aXZpdGllcz4oZGVmYXVsdE9wdGlvbnMpO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IGRzbEFjdGl2aXR5UGF5bG9hZChcbiAgICAgICAgYmFzZVBheWxvYWQsXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaGFuZGxlRHNsRXJyb3JcIixcbiAgICAgICAgICAgIHBhcmFtczogeyBlcnJvck1lc3NhZ2U6IG9yaWdpbmFsRXJyb3IubWVzc2FnZSB9LFxuICAgICAgICB9IGFzIERTTEFjdGl2aXR5U3BlYyxcbiAgICAgICAgeyBlcnJvck1lc3NhZ2U6IG9yaWdpbmFsRXJyb3IubWVzc2FnZSB9IHNhdGlzZmllcyBIYW5kbGVEc2xFcnJvclBhcmFtcyxcbiAgICApXG5cbiAgICBpZiAoaXNDYW5jZWxsYXRpb24ob3JpZ2luYWxFcnJvcikpIHtcbiAgICAgICAgbG9nLndhcm4oYFdvcmtmbG93IGV4ZWN1dGlvbiBjYW5jZWxsZWQsIGV4ZWN1dGluZyBlcnJvciBoYW5kbGVyIHRvIHVwZGF0ZSBkb2N1bWVudCBzdGF0dXNgLCB7IGVycm9yOiBvcmlnaW5hbEVycm9yIH0pO1xuICAgICAgICAvLyBDbGVhbnVwIGxvZ2ljIG11c3QgYmUgaW4gYSBub25DYW5jZWxsYWJsZSBzY29wZVxuICAgICAgICAvLyBJZiB3ZSdkIHJ1biBjbGVhbnVwIG91dHNpZGUgb2YgYSBub25DYW5jZWxsYWJsZSBzY29wZSBpdCB3b3VsZCd2ZSBiZWVuIGNhbmNlbGxlZFxuICAgICAgICAvLyBiZWZvcmUgYmVpbmcgc3RhcnRlZCBiZWNhdXNlIHRoZSBXb3JrZmxvdydzIHJvb3Qgc2NvcGUgaXMgY2FuY2VsbGVkLlxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2RldmVsb3AvdHlwZXNjcmlwdC9jYW5jZWxsYXRpb25cbiAgICAgICAgYXdhaXQgQ2FuY2VsbGF0aW9uU2NvcGUubm9uQ2FuY2VsbGFibGUoKCkgPT4gaGFuZGxlRHNsRXJyb3IocGF5bG9hZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGBXb3JrZmxvdyBleGVjdXRpb24gZmFpbGVkLCBleGVjdXRpbmcgZXJyb3IgaGFuZGxlciB0byB1cGRhdGUgZG9jdW1lbnQgc3RhdHVzYCwgeyBlcnJvcjogb3JpZ2luYWxFcnJvciB9KTtcbiAgICAgICAgaGFuZGxlRHNsRXJyb3IocGF5bG9hZCk7XG4gICAgfVxuICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGRXb3JrZmxvdyhzdGVwOiBEU0xDaGlsZFdvcmtmbG93U3RlcCwgcGF5bG9hZDogRFNMV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkLCB2YXJzOiBWYXJzLCBkZWJ1Z19tb2RlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHJlc29sdmVkVmFycyA9IHZhcnMucmVzb2x2ZSgpO1xuICAgIGlmIChzdGVwLnZhcnMpIHtcbiAgICAgICAgLy8gY29weSB1c2VyIHZhcnMgKGZyb20gc3RlcCBkZWZpbml0aW9uKSB0byB0aGUgcmVzb2x2ZWQgdmFyc1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkVmFycywgc3RlcC52YXJzKTtcbiAgICB9XG4gICAgaWYgKGRlYnVnX21vZGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZmxvdyB2YXJzIGJlZm9yZSBzdGFydGluZyBjaGlsZCB3b3JrZmxvdyAke3N0ZXAubmFtZX1gLCB7IHZhcnM6IHJlc29sdmVkVmFycyB9KTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlID0gYXdhaXQgc3RhcnRDaGlsZChzdGVwLm5hbWUsIHtcbiAgICAgICAgLi4uc3RlcC5vcHRpb25zLFxuICAgICAgICBhcmdzOiBbe1xuICAgICAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgICAgIHdvcmtmbG93OiBzdGVwLnNwZWMsXG4gICAgICAgICAgICB2YXJzOiByZXNvbHZlZFZhcnNcbiAgICAgICAgfV0sXG4gICAgICAgIG1lbW86IHtcbiAgICAgICAgICAgIEluaXRpYXRlZEJ5OiBwYXlsb2FkLmluaXRpYXRlZF9ieSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgICAgQWNjb3VudElkOiBbcGF5bG9hZC5hY2NvdW50X2lkXSxcbiAgICAgICAgICAgIERvY3VtZW50SWQ6IGdldERvY3VtZW50SWRzKHBheWxvYWQpLFxuICAgICAgICAgICAgUHJvamVjdElkOiBbcGF5bG9hZC5wcm9qZWN0X2lkXSxcbiAgICAgICAgICAgIEluaXRpYXRlZEJ5OiBwYXlsb2FkLmluaXRpYXRlZF9ieSA/IFtwYXlsb2FkLmluaXRpYXRlZF9ieV0gOiBbXSxcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoc3RlcC5vdXRwdXQpIHtcbiAgICAgICAgdmFycy5zZXRWYWx1ZShzdGVwLm91dHB1dCwgaGFuZGxlLndvcmtmbG93SWQpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkV29ya2Zsb3coc3RlcDogRFNMQ2hpbGRXb3JrZmxvd1N0ZXAsIHBheWxvYWQ6IERTTFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCwgdmFyczogVmFycywgZGVidWdfbW9kZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNvbHZlZFZhcnMgPSB2YXJzLnJlc29sdmUoKTtcbiAgICBpZiAoc3RlcC52YXJzKSB7XG4gICAgICAgIC8vIGNvcHkgdXNlciB2YXJzIChmcm9tIHN0ZXAgZGVmaW5pdGlvbikgdG8gdGhlIHJlc29sdmVkIHZhcnNcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZFZhcnMsIHN0ZXAudmFycyk7XG4gICAgfVxuICAgIGlmIChkZWJ1Z19tb2RlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2Zsb3cgdmFycyBiZWZvcmUgZXhlY3V0aW5nIGNoaWxkIHdvcmtmbG93ICR7c3RlcC5uYW1lfWAsIHsgdmFyczogcmVzb2x2ZWRWYXJzIH0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlQ2hpbGQoc3RlcC5uYW1lLCB7XG4gICAgICAgIC4uLnN0ZXAub3B0aW9ucyxcbiAgICAgICAgYXJnczogW3tcbiAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICB3b3JrZmxvdzogc3RlcC5zcGVjLFxuICAgICAgICAgICAgdmFyczogcmVzb2x2ZWRWYXJzLFxuICAgICAgICB9XSxcbiAgICAgICAgbWVtbzoge1xuICAgICAgICAgICAgSW5pdGlhdGVkQnk6IHBheWxvYWQuaW5pdGlhdGVkX2J5LFxuICAgICAgICB9LFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICBBY2NvdW50SWQ6IFtwYXlsb2FkLmFjY291bnRfaWRdLFxuICAgICAgICAgICAgRG9jdW1lbnRJZDogZ2V0RG9jdW1lbnRJZHMocGF5bG9hZCksXG4gICAgICAgICAgICBQcm9qZWN0SWQ6IFtwYXlsb2FkLnByb2plY3RfaWRdLFxuICAgICAgICAgICAgSW5pdGlhdGVkQnk6IHBheWxvYWQuaW5pdGlhdGVkX2J5ID8gW3BheWxvYWQuaW5pdGlhdGVkX2J5XSA6IFtdLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHN0ZXAub3V0cHV0KSB7XG4gICAgICAgIHZhcnMuc2V0VmFsdWUoc3RlcC5vdXRwdXQsIHJlc3VsdCk7XG4gICAgICAgIGlmIChkZWJ1Z19tb2RlKSB7XG4gICAgICAgICAgICBsb2cuZGVidWcoYFdvcmtmbG93IHZhcnMgYWZ0ZXIgZXhlY3V0aW5nIGNoaWxkIHdvcmtmbG93ICR7c3RlcC5uYW1lfWAsIHsgdmFyczogdmFycy5yZXNvbHZlKCkgfSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlYnVnX21vZGUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZmxvdyB2YXJzIGFmdGVyIGV4ZWN1dGluZyBjaGlsZCB3b3JrZmxvdyAke3N0ZXAubmFtZX1gLCB7IHZhcnM6IHJlc29sdmVkVmFycyB9KTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkFjdGl2aXR5KGFjdGl2aXR5OiBEU0xBY3Rpdml0eVNwZWMsIGJhc2VQYXlsb2FkOiBCYXNlQWN0aXZpdHlQYXlsb2FkLCB2YXJzOiBWYXJzLCBkZWZhdWx0UHJveHk6IEFjdGl2aXR5SW50ZXJmYWNlRm9yPFVudHlwZWRBY3Rpdml0aWVzPiwgZGVmYXVsdE9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucykge1xuICAgIGlmIChiYXNlUGF5bG9hZC5kZWJ1Z19tb2RlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2Zsb3cgdmFycyBiZWZvcmUgZXhlY3V0aW5nIGFjdGl2aXR5ICR7YWN0aXZpdHkubmFtZX1gLCB7IHZhcnM6IHZhcnMucmVzb2x2ZSgpIH0pO1xuICAgIH1cbiAgICBpZiAoYWN0aXZpdHkuY29uZGl0aW9uICYmICF2YXJzLm1hdGNoKGFjdGl2aXR5LmNvbmRpdGlvbikpIHtcbiAgICAgICAgbG9nLmluZm8oXCJBY3Rpdml0eSBza2lwcGVkOiBjb25kaXRpb24gbm90IHNhdGlzZmllZFwiLCBhY3Rpdml0eS5jb25kaXRpb24pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGltcG9ydFBhcmFtcyA9IHZhcnMuY3JlYXRlSW1wb3J0VmFycyhhY3Rpdml0eS5pbXBvcnQpO1xuICAgIGNvbnN0IGV4ZWN1dGlvblBheWxvYWQgPSBkc2xBY3Rpdml0eVBheWxvYWQoYmFzZVBheWxvYWQsIGFjdGl2aXR5LCBpbXBvcnRQYXJhbXMpO1xuICAgIGxvZy5pbmZvKFwiRXhlY3V0aW5nIGFjdGl2aXR5OiBcIiArIGFjdGl2aXR5Lm5hbWUsIHsgcGF5bG9hZDogZXhlY3V0aW9uUGF5bG9hZCB9KTtcblxuICAgIGxldCBwcm94eSA9IGRlZmF1bHRQcm94eTtcbiAgICBpZiAoYWN0aXZpdHkub3B0aW9ucykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gY29tcHV0ZUFjdGl2aXR5T3B0aW9ucyhhY3Rpdml0eS5vcHRpb25zLCBkZWZhdWx0T3B0aW9ucyk7XG4gICAgICAgIGxvZy5kZWJ1ZyhcIlVzZSBjdXN0b20gYWN0aXZpdHkgb3B0aW9uc1wiLCB7XG4gICAgICAgICAgICBhY3Rpdml0eU5hbWU6IGFjdGl2aXR5Lm5hbWUsXG4gICAgICAgICAgICBhY3Rpdml0eU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgICBwcm94eSA9IHByb3h5QWN0aXZpdGllcyhvcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhcIlVzZSBkZWZhdWx0IGFjdGl2aXR5IG9wdGlvbnNcIiwge1xuICAgICAgICAgICAgYWN0aXZpdHlOYW1lOiBhY3Rpdml0eS5uYW1lLFxuICAgICAgICAgICAgYWN0aXZpdHlPcHRpb25zOiBkZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZm4gPSBwcm94eVthY3Rpdml0eS5uYW1lXTtcbiAgICBpZiAoYWN0aXZpdHkucGFyYWxsZWwpIHtcbiAgICAgICAgLy9UT0RPIGV4ZWN1dGUgaW4gcGFyYWxsZWxcbiAgICAgICAgbG9nLmluZm8oXCJQYXJhbGxlbCBleGVjdXRpb24gbm90IHlldCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuaW5mbyhcIkV4ZWN1dGluZyBhY3Rpdml0eTogXCIgKyBhY3Rpdml0eS5uYW1lLCB7IGltcG9ydFBhcmFtcyB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXhlY3V0aW9uUGF5bG9hZCk7XG4gICAgICAgIGlmIChhY3Rpdml0eS5vdXRwdXQpIHtcbiAgICAgICAgICAgIHZhcnMuc2V0VmFsdWUoYWN0aXZpdHkub3V0cHV0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChiYXNlUGF5bG9hZC5kZWJ1Z19tb2RlKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2Zsb3cgdmFycyBhZnRlciBleGVjdXRpbmcgYWN0aXZpdHkgJHthY3Rpdml0eS5uYW1lfWAsIHsgdmFyczogdmFycy5yZXNvbHZlKCkgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUFjdGl2aXR5T3B0aW9ucyhjdXN0b21PcHRpb25zOiBEU0xBY3Rpdml0eU9wdGlvbnMsIGRlZmF1bHRPcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eU9wdGlvbnMge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb252ZXJ0RFNMQWN0aXZpdHlPcHRpb25zKGN1c3RvbU9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICByZXRyeToge1xuICAgICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMucmV0cnksXG4gICAgICAgICAgICAuLi5vcHRpb25zLnJldHJ5LFxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0RFNMQWN0aXZpdHlPcHRpb25zKG9wdGlvbnM/OiBEU0xBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eU9wdGlvbnMge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IEFjdGl2aXR5T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpIHtcbiAgICAgICAgcmVzdWx0LnN0YXJ0VG9DbG9zZVRpbWVvdXQgPSBtcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQgYXMgU3RyaW5nVmFsdWUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSB7XG4gICAgICAgIHJlc3VsdC5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0ID0gbXMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0IGFzIFN0cmluZ1ZhbHVlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2NoZWR1bGVUb1N0YXJ0VGltZW91dCkge1xuICAgICAgICByZXN1bHQuc2NoZWR1bGVUb1N0YXJ0VGltZW91dCA9IG1zKG9wdGlvbnMuc2NoZWR1bGVUb1N0YXJ0VGltZW91dCBhcyBTdHJpbmdWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnJldHJ5KSB7XG4gICAgICAgIHJlc3VsdC5yZXRyeSA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeS5pbml0aWFsSW50ZXJ2YWwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXRyeS5pbml0aWFsSW50ZXJ2YWwgPSBtcyhvcHRpb25zLnJldHJ5LmluaXRpYWxJbnRlcnZhbCBhcyBTdHJpbmdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0cnkubWF4aW11bUludGVydmFsKSB7XG4gICAgICAgICAgICByZXN1bHQucmV0cnkubWF4aW11bUludGVydmFsID0gbXMob3B0aW9ucy5yZXRyeS5tYXhpbXVtSW50ZXJ2YWwgYXMgU3RyaW5nVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5Lm1heGltdW1BdHRlbXB0cykge1xuICAgICAgICAgICAgcmVzdWx0LnJldHJ5Lm1heGltdW1BdHRlbXB0cyA9IG9wdGlvbnMucmV0cnkubWF4aW11bUF0dGVtcHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5LmJhY2tvZmZDb2VmZmljaWVudCkge1xuICAgICAgICAgICAgcmVzdWx0LnJldHJ5LmJhY2tvZmZDb2VmZmljaWVudCA9IG9wdGlvbnMucmV0cnkuYmFja29mZkNvZWZmaWNpZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJldHJ5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXRyeS5ub25SZXRyeWFibGVFcnJvclR5cGVzID0gb3B0aW9ucy5yZXRyeS5ub25SZXRyeWFibGVFcnJvclR5cGVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgeyBBY3Rpdml0eU9wdGlvbnMsIHByb3h5QWN0aXZpdGllcyB9IGZyb20gXCJAdGVtcG9yYWxpby93b3JrZmxvd1wiO1xuaW1wb3J0IHsgRFNMQWN0aXZpdHlFeGVjdXRpb25QYXlsb2FkLCBXb3JrZmxvd0V4ZWN1dGlvbkJhc2VQYXJhbXMsIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB9IGZyb20gXCJAdmVydGVzaWEvY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHNsQWN0aXZpdHlGdW5jdGlvbjxQYXJhbXNUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueSwgUmV0dXJuVCA9IGFueT4ge1xuICAgIChwYXlsb2FkOiBEU0xBY3Rpdml0eUV4ZWN1dGlvblBheWxvYWQ8UGFyYW1zVD4pOiBQcm9taXNlPFJldHVyblQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERzbFNpbXBsaWZpZWRBY3Rpdml0eUZ1bmN0aW9uPFBhcmFtc1QgPSBhbnksIFJldHVyblQgPSBhbnk+IHtcbiAgICAocGF5bG9hZDogV29ya2Zsb3dFeGVjdXRpb25CYXNlUGFyYW1zLCBwYXJhbXM6IFBhcmFtc1QpOiBQcm9taXNlPFJldHVyblQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHNsUHJveHlBY3Rpdml0aWVzPFxuICAgIEFjdGl2aXRpZXNUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgRHNsQWN0aXZpdHlGdW5jdGlvbjxhbnksIGFueT4+XG4+KHdvcmtmbG93TmFtZTogc3RyaW5nLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMgPSB7fSkge1xuICAgIHR5cGUgRHNsQWN0aXZpdGllcyA9IHtcbiAgICAgICAgW0sgaW4ga2V5b2YgQWN0aXZpdGllc1RdOiBBY3Rpdml0aWVzVFtLXSBleHRlbmRzIERzbEFjdGl2aXR5RnVuY3Rpb248aW5mZXIgUGFyYW1zVCwgaW5mZXIgUmV0dXJuVD5cbiAgICAgICAgPyBEc2xTaW1wbGlmaWVkQWN0aXZpdHlGdW5jdGlvbjxQYXJhbXNULCBSZXR1cm5UPlxuICAgICAgICA6IG5ldmVyO1xuICAgIH07XG5cbiAgICBjb25zdCBhY3Rpdml0aWVzID0gcHJveHlBY3Rpdml0aWVzPEFjdGl2aXRpZXNUPihvcHRpb25zKSBhcyBBY3Rpdml0aWVzVDtcblxuICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgZ2V0KF90YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2aXR5Rm4gPSBhY3Rpdml0aWVzW3Byb3AgYXMga2V5b2YgQWN0aXZpdGllc1RdIGFzIERzbEFjdGl2aXR5RnVuY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gKHBheWxvYWQ6IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCwgcGFyYW1zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlGbih7XG4gICAgICAgICAgICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwcm9wIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dfbmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pIGFzIHVua25vd24gYXMgRHNsQWN0aXZpdGllcztcbn1cbiIsImltcG9ydCB7IEltcG9ydFNwZWMgfSBmcm9tIFwiQHZlcnRlc2lhL2NvbW1vblwiO1xuaW1wb3J0IHsgbWF0Y2hDb25kaXRpb24gfSBmcm9tIFwiLi9jb25kaXRpb25zLmpzXCI7XG5pbXBvcnQgeyBPYmplY3RLZXksIE9iamVjdFZpc2l0b3IsIE9iamVjdFdhbGtlciB9IGZyb20gXCIuL3dhbGsuanNcIjtcblxuY29uc3QgRkFMTEJBQ0tfVkFMVUVfU0VQID0gXCI/P1wiO1xuXG5mdW5jdGlvbiBkZWNvZGVMaXRlcmFsVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiJ1wiKSAmJiB2YWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgdmFsdWUgPSAnXCInICsgdmFsdWUuc2xpY2UoMSwgLTEpLnJlcGxhY2UoLyg/PCFcXFxcKVwiL2csICdcXFxcXCInKSArICdcIidcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRQYXRoKHBhdGg6IHN0cmluZykge1xuICAgIGlmIChwYXRoLmluZGV4T2YoJ1snKSA+IC0xKSB7IC8vIHN1cHBvcnQgYXJyYXkgbGlrZSBwYXRoc1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXFsoXFxkKylcXF0vZywgJy4kMScpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgbmFtZWQgYnkgXCJuYW1lXCIgb2YgdGhlIGdpdmVuIG9iamVjdFxuICogSWYgYW4gYXJyYXkgaXMgaW5kZXhlZCB1c2luZyBhIHN0cmluZyBrZXkgdGhlbiBhIG1hcCBpcyBkb25lIGFuZCBhbiBhcnJheSB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhhdCBuYW1lIGFyZSByZXR1cm5lZFxuICogRXg6IGRvY3MudGV4dCA9PiB3aWxsIHJldHVybiBhbiBhcnJheSBvZiB0ZXh0IHByb3BlcnRpZXMgb2YgdGhlIGRvY3MgYXJyYXlcbiAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdFxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICogQHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIF9wcm9wKG9iamVjdDogYW55LCBuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgb2JqZWN0ID0gX3ZhbHVlT2Yob2JqZWN0KTsgLy8gcmVzb2x2ZSBWYWx1ZSBvYmplY3RzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICBjb25zdCBpbmRleCA9ICtuYW1lO1xuICAgICAgICBpZiAoaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgICAgICAvLyBtYXAgYXJyYXkgdG8gcHJvcGVydHlcbiAgICAgICAgICAgIHJldHVybiBvYmplY3QubWFwKGl0ZW0gPT4gaXRlbVtuYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX3ZhbHVlT2Yob2JqZWN0W2luZGV4XSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gX3ZhbHVlT2Yob2JqZWN0W25hbWVdKTtcbiAgICB9XG5cbn1cblxuZnVuY3Rpb24gX3ZhbHVlT2YodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFZhbHVlID8gdmFsdWUudmFsdWUgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGaWVsZChvYmplY3Q6IGFueSwgcGF0aDogc3RyaW5nW10pIHtcbiAgICBsZXQgcCA9IG9iamVjdCBhcyBhbnk7XG4gICAgaWYgKCFwKSByZXR1cm4gcDtcbiAgICBpZiAoIXBhdGgubGVuZ3RoKSByZXR1cm4gX3ZhbHVlT2YocCk7XG4gICAgY29uc3QgbGFzdCA9IHBhdGgubGVuZ3RoIC0gMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICBwID0gX3Byb3AocCwgcGF0aFtpXSlcbiAgICAgICAgaWYgKCFwKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfcHJvcChwLCBwYXRoW2xhc3RdKTtcbn1cblxuYWJzdHJhY3QgY2xhc3MgVmFsdWU8VCA9IGFueT4ge1xuICAgIGFic3RyYWN0IHZhbHVlOiBUO1xuICAgIGFic3RyYWN0IHN0cmluZ2lmeSgpOiBzdHJpbmc7XG59XG5jbGFzcyBMaXRlcmFsVmFsdWU8VCA9IGFueT4gZXh0ZW5kcyBWYWx1ZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBUKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9XG59XG5cbmNsYXNzIFJlZlZhbHVlIGV4dGVuZHMgVmFsdWUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB2YXJzOiBWYXJzLCBwdWJsaWMgcGF0aDogc3RyaW5nW10sIHB1YmxpYyBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICBjb25zdCB2ID0gdGhpcy52YXJzLmdldFZhbHVlRnJvbVBhdGgodGhpcy5wYXRoKTtcbiAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhcnMucHJlc2VydmVSZWZzID8gdGhpcy5zdHJpbmdpZnkoKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gXCIke1wiICsgdGhpcy5wYXRoLmpvaW4oJy4nKSArIFwifVwiO1xuICAgIH1cbn1cblxuY2xhc3MgRXhwclZhbHVlIGV4dGVuZHMgVmFsdWUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB2YXJzOiBWYXJzLCBwdWJsaWMgcGFydHM6IFZhbHVlW10pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc2VnIG9mIHRoaXMucGFydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBzZWcudmFsdWU7XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgb3V0LnB1c2goU3RyaW5nKHNlZy52YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuam9pbignJyk7XG4gICAgfVxuXG4gICAgc3RyaW5naWZ5KCkge1xuICAgICAgICBjb25zdCBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzZWcgb2YgdGhpcy5wYXJ0cykge1xuICAgICAgICAgICAgb3V0LnB1c2goc2VnLnN0cmluZ2lmeSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIke1wiICsgb3V0LmpvaW4oJycpICsgXCJ9XCI7XG4gICAgfVxuXG59XG5cblxuZXhwb3J0IGNsYXNzIFZhcnMge1xuICAgIG1hcDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgd2hlbiByZXNvbHZpbmcgcGFyYW1zLiBJdCBjb250YWlucyB0aGUgbGlzdCBvZiByZWZlcmVuY2VzIHRoYXQgc2hvdWxkIG5vdCBiZSByZXNvbHZlZCB0byB0aGVpciB2YWx1ZVxuICAgICAqIGJ1dCBpbnN0ZWFkIHRoZXkgbmVlZCB0byByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB0byBiZSBhYmxlIHRvIHJlZ2VuZXJhdGUgYW5vdGhlciBWYXJzIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgZXhwcmVzc2lvblxuICAgICAqL1xuICAgIC8vVE9ETyB0aGlzIGZlYXR1cmUgaXMgbm8gbW9yZSB1c2VkIC0gaXQgd2FzIHJlcGxhY2VkIGJ5IGltcG9ydFZhcnMgc28gd2UgY2FuIG5vdyBkZWxldGUgYHByZXNlcnZlUmVmc2BcbiAgICBwcmVzZXJ2ZVJlZnM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IodmFycz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgdGhpcy5tYXAgPSB2YXJzID8gdGhpcy5wYXJzZSh2YXJzKSA6IHt9O1xuICAgIH1cblxuICAgIHBhcnNlKHZhcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RXYWxrZXIoKS5tYXAodmFycywgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVZhbHVlKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkKHZhcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc3QgdG9BcHBlbmQgPSB0aGlzLnBhcnNlKHZhcnMpO1xuICAgICAgICB0aGlzLm1hcCA9IE9iamVjdC5hc3NpZ24odGhpcy5tYXAsIHRvQXBwZW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IGEgbGl0ZXJhbCB2YWx1ZSAoY2Fubm90IHNldCBhIHJlZilcbiAgICAgKiBUbyBhZGQgcmVmcyB1c2UgYGFwcGVuZCgpYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubWFwW25hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWUocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlRmllbGQodGhpcy5tYXAsIHNwbGl0UGF0aChwYXRoKSk7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWVGcm9tUGF0aChwYXRoOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZUZpZWxkKHRoaXMubWFwLCBwYXRoKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcFtuYW1lXSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG1hdGNoKG1hdGNoOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhtYXRjaCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShuYW1lKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2hDb25kaXRpb24odmFsdWUsIG1hdGNoW25hbWVdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlUGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiwgcHJlc2VydmVSZWZzPzogU2V0PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVJlZnMgPSBwcmVzZXJ2ZVJlZnM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFdhbGtlcigpLm1hcChwYXJhbXMsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLmNyZWF0ZVZhbHVlKHRoaXMsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdiBpbnN0YW5jZW9mIFZhbHVlID8gdi52YWx1ZSA6IHY7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZVJlZnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNvbHZlKHByZXNlcnZlUmVmcz86IFNldDxzdHJpbmc+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGZ1bmN0aW9uIG1hcChfa2V5OiBPYmplY3RLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdiA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSB8fCB2LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGFycmF5IG9yIHBsYWluIG9iamVjdCAtIHJlY3Vyc2UgaW50byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvIGZpbmQgb3RoZXIgbmVzdGVkIFJlZiB2YWx1ZXMgaWYgYW55Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFdhbGtlcigpLm1hcCh2LCBtYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZVJlZnMgPSBwcmVzZXJ2ZVJlZnM7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFdhbGtlcigpLm1hcCh0aGlzLm1hcCwgbWFwKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMucHJlc2VydmVSZWZzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlUmVmVmFsdWUocmVmOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSByZWYuaW5kZXhPZihGQUxMQkFDS19WQUxVRV9TRVApO1xuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlOiBhbnk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWNvZGVMaXRlcmFsVmFsdWUocmVmLnN1YnN0cmluZyhpbmRleCArIEZBTExCQUNLX1ZBTFVFX1NFUC5sZW5ndGgpLnRyaW0oKSk7XG4gICAgICAgICAgICByZWYgPSByZWYuc3Vic3RyaW5nKDAsIGluZGV4KS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZiA9PT0gJy4nIHx8IHJlZi5pbmRleE9mKCcuLicpID4gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFyaWFibGUgcmVmZXJlbmNlOiBcIiArIHJlZilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZlZhbHVlKHRoaXMsIHNwbGl0UGF0aChyZWYpLCBkZWZhdWx0VmFsdWUpO1xuICAgIH1cblxuICAgIGNyZWF0ZVZhbHVlKHZhcnM6IFZhcnMsIG9iajogYW55KSB7XG4gICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKG9iai5pbmRleE9mKCckeycpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9iai5zcGxpdCgvKFxcJHtbXn1dK30pLyk7XG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWcgPSBzZWdtZW50c1swXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVmVmFsdWUoc2VnLnN1YnN0cmluZygyLCBzZWcubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0czogVmFsdWVbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnIG9mIHNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWcgPT09ICcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZy5zdGFydHNXaXRoKCckeycpICYmIHNlZy5lbmRzV2l0aCgnfScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuY3JlYXRlUmVmVmFsdWUoc2VnLnN1YnN0cmluZygyLCBzZWcubGVuZ3RoIC0gMSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2gobmV3IExpdGVyYWxWYWx1ZShzZWcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0c1swXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJWYWx1ZSh2YXJzLCBwYXJ0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUltcG9ydFZhcnMoaW1wb3J0U3BlYzogSW1wb3J0U3BlYyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIWltcG9ydFNwZWMgfHwgaW1wb3J0U3BlYy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGltcG9ydFZhciBvZiBpbXBvcnRTcGVjKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydFZhciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGFkZEltcG9ydFZhcihpbXBvcnRWYXIsIHVuZGVmaW5lZCwgdGhpcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaW1wb3J0VmFyKSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRJbXBvcnRWYXIoaW1wb3J0VmFyW2tleV0sIGtleSwgdGhpcywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRVbmtub3duUmVmZXJlbmNlcyhvYmo6IGFueSkge1xuICAgICAgICBjb25zdCB2aXNpdG9yID0gbmV3IFVua25vd25SZWZlcmVuY2VzVmlzaXRvcih0aGlzKTtcbiAgICAgICAgbmV3IE9iamVjdFdhbGtlcigpLndhbGsob2JqLCB2aXNpdG9yKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IucmVzdWx0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkSW1wb3J0VmFyKHZhclBhdGg6IHN0cmluZywgYXNOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhcnM6IFZhcnMsIHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGxldCBpc1JlcXVpcmVkID0gZmFsc2U7XG4gICAgaWYgKHZhclBhdGguZW5kc1dpdGgoXCIhXCIpKSB7XG4gICAgICAgIGlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB2YXJQYXRoID0gdmFyUGF0aC5zbGljZSgwLCAtMSk7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9IHZhcnMuZ2V0VmFsdWUodmFyUGF0aCk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgaXNSZXF1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydCB2YXJpYWJsZSAke3ZhclBhdGh9IGlzIHJlcXVpcmVkIGJ1dCBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmVzdWx0W2FzTmFtZSB8fCB2YXJQYXRoXSA9IHZhbHVlO1xufVxuXG5cbmNsYXNzIFVua25vd25SZWZlcmVuY2VzVmlzaXRvciBpbXBsZW1lbnRzIE9iamVjdFZpc2l0b3Ige1xuXG4gICAgcmVzdWx0OiB7IG5hbWU6IHN0cmluZywgZXhwcmVzc2lvbjogc3RyaW5nIH1bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHZhcnM6IFZhcnMpIHtcbiAgICB9XG5cbiAgICBvblZhbHVlKF9rZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCB2YXJzID0gdGhpcy52YXJzO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gdmFycy5jcmVhdGVWYWx1ZSh2YXJzLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodiBpbnN0YW5jZW9mIEV4cHJWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiB2LnBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgUmVmVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFycy5oYXMocC5wYXRoWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0LnB1c2goeyBuYW1lOiBwLnBhdGguam9pbignLicpLCBleHByZXNzaW9uOiBwLnN0cmluZ2lmeSgpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgUmVmVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcnMuaGFzKHYucGF0aFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHQucHVzaCh7IG5hbWU6IHYucGF0aC5qb2luKCcuJyksIGV4cHJlc3Npb246IHYuc3RyaW5naWZ5KCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5leHBvcnQgdHlwZSBPYmplY3RLZXkgPSBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFZpc2l0b3Ige1xuICAgIG9uU3RhcnRPYmplY3Q/OiAoa2V5OiBPYmplY3RLZXksIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gICAgb25FbmRPYmplY3Q/OiAoa2V5OiBPYmplY3RLZXksIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG4gICAgb25TdGFydEl0ZXJhdGlvbj86IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IEl0ZXJhYmxlPGFueT4pID0+IHZvaWQ7XG4gICAgb25FbmRJdGVyYXRpb24/OiAoa2V5OiBPYmplY3RLZXksIHZhbHVlOiBJdGVyYWJsZTxhbnk+KSA9PiB2b2lkO1xuICAgIG9uVmFsdWU/OiAoa2V5OiBPYmplY3RLZXksIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RXYWxrZXIge1xuICAgIHN1cHBvcnRJdGVyYXRvcnMgPSBmYWxzZTsgLy8gb25seSBhcnJheSBhcmUgc3VwcG9ydGVkIGJ5IGRlZmF1bHRcbiAgICBjb25zdHJ1Y3RvcihzdXBwb3J0SXRlcmF0b3JzID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zdXBwb3J0SXRlcmF0b3JzID0gc3VwcG9ydEl0ZXJhdG9ycztcbiAgICB9XG4gICAgd2FsayhvYmo6IGFueSwgdmlzaXRvcjogT2JqZWN0VmlzaXRvcikge1xuICAgICAgICB0aGlzLl93YWxrKHVuZGVmaW5lZCwgb2JqLCB2aXNpdG9yKTtcbiAgICB9XG4gICAgX3dhbGsoa2V5OiBPYmplY3RLZXksIG9iajogYW55LCB2aXNpdG9yOiBPYmplY3RWaXNpdG9yKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgICAgICBpZiAoIW9iaiB8fCB0eXBlICE9PSAnb2JqZWN0JyB8fCBvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICB2aXNpdG9yLm9uVmFsdWUgJiYgdmlzaXRvci5vblZhbHVlKGtleSwgb2JqKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhbGtJdGVyYWJsZShrZXksIG9iaiwgdmlzaXRvcik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdXBwb3J0SXRlcmF0b3JzICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl93YWxrSXRlcmFibGUoa2V5LCBvYmosIHZpc2l0b3IpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7IC8vIGEgcGxhaW4gb2JqZWN0XG4gICAgICAgICAgICB0aGlzLl93YWxrT2JqZWN0KGtleSwgb2JqLCB2aXNpdG9yKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gYSByYW5kb20gb2JqZWN0IC0gd2UgdHJlYXQgaXQgYXMgYSB2YWx1ZVxuICAgICAgICAgICAgdmlzaXRvci5vblZhbHVlICYmIHZpc2l0b3Iub25WYWx1ZShrZXksIG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfd2Fsa0l0ZXJhYmxlKGtleTogT2JqZWN0S2V5LCBvYmo6IGFueSwgdmlzaXRvcjogT2JqZWN0VmlzaXRvcikge1xuICAgICAgICB2aXNpdG9yLm9uU3RhcnRJdGVyYXRpb24gJiYgdmlzaXRvci5vblN0YXJ0SXRlcmF0aW9uKGtleSwgb2JqKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iaikge1xuICAgICAgICAgICAgdGhpcy5fd2FsayhpKyssIHZhbHVlLCB2aXNpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdG9yLm9uRW5kSXRlcmF0aW9uICYmIHZpc2l0b3Iub25FbmRJdGVyYXRpb24oa2V5LCBvYmopO1xuICAgIH1cblxuICAgIF93YWxrT2JqZWN0KGtleTogT2JqZWN0S2V5LCBvYmo6IGFueSwgdmlzaXRvcjogT2JqZWN0VmlzaXRvcikge1xuICAgICAgICB2aXNpdG9yLm9uU3RhcnRPYmplY3QgJiYgdmlzaXRvci5vblN0YXJ0T2JqZWN0KGtleSwgb2JqKTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgICAgIHRoaXMuX3dhbGsoaywgb2JqW2tdLCB2aXNpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICB2aXNpdG9yLm9uRW5kT2JqZWN0ICYmIHZpc2l0b3Iub25FbmRPYmplY3Qoa2V5LCBvYmopO1xuICAgIH1cblxuICAgIG1hcChvYmo6IGFueSwgbWFwRm46IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkgPT4gYW55KSB7XG4gICAgICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgTWFwVmlzaXRvcihtYXBGbik7XG4gICAgICAgIHRoaXMud2FsayhvYmosIHZpc2l0b3IpO1xuICAgICAgICByZXR1cm4gdmlzaXRvci5yZXN1bHQ7XG4gICAgfVxufVxuXG5jbGFzcyBNYXBWaXNpdG9yIGltcGxlbWVudHMgT2JqZWN0VmlzaXRvciB7XG4gICAgcmVzdWx0OiBhbnk7XG4gICAgY3VycmVudDogYW55O1xuICAgIHN0YWNrOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbWFwRm46IChrZXk6IE9iamVjdEtleSwgdmFsdWU6IGFueSkgPT4gYW55KSB7IH1cblxuICAgIG9uU3RhcnRPYmplY3Qoa2V5OiBPYmplY3RLZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5yZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy5jdXJyZW50KTtcbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50W2tleV0gPSBvYmo7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSBvYmo7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25FbmRPYmplY3QoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgfVxuXG4gICAgb25TdGFydEl0ZXJhdGlvbihrZXk6IE9iamVjdEtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gW107XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnQpO1xuICAgICAgICAgICAgY29uc3QgYXI6IGFueVtdID0gW107XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRba2V5XSA9IGFyO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkVuZEl0ZXJhdGlvbigpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICB9XG5cbiAgICBvblZhbHVlKGtleTogT2JqZWN0S2V5LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm1hcEZuKGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gcjtcbiAgICAgICAgfSBlbHNlIGlmIChyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFtrZXldID0gcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IERTTEFjdGl2aXR5U3BlYywgRFNMV29ya2Zsb3dTcGVjIH0gZnJvbSBcIkB2ZXJ0ZXNpYS9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE5vRG9jdW1lbnRGb3VuZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgaWRzPzogc3RyaW5nW10sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIk5vRG9jdW1lbnRGb3VuZFwiO1xuICAgICAgICB0aGlzLmlkcyA9IGlkcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3Rpdml0eVBhcmFtTm90Rm91bmQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGFjdGl2aXR5OiBEU0xBY3Rpdml0eVNwZWMsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGBSZXF1aXJlZCBwYXJhbWV0ZXIgJHtwYXJhbU5hbWV9IG5vdCBmb3VuZCBpbiBhY3Rpdml0eSAke2FjdGl2aXR5Lm5hbWV9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQWN0aXZpdHlQYXJhbU5vdEZvdW5kXCI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZpdHlQYXJhbUludmFsaWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIGFjdGl2aXR5OiBEU0xBY3Rpdml0eVNwZWMsXG4gICAgICAgIHJlYXNvbj86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoYCR7cGFyYW1OYW1lfSBpbiBhY3Rpdml0eSAke2FjdGl2aXR5Lm5hbWV9IGlzIGludmFsaWQke3JlYXNvbiA/IGAgJHtyZWFzb259YCA6IFwiXCJ9YCk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiQWN0aXZpdHlQYXJhbUludmFsaWRcIjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd1BhcmFtTm90Rm91bmQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBwYXJhbU5hbWU6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHdvcmtmbG93PzogRFNMV29ya2Zsb3dTcGVjLFxuICAgICkge1xuICAgICAgICBzdXBlcihgUmVxdWlyZWQgcGFyYW1ldGVyICR7cGFyYW1OYW1lfSBub3QgZm91bmQgaW4gd29ya2Zsb3cgJHt3b3JrZmxvdz8ubmFtZX1gKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJXb3JrZmxvd1BhcmFtTm90Rm91bmRcIjtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyA9IFtcIk5vRG9jdW1lbnRGb3VuZFwiLCBcIkFjdGl2aXR5UGFyYW1Ob3RGb3VuZFwiLCBcIldvcmtmbG93UGFyYW1Ob3RGb3VuZFwiXTtcbiIsImltcG9ydCB7IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB9IGZyb20gXCJAdmVydGVzaWEvY29tbW9uXCI7XG5cbmltcG9ydCB7IGxvZywgcHJveHlBY3Rpdml0aWVzIH0gZnJvbSBcIkB0ZW1wb3JhbGlvL3dvcmtmbG93XCI7XG5pbXBvcnQgeyBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSBcIi4vYWN0aXZpdGllcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgSXRlcmF0aXZlR2VuZXJhdGlvblBheWxvYWQsIFBhcnRJbmRleCwgU0VDVElPTl9JRF9QTEFDRUhPTERFUiB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmNvbnN0IHtcbiAgICBpdF9nZW5fZXh0cmFjdFRvYyxcbiAgICBpdF9nZW5fZ2VuZXJhdGVUb2MsXG4gICAgaXRfZ2VuX2dlbmVyYXRlUGFydCxcbiAgICBpdF9nZW5fZmluYWxpemVPdXRwdXRcbn0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBcIjE1IG1pbnV0ZVwiLFxuICAgIHJldHJ5OiB7XG4gICAgICAgIGluaXRpYWxJbnRlcnZhbDogJzMwcycsXG4gICAgICAgIGJhY2tvZmZDb2VmZmljaWVudDogMixcbiAgICAgICAgbWF4aW11bUF0dGVtcHRzOiAyMCxcbiAgICAgICAgbWF4aW11bUludGVydmFsOiAxMDAgKiAzMCAqIDEwMDAsIC8vbXNcbiAgICAgICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogV0ZfTk9OX1JFVFJZQUJMRV9FUlJPUlMsXG4gICAgfSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXRlcmF0aXZlR2VuZXJhdGlvbldvcmtmbG93KHBheWxvYWQ6IFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCkge1xuICAgIGxvZy5pbmZvKGBFeGVjdXRpbmcgSXRlcmF0aXZlIGdlbmVyYXRpb24gd29ya2Zsb3cuYCk7XG5cbiAgICBjb25zdCB2YXJzID0gcGF5bG9hZC52YXJzIGFzIEl0ZXJhdGl2ZUdlbmVyYXRpb25QYXlsb2FkO1xuICAgIGlmICh2YXJzLnNlY3Rpb25fZmlsZV9wYXR0ZXJuICYmICF2YXJzLnNlY3Rpb25fZmlsZV9wYXR0ZXJuLmluY2x1ZGVzKFNFQ1RJT05fSURfUExBQ0VIT0xERVIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWN0aW9uX2ZpbGVfcGF0dGVybjogJHt2YXJzLnNlY3Rpb25fZmlsZV9wYXR0ZXJufS4gSXQgbXVzdCBpbmNsdWRlIHRoZSAke1NFQ1RJT05fSURfUExBQ0VIT0xERVJ9IHBsYWNlaG9sZGVyLmApO1xuICAgIH1cblxuICAgIC8vIGV4dHJhY3RUb2MgdHJpZXMgdG8gZXh0cmFjdCB0aGUgdG9jIGZyb20gdGhlIGlucHV0IG1lbW9yeSBwYWNrICh0b2MuanNvbiBvciB0b2MueWFtbClcbiAgICAvLyB0aGUgZ2VuZXJhdGVUb2MgYWN0aXZpdHkgaXMgcmV0dXJuaW5nIHRoZSB0b2MgaGllcmFyY2h5LlxuICAgIC8vIEl0IGRvZXNuJ3QgaW5jbHVkZSBleHRyYSBUT0MgZGV0YWlscyBsaWtlIGRlc2NyaXB0aW9uIGV0Yy5cbiAgICAvLyBUbyBtaW5pbWl6ZSB0aGUgcGF5bG9hZCBzaXplIG9ubHkgdGhlIGhpZXJhcmNoeSBhbmQgdGhlIHNlY3Rpb24vcGFydCBuYW1lcyBhcmUgcmV0dXJuZWRcbiAgICBsZXQgdG9jID0gYXdhaXQgaXRfZ2VuX2V4dHJhY3RUb2MocGF5bG9hZCk7XG4gICAgaWYgKCF0b2MpIHtcbiAgICAgICAgbG9nLmluZm8oYE5vIFRPQyB3YXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBtZW1vcnkgcGFjay4gR2VuZXJhdGluZyBvbmUuYCk7XG4gICAgICAgIHRvYyA9IGF3YWl0IGl0X2dlbl9nZW5lcmF0ZVRvYyhwYXlsb2FkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuaW5mbyhgVXNpbmcgdGhlIFRPQyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IG1lbW9yeSBwYWNrLmApO1xuICAgIH1cblxuICAgIGlmICh0b2Muc2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vVE9ETyBob3cgdG8gaGFuZGxlIHRoaXMgY2FzZT9cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90aGluZyB0byBnZW5lcmF0ZTogVE9DIGlzIGVtcHR5XCIpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0b2Muc2VjdGlvbnMpIHtcbiAgICAgICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgc2VjdGlvbjogJHtmb3JtYXRQYXRoKHNlY3Rpb24pfWApO1xuICAgICAgICBhd2FpdCBpdF9nZW5fZ2VuZXJhdGVQYXJ0KHBheWxvYWQsIHNlY3Rpb24ucGF0aCk7XG5cbiAgICAgICAgaWYgKHNlY3Rpb24ucGFydHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBzZWN0aW9uLnBhcnRzKSB7XG4gICAgICAgICAgICAgICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgcGFydDogJHtmb3JtYXRQYXRoKHBhcnQpfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGl0X2dlbl9nZW5lcmF0ZVBhcnQocGF5bG9hZCwgcGFydC5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvZy5pbmZvKGBQb3N0LXByb2Nlc3Npbmcgb3V0cHV0IG1lbW9yeSBwYWNrYCk7XG4gICAgYXdhaXQgaXRfZ2VuX2ZpbmFsaXplT3V0cHV0KHBheWxvYWQpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYXRoKG5vZGU6IFBhcnRJbmRleCkge1xuICAgIC8vIHdlIHByaW50IDEgYmFzZWQgaW5kZXhlc1xuICAgIHJldHVybiBub2RlLnBhdGgubWFwKGkgPT4gaSArIDEpLmpvaW4oJy4nKSArICcgJyArIG5vZGUubmFtZTtcbn0iLCJcbmV4cG9ydCBjb25zdCBTRUNUSU9OX0lEX1BMQUNFSE9MREVSID0gJyVpZCc7XG5cbi8qKlxuICogQW4gaXRlcmF0aXZlIGdlbmVyYXRpb24gd29ya2Zsb3cgdXNlcyAyIG1lbW9yeSBwYWNrcyBvbmUgZm9yIGlucHV0IGFuZCB0aGUgb3RoZXIgZm9yIG91dHB1dC5cbiAqIFRoZSBpbnB1dCBtZW1vcnkgcGFja3MgbXVzdCBiZSBhdmFpbGFibGUgaW4gdGhlIHByb2plY3QgYmxvYnMgYnVja2V0IGF0IGAke3RlbmFudF9pZC9tZW1vcmllcy8ke21lbW9yeV9uYW1lfS9pbnB1dC50YXIuZ3pgLlxuICogVGhlIG91dHB1dCBtZW1vcnkgcGFjayB3aWxsIGJlIGdlbmVyYXRlZCBhdCBgJHt0ZW5hbnRfaWQvbWVtb3JpZXMvJHttZW1vcnlfbmFtZX0vb3V0cHV0LnRhci5nemAuXG4gKiBFYWNoIGl0ZXJhdGlvbiBpcyBvdmVyd3JpdGluZyB0aGUgb3V0cHV0IG1lbW9yeSBwYWNrIHdpdGggdGhlIG5ldyBnZW5lcmF0ZWQgY29udGVudC5cbiAqIFRoZSBjb21wbGV0ZSBuYW1lIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1lbW9yeSBwYWNrcyBhcmU6IFwiJHtuYW1lfS9pbnB1dFwiIGFuZCBcIiR7bmFtZX0vb3V0cHV0XCIgd2hlcmUgbmFtZSBpcyB0aGUgYmFzZSBtZW1vcnkgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVyYXRpdmVHZW5lcmF0aW9uUGF5bG9hZCB7XG4gICAgLy8gdGhlIG1haW4gaW50ZXJhY3Rpb24gdG8gZXhlY3V0ZS4gSWYgaXRlcmF0aXZlX2dlbmVyYXRpb24gaXMgZGVmaW5lZFxuICAgIC8vIHRoZSBtYWluIGludGVyYWN0aW9uIHdpbGwgb25seSBiZSB1c2VkIHRvIHByZXBhcmUgdGhlIGl0ZXJhdGlvbiAodG8gZ2VuZXJhdGUgdGhlIFRPQylcbiAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgaXRlcmF0aXZlIGdlbmVyYXRpb24gdG9vLlxuICAgIGludGVyYWN0aW9uOiBzdHJpbmc7XG4gICAgLy8gaWYgZGVmaW5lZCB0aGlzIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGl0ZXJhdGl2ZSBpbnRlcmFjdGlvbiB3aGljaCB3aWxsIGdlbmVyYXRlIHBhcnRzLlxuICAgIC8vIG90aGVyd2lzZSB0aGUgbWFpbiBpbnRlcmFjdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGl0ZXJhdGl2ZSBnZW5lcmF0aW9uLlxuICAgIGl0ZXJhdGl2ZV9pbnRlcmFjdGlvbj86IHN0cmluZztcbiAgICAvLyB0aGUgZW52aXJvbm1lbnQgdG8gdXNlXG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgLy8gdGhlIG1vZGVsIHRvIHVzZVxuICAgIG1vZGVsPzogc3RyaW5nO1xuICAgIC8vIEEgY3VzdG9tIG1heCB0b2tlbnNcbiAgICBtYXhfdG9rZW5zPzogbnVtYmVyO1xuICAgIC8vIEEgY3VzdG9tIHRlbXBlcmF0dXJlXG4gICAgdGVtcGVyYXR1cmU/OiBudW1iZXI7XG4gICAgLy8gdGhlIG1lbW9yeSBwYWNrIGdyb3VwIG5hbWVcbiAgICBtZW1vcnk6IHN0cmluZztcbiAgICAvLyB0aGUgaW5wdXQgbWVtb3J5IHBhY2sgbWFwcGluZ1xuICAgIGlucHV0X21hcHBpbmc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8vIGN1c3RvbSB0b2Mgc2NoZW1hIGlmIGFueSBUT0RPIHJlbW92ZSB0aGlzXG4gICAgdG9jX3NjaGVtYT86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAvKipcbiAgICAgKiBJZiBub3Qgc2V0IHRvIFwibm9uZVwiIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBjb250ZW50IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpdGVyYXRpb24uXG4gICAgICogSWYgbm90IHNldCBhdCBhbGwgZGVmYXVsdHMgdG8gXCJzZWN0aW9uXCIuXG4gICAgICogSWYgXCJzZWN0aW9uXCIgaXMgdXNlZCBvbmx5IHRoZSBzZWN0aW9uIGNvbnRlbnQgcHJldmlvdXNseSBnZW5lcmF0ZWQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgaXRlcmF0aW9uLlxuICAgICAqIElmIFwiZG9jdW1lbnRcIiBpcyB1c2VkIHRoZSB3aG9sZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBkb2N1bWVudCBjb250ZW50IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbi5cbiAgICAgKiBEZWZhdWx0cyB0byBzZWN0aW9uLlxuICAgICAqL1xuICAgIHJlbWVtYnJhbmNlX3N0cmF0ZWd5PzogXCJkb2N1bWVudFwiIHwgXCJzZWN0aW9uXCIgfCBcIm5vbmVcIjtcbiAgICAvKipcbiAgICAgKiBJZiBwcmVzZW50IHdpbGwgc2F2ZSBzZWN0aW9ucyBpbiBmaWxlcyB1c2luZyB0aGUgcGF0dGVyblxuICAgICAqIFRoZSBwYXR0ZXJuIG11c3QgaW5jbHVkZSBhIHBsYWNlaG9sZGVyIGZvciB0aGUgc2VjdGlvbiBpZDogJWlkLlxuICAgICAqIEV4YW1wbGVzOiBgc2VjdGlvbnMvJWlkLm1kYCwgYCVpZC9wYWdlLm1keGAgZXRjLlxuICAgICAqIEBzZWUgU0VDVElPTl9JRF9QTEFDRUhPTERFUlxuICAgICAqL1xuICAgIHNlY3Rpb25fZmlsZV9wYXR0ZXJuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGhlYWRlciB0byBwcmVwZW5kIHRvIHRoZSBzZWN0aW9uIGZpbGVzLlxuICAgICAqIFRoZSBoZWFkZXIgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6XG4gICAgICogLSAke3NlY3Rpb259IC0gdGhlIHNlY3Rpb24gb2JqZWN0XG4gICAgICogLSAke2RhdGV9IC0gdGhlIGRhdGUgd2hlbiB0aGUgZmlsZSB3YXMgZ2VuZXJhdGVkXG4gICAgICovXG4gICAgc2VjdGlvbl9maWxlX2hlYWRlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2NQYXJ0IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9jU2VjdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nO1xuICAgIHBhcnRzPzogVG9jUGFydFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvYyB7XG4gICAgc2VjdGlvbnM6IFRvY1NlY3Rpb25bXTtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3Rpb25JbmRleCBleHRlbmRzIFBhcnRJbmRleCB7XG4gICAgcGFydHM/OiBQYXJ0SW5kZXhbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGFydEluZGV4IHtcbiAgICBwYXRoOiBudW1iZXJbXTtcbiAgICBuYW1lOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIFRvY0luZGV4IHtcbiAgICBzZWN0aW9uczogU2VjdGlvbkluZGV4W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0TWVtb3J5TWV0YSB7XG4gICAgdG9jOiBUb2M7XG4gICAgcHJldmlvdXNseUdlbmVyYXRlZDogc3RyaW5nO1xuICAgIGxhc3RQcm9jZXNzZWRQYXJ0PzogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgY29udGVudDogc3RyaW5nO1xufVxuIiwiXG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQHRlbXBvcmFsaW8vd29ya2Zsb3dcIjtcbmltcG9ydCB7IENvbnRlbnRFdmVudE5hbWUsIFdvcmtmbG93RXhlY3V0aW9uUGF5bG9hZCB9IGZyb20gXCJAdmVydGVzaWEvY29tbW9uXCI7XG5pbXBvcnQgKiBhcyBhY3Rpdml0aWVzIGZyb20gXCIuLi9hY3Rpdml0aWVzL25vdGlmeVdlYmhvb2suanNcIjtcbmltcG9ydCB7IGRzbFByb3h5QWN0aXZpdGllcyB9IGZyb20gXCIuLi9kc2wvZHNsUHJveHlBY3Rpdml0aWVzLmpzXCI7XG5pbXBvcnQgeyBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuY29uc3Qge1xuICAgIG5vdGlmeVdlYmhvb2tcbn0gPSBkc2xQcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KFwibm90aWZ5V2ViaG9va1dvcmtmbG93XCIsIHtcbiAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBcIjUgbWludXRlXCIsXG4gICAgcmV0cnk6IHtcbiAgICAgICAgaW5pdGlhbEludGVydmFsOiAnNXMnLFxuICAgICAgICBiYWNrb2ZmQ29lZmZpY2llbnQ6IDIsXG4gICAgICAgIG1heGltdW1BdHRlbXB0czogNSxcbiAgICAgICAgbWF4aW11bUludGVydmFsOiAxMDAgKiAzMCAqIDEwMDAsIC8vbXNcbiAgICAgICAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlczogV0ZfTk9OX1JFVFJZQUJMRV9FUlJPUlMsXG4gICAgfSxcbn0pO1xuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBub3RpZnlXZWJob29rV29ya2Zsb3cocGF5bG9hZDogV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGNvbnN0IHsgb2JqZWN0SWRzLCB2YXJzIH0gPSBwYXlsb2FkO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBbXTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSB2YXJzPy53ZWJob29rcyB8fCBbXTtcbiAgICBjb25zdCBldmVudE5hbWUgPSB2YXJzLmV2ZW50IHx8IENvbnRlbnRFdmVudE5hbWUud29ya2Zsb3dfZmluaXNoZWQ7XG5cbiAgICBpZiAoIWVuZHBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgbG9nLmluZm8oYE5vIHdlYmhvb2tzIHRvIG5vdGlmeWApO1xuICAgICAgICByZXR1cm4geyBub3RpZmljYXRpb25zOiBbXSwgbWVzc2FnZTogXCJObyB3ZWJob29rcyB0byBub3RpZnlcIiB9O1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXAgb2YgZW5kcG9pbnRzKSB7XG4gICAgICAgIGNvbnN0IG4gPSBub3RpZnlXZWJob29rKHBheWxvYWQsIHtcbiAgICAgICAgICAgIHRhcmdldF91cmw6IGVwLFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0X2lkczogb2JqZWN0SWRzLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICAgICAgICAgICAgZGF0YTogdmFycy53ZWJob29rX2RhdGEgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHZhcnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgbG9nLmluZm8oYFdlYmhvb2sgbm90aWZpZWQgYXQgJHtlcH0gd2l0aCByZXNwb25zZSBjb2RlOiAke3Jlcy5zdGF0dXN9YCwgeyByZXMgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKG4pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IFByb21pc2UuYWxsKG5vdGlmaWNhdGlvbnMpO1xuICAgIGxvZy5pbmZvKGBXZWJob29rcyBub3RpZmllZGApO1xuXG4gICAgcmV0dXJuIHsgbm90aWZpY2F0aW9uczogcmVzLCBtZXNzYWdlOiBcIldlYmhvb2tzIG5vdGlmaWVkXCIgfTtcblxufVxuIiwiXG5pbXBvcnQgeyBTdXBwb3J0ZWRFbWJlZGRpbmdUeXBlcywgV29ya2Zsb3dFeGVjdXRpb25QYXlsb2FkIH0gZnJvbSBcIkB2ZXJ0ZXNpYS9jb21tb25cIjtcbmltcG9ydCAqIGFzIGFjdGl2aXRpZXMgZnJvbSBcIi4uL2FjdGl2aXRpZXMvaW5kZXgtZHNsLmpzXCI7XG5pbXBvcnQgeyBkc2xQcm94eUFjdGl2aXRpZXMgfSBmcm9tIFwiLi4vZHNsL2RzbFByb3h5QWN0aXZpdGllcy5qc1wiO1xuaW1wb3J0IHsgV0ZfTk9OX1JFVFJZQUJMRV9FUlJPUlMgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmNvbnN0IHtcbiAgICBnZW5lcmF0ZUVtYmVkZGluZ3MsXG59ID0gZHNsUHJveHlBY3Rpdml0aWVzPHR5cGVvZiBhY3Rpdml0aWVzPihcInJlY2FsY3VsYXRlRW1iZWRkaW5nc1dvcmtmbG93XCIsIHtcbiAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBcIjUgbWludXRlXCIsXG4gICAgcmV0cnk6IHtcbiAgICAgICAgaW5pdGlhbEludGVydmFsOiAnMTBzJyxcbiAgICAgICAgYmFja29mZkNvZWZmaWNpZW50OiAyLFxuICAgICAgICBtYXhpbXVtQXR0ZW1wdHM6IDEwLFxuICAgICAgICBtYXhpbXVtSW50ZXJ2YWw6IDEwMCAqIDMwICogMTAwMCwgLy9tc1xuICAgICAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiBXRl9OT05fUkVUUllBQkxFX0VSUk9SUyxcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNhbGN1bGF0ZUVtYmVkZGluZ3NXb3JrZmxvdyhwYXlsb2FkOiBXb3JrZmxvd0V4ZWN1dGlvblBheWxvYWQpIHtcblxuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBbXTtcblxuICAgIGZvciAoY29uc3QgdHlwZSBvZiBPYmplY3QudmFsdWVzKFN1cHBvcnRlZEVtYmVkZGluZ1R5cGVzKSkge1xuICAgICAgICBlbWJlZGRpbmdzLnB1c2goZ2VuZXJhdGVFbWJlZGRpbmdzKHBheWxvYWQsIHtcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgdHlwZVxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChlbWJlZGRpbmdzKTtcblxuICAgIHJldHVybiByZXM7XG5cbn0iLCIvKipcbiAqIEV4cG9ydCB3b3JrZmxvd3MgdG8gYmUgcmVnaXN0ZXJlZCBvbiB0ZW1wb3JhbCB3b3JrZXJzXG4gKi9cbmV4cG9ydCB7IGRzbFdvcmtmbG93IH0gZnJvbSBcIi4vZHNsL2RzbC13b3JrZmxvdy5qc1wiO1xuZXhwb3J0IHsgaXRlcmF0aXZlR2VuZXJhdGlvbldvcmtmbG93IH0gZnJvbSBcIi4vaXRlcmF0aXZlLWdlbmVyYXRpb24vaXRlcmF0aXZlR2VuZXJhdGlvbldvcmtmbG93LmpzXCI7XG5leHBvcnQgeyBub3RpZnlXZWJob29rV29ya2Zsb3cgfSBmcm9tIFwiLi9zeXN0ZW0vbm90aWZ5V2ViaG9va1dvcmtmbG93LmpzXCI7XG5leHBvcnQgeyByZWNhbGN1bGF0ZUVtYmVkZGluZ3NXb3JrZmxvdyB9IGZyb20gXCIuL3N5c3RlbS9yZWNhbGN1bGF0ZUVtYmVkZGluZ3NXb3JrZmxvdy5qc1wiO1xuIiwiLyogKGlnbm9yZWQpICovIiwiLyogKGlnbm9yZWQpICovIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJcbmNvbnN0IGFwaSA9IHJlcXVpcmUoJ0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYi93b3JrZXItaW50ZXJmYWNlLmpzJyk7XG5leHBvcnRzLmFwaSA9IGFwaTtcblxuY29uc3QgeyBvdmVycmlkZUdsb2JhbHMgfSA9IHJlcXVpcmUoJ0B0ZW1wb3JhbGlvL3dvcmtmbG93L2xpYi9nbG9iYWwtb3ZlcnJpZGVzLmpzJyk7XG5vdmVycmlkZUdsb2JhbHMoKTtcblxuZXhwb3J0cy5pbXBvcnRXb3JrZmxvd3MgPSBmdW5jdGlvbiBpbXBvcnRXb3JrZmxvd3MoKSB7XG4gIHJldHVybiByZXF1aXJlKC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvVXNlcnMvYm9nZGFuL3dvcmsvc3R1ZGlvL2NvbXBvc2FibGVhaS9wYWNrYWdlcy93b3JrZmxvdy9saWIvZXNtL3dvcmtmbG93cy5qc1wiKTtcbn1cblxuZXhwb3J0cy5pbXBvcnRJbnRlcmNlcHRvcnMgPSBmdW5jdGlvbiBpbXBvcnRJbnRlcmNlcHRvcnMoKSB7XG4gIHJldHVybiBbXG4gICAgXG4gIF07XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|