velocious 1.0.694 → 1.0.695
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/README.md +1 -1
- package/build/configuration-types.js +1 -0
- package/build/database/advisory-lock-runner.js +31 -0
- package/build/database/advisory-lock-telemetry.js +129 -0
- package/build/database/drivers/base.js +114 -2
- package/build/database/drivers/mssql/index.js +16 -0
- package/build/database/drivers/mysql/index.js +14 -0
- package/build/database/drivers/pgsql/index.js +17 -0
- package/build/database/drivers/sqlite/base.js +20 -0
- package/build/database/drivers/sqlite/index.js +33 -0
- package/build/database/record/index.js +28 -0
- package/build/src/configuration-types.d.ts +8 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/database/advisory-lock-runner.d.ts +32 -0
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
- package/build/src/database/advisory-lock-runner.js +29 -1
- package/build/src/database/advisory-lock-telemetry.d.ts +129 -0
- package/build/src/database/advisory-lock-telemetry.d.ts.map +1 -0
- package/build/src/database/advisory-lock-telemetry.js +122 -0
- package/build/src/database/drivers/base.d.ts +51 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +104 -3
- package/build/src/database/drivers/mssql/index.d.ts +8 -0
- package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mssql/index.js +13 -1
- package/build/src/database/drivers/mysql/index.d.ts +8 -0
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +13 -1
- package/build/src/database/drivers/pgsql/index.d.ts +8 -0
- package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
- package/build/src/database/drivers/pgsql/index.js +14 -1
- package/build/src/database/drivers/sqlite/base.d.ts +12 -0
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/base.js +18 -1
- package/build/src/database/drivers/sqlite/index.d.ts +15 -0
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +31 -1
- package/build/src/database/record/index.d.ts +54 -0
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +26 -1
- package/package.json +1 -1
- package/src/configuration-types.js +1 -0
- package/src/database/advisory-lock-runner.js +31 -0
- package/src/database/advisory-lock-telemetry.js +129 -0
- package/src/database/drivers/base.js +114 -2
- package/src/database/drivers/mssql/index.js +16 -0
- package/src/database/drivers/mysql/index.js +14 -0
- package/src/database/drivers/pgsql/index.js +17 -0
- package/src/database/drivers/sqlite/base.js +20 -0
- package/src/database/drivers/sqlite/index.js +33 -0
- package/src/database/record/index.js +28 -0
|
@@ -381,5 +381,13 @@ export default class VelociousDatabaseDriversMssql extends Base {
|
|
|
381
381
|
* @returns {Promise<boolean>} - True if any session currently holds the lock.
|
|
382
382
|
*/
|
|
383
383
|
isAdvisoryLockHeld(name: string): Promise<boolean>;
|
|
384
|
+
/**
|
|
385
|
+
* Attributes the current holder of the named application lock to its
|
|
386
|
+
* requesting session from `sys.dm_tran_locks`, captured at the telemetry
|
|
387
|
+
* event moment (best-effort; the caller guards failures).
|
|
388
|
+
* @param {string} name - Lock name.
|
|
389
|
+
* @returns {Promise<string | null>} - SQL Server session id of the holder, or null when no session holds the lock.
|
|
390
|
+
*/
|
|
391
|
+
advisoryLockHolderConnectionId(name: string): Promise<string | null>;
|
|
384
392
|
}
|
|
385
393
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/mssql/index.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/mssql/index.js"],"names":[],"mappings":"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"}
|
|
@@ -821,5 +821,17 @@ export default class VelociousDatabaseDriversMssql extends Base {
|
|
|
821
821
|
const testResult = Number(rows?.[0]?.velocious_advisory_test_result);
|
|
822
822
|
return testResult === 0;
|
|
823
823
|
}
|
|
824
|
+
/**
|
|
825
|
+
* Attributes the current holder of the named application lock to its
|
|
826
|
+
* requesting session from `sys.dm_tran_locks`, captured at the telemetry
|
|
827
|
+
* event moment (best-effort; the caller guards failures).
|
|
828
|
+
* @param {string} name - Lock name.
|
|
829
|
+
* @returns {Promise<string | null>} - SQL Server session id of the holder, or null when no session holds the lock.
|
|
830
|
+
*/
|
|
831
|
+
async advisoryLockHolderConnectionId(name) {
|
|
832
|
+
const rows = await this.query(`SELECT TOP 1 request_session_id AS velocious_advisory_lock_holder FROM sys.dm_tran_locks WHERE resource_type = 'APPLICATIONLOCK' AND resource_description = ${this.quote(name)}`);
|
|
833
|
+
const holder = rows?.[0]?.velocious_advisory_lock_holder;
|
|
834
|
+
return holder === null || holder === undefined ? null : String(holder);
|
|
835
|
+
}
|
|
824
836
|
}
|
|
825
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9tc3NxbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxVQUFVLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFBO0FBQzdCLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFDNUMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUE7QUFDMUIsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUU1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sNkJBQTZC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QUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLDRCQUE0QixDQUFBO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFBO1FBRS9GLElBQUksVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRTNCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1FBRXBFLE9BQU8sVUFBVSxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEFsdGVyVGFibGUgZnJvbSBcIi4vc3FsL2FsdGVyLXRhYmxlLmpzXCJcbmltcG9ydCBCYXNlIGZyb20gXCIuLi9iYXNlLmpzXCJcbmltcG9ydCBDcmVhdGVEYXRhYmFzZSBmcm9tIFwiLi9zcWwvY3JlYXRlLWRhdGFiYXNlLmpzXCJcbmltcG9ydCBDcmVhdGVJbmRleCBmcm9tIFwiLi9zcWwvY3JlYXRlLWluZGV4LmpzXCJcbmltcG9ydCBDcmVhdGVUYWJsZSBmcm9tIFwiLi9zcWwvY3JlYXRlLXRhYmxlLmpzXCJcbmltcG9ydCBEZWxldGUgZnJvbSBcIi4vc3FsL2RlbGV0ZS5qc1wiXG5pbXBvcnQgRHJvcERhdGFiYXNlIGZyb20gXCIuL3NxbC9kcm9wLWRhdGFiYXNlLmpzXCJcbmltcG9ydCBEcm9wVGFibGUgZnJvbSBcIi4vc3FsL2Ryb3AtdGFibGUuanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBlc2NhcGVTdHJpbmcgZnJvbSBcInNxbC1lc2NhcGUtc3RyaW5nXCJcbmltcG9ydCBJbnNlcnQgZnJvbSBcIi4vc3FsL2luc2VydC5qc1wiXG5pbXBvcnQgT3B0aW9ucyBmcm9tIFwiLi9vcHRpb25zLmpzXCJcbmltcG9ydCBtc3NxbCBmcm9tIFwibXNzcWxcIlxuaW1wb3J0IG5ldCBmcm9tIFwibm9kZTpuZXRcIlxuaW1wb3J0IFF1ZXJ5UGFyc2VyIGZyb20gXCIuL3F1ZXJ5LXBhcnNlci5qc1wiXG5pbXBvcnQgUmVtb3ZlSW5kZXggZnJvbSBcIi4vc3FsL3JlbW92ZS1pbmRleC5qc1wiXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4vdGFibGUuanNcIlxuaW1wb3J0IFN0cnVjdHVyZVNxbCBmcm9tIFwiLi9zdHJ1Y3R1cmUtc3FsLmpzXCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBVcHNlcnQgZnJvbSBcIi4vc3FsL3Vwc2VydC5qc1wiXG5pbXBvcnQgVXBkYXRlIGZyb20gXCIuL3NxbC91cGRhdGUuanNcIlxuaW1wb3J0IFVVSUQgZnJvbSBcInB1cmUtdXVpZFwiXG5cbi8qKlxuICogU1FMIFNlcnZlciBlcnJvciBudW1iZXIgcmFpc2VkIGJ5IGBzcF9yZWxlYXNlYXBwbG9ja2Agd2hlbiB0aGUgY3VycmVudFxuICogc2Vzc2lvbiBkb2VzIG5vdCBob2xkIHRoZSByZXF1ZXN0ZWQgYXBwbGljYXRpb24gbG9jay4gUmVsZWFzaW5nIGEgbG9jayB0aGVcbiAqIHNlc3Npb24gbm8gbG9uZ2VyIGhvbGRzIGlzIGEgbm9ybWFsIHJhY2UgKGEgc2hhcmVkIGNvbm5lY3Rpb24ncyBmaW5hbFxuICogY2hlY2staW4gbWF5IGFscmVhZHkgaGF2ZSBhdXRvLXJlbGVhc2VkIGl0KSwgd2hpY2ggdGhlIGNyb3NzLWRyaXZlclxuICogYHJlbGVhc2VBZHZpc29yeUxvY2tgIGNvbnRyYWN0IG1vZGVscyBieSByZXNvbHZpbmcgdG8gYGZhbHNlYC4gV2UgdHJhbnNsYXRlXG4gKiB0aGlzIHNwZWNpZmljIGVycm9yIGludG8gdGhhdCByZXN1bHQgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBlc2NhcGUuXG4gKiBAdHlwZSB7bnVtYmVyfVxuICovXG5jb25zdCBBUFBMT0NLX05PVF9IRUxEX0VSUk9SX05VTUJFUiA9IDEyMjNcbmNvbnN0IERJU0FCTEVfRk9SRUlHTl9LRVlTX1NRTCA9IFwiRVhFQyBzcF9NU2ZvcmVhY2h0YWJsZSBcXFwiQUxURVIgVEFCTEUgPyBOT0NIRUNLIENPTlNUUkFJTlQgYWxsXFxcIlwiXG5jb25zdCBFTkFCTEVfRk9SRUlHTl9LRVlTX1NRTCA9IFwiRVhFQyBzcF9NU2ZvcmVhY2h0YWJsZSBAY29tbWFuZDE9XFxcInByaW50ICc/J1xcXCIsIEBjb21tYW5kMj1cXFwiQUxURVIgVEFCTEUgPyBXSVRIIENIRUNLIENIRUNLIENPTlNUUkFJTlQgYWxsXFxcIlwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc01zc3FsIGV4dGVuZHMgQmFzZXtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJtc3NxbFwiKS5UcmFuc2FjdGlvbiB8IG51bGx9ICovXG4gIF9hZHZpc29yeUxvY2tUcmFuc2FjdGlvbiA9IG51bGxcblxuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldEFyZ3MoKVxuICAgIGNvbnN0IHNxbENvbmZpZyA9IGRpZ2coYXJncywgXCJzcWxDb25maWdcIilcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSBhd2FpdCB0aGlzLmNsb3NlKClcblxuICAgICAgaWYgKHNxbENvbmZpZykge1xuICAgICAgICBzcWxDb25maWcub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHNxbENvbmZpZy5vcHRpb25zLCB7dXNlVVRDOiB0cnVlfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHNxbENvbmZpZz8uc2VydmVyICYmICFzcWxDb25maWcub3B0aW9ucz8uc2VydmVyTmFtZSAmJiBuZXQuaXNJUChzcWxDb25maWcuc2VydmVyKSkge1xuICAgICAgICBzcWxDb25maWcub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHNxbENvbmZpZy5vcHRpb25zLCB7c2VydmVyTmFtZTogXCJcIn0pXG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBtc3NxbC5Db25uZWN0aW9uUG9vbChzcWxDb25maWcpXG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24uY29ubmVjdCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFJlLXRocm93IHRvIGZpeCB1bnVzZWFibGUgc3RhY2sgdHJhY2UuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGNvbm5lY3QgdG8gZGF0YWJhc2U6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBfY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHJldHVyblxuXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvblxuICAgIHRoaXMuY29ubmVjdGlvbiA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICB0aGlzLl90cmFuc2FjdGlvbnNDb3VudCA9IDBcbiAgICAvKiogQHR5cGUge0Vycm9yIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBzZXNzaW9uRXJyb3JcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9jbG9zZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2Vzc2lvbkVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFwiRmFpbGVkIHRvIGNsb3NlIE1TU1FMIGFkdmlzb3J5LWxvY2sgc2Vzc2lvblwiLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMjAwMH0sICgpID0+IGNvbm5lY3Rpb24uY2xvc2UoKSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcIkZhaWxlZCB0byBjbG9zZSBNU1NRTCBjb25uZWN0aW9uIGNsZWFubHlcIiwge2Vycm9yfSlcbiAgICB9XG5cbiAgICBpZiAoc2Vzc2lvbkVycm9yKSB0aHJvdyBzZXNzaW9uRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsdGVyIHRhYmxlIHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiKS5kZWZhdWx0fSB0YWJsZURhdGEgLSBUYWJsZSBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSkge1xuICAgIGNvbnN0IGFsdGVyQXJncyA9IHt0YWJsZURhdGEsIGRyaXZlcjogdGhpc31cbiAgICBjb25zdCBhbHRlclRhYmxlID0gbmV3IEFsdGVyVGFibGUoYWx0ZXJBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IGFsdGVyVGFibGUudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSBkYXRhYmFzZSBzcWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZU5hbWUgLSBEYXRhYmFzZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaWZOb3RFeGlzdHNdIC0gV2hldGhlciBpZiBub3QgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBjcmVhdGVEYXRhYmFzZVNxbChkYXRhYmFzZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCBjcmVhdGVBcmdzID0gT2JqZWN0LmFzc2lnbih7ZGF0YWJhc2VOYW1lLCBkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGNyZWF0ZURhdGFiYXNlID0gbmV3IENyZWF0ZURhdGFiYXNlKGNyZWF0ZUFyZ3MpXG5cbiAgICByZXR1cm4gY3JlYXRlRGF0YWJhc2UudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCBkYXRhYmFzZSBzcWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZU5hbWUgLSBEYXRhYmFzZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuaWZFeGlzdHNdIC0gV2hldGhlciBpZiBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGRyb3BEYXRhYmFzZVNxbChkYXRhYmFzZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCBkcm9wQXJncyA9IE9iamVjdC5hc3NpZ24oe2RhdGFiYXNlTmFtZSwgZHJpdmVyOiB0aGlzfSwgYXJncylcbiAgICBjb25zdCBkcm9wRGF0YWJhc2UgPSBuZXcgRHJvcERhdGFiYXNlKGRyb3BBcmdzKVxuXG4gICAgcmV0dXJuIGRyb3BEYXRhYmFzZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjcmVhdGUgaW5kZXggc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkNyZWF0ZUluZGV4U3FsQXJnc30gaW5kZXhEYXRhIC0gSW5kZXggZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVJbmRleFNRTHMoaW5kZXhEYXRhKSB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGluZGV4RGF0YSlcbiAgICBjb25zdCBjcmVhdGVJbmRleCA9IG5ldyBDcmVhdGVJbmRleChjcmVhdGVBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUluZGV4LnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXggc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlJlbW92ZUluZGV4U3FsQXJnc30gaW5kZXhEYXRhIC0gSW5kZXggZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyByZW1vdmVJbmRleFNRTHMoaW5kZXhEYXRhKSB7XG4gICAgY29uc3QgcmVtb3ZlQXJncyA9IE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGluZGV4RGF0YSlcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IG5ldyBSZW1vdmVJbmRleChyZW1vdmVBcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlbW92ZUluZGV4LnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjcmVhdGUgdGFibGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL3RhYmxlLWRhdGEvaW5kZXguanNcIikuZGVmYXVsdH0gdGFibGVEYXRhIC0gVGFibGUgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZVNxbCh0YWJsZURhdGEpIHtcbiAgICBjb25zdCBjcmVhdGVBcmdzID0ge3RhYmxlRGF0YSwgZHJpdmVyOiB0aGlzLCBpbmRleEluQ3JlYXRlVGFibGU6IGZhbHNlfVxuICAgIGNvbnN0IGNyZWF0ZVRhYmxlID0gbmV3IENyZWF0ZVRhYmxlKGNyZWF0ZUFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlVGFibGUudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3VycmVudCBkYXRhYmFzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBjdXJyZW50IGRhdGFiYXNlLlxuICAgKi9cbiAgYXN5bmMgY3VycmVudERhdGFiYXNlKCkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIERCX05BTUUoKSBBUyBkYl9uYW1lXCIpXG5cbiAgICByZXR1cm4gZGlnZyhyb3dzLCAwLCBcImRiX25hbWVcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBldmVyeSBmb3JlaWduIGtleSBjb25zdHJhaW50IChidWxrIGBOT0NIRUNLYCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZm9yZWlnbiBrZXlzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIGFzeW5jIGRpc2FibGVGb3JlaWduS2V5cygpIHtcbiAgICBhd2FpdCB0aGlzLl9leGVjQ29uc3RyYWludFRvZ2dsZShESVNBQkxFX0ZPUkVJR05fS0VZU19TUUwsIFwiZGlzYWJsZUZvcmVpZ25LZXlzXCIpXG4gIH1cblxuICAvKipcbiAgICogUmUtZW5hYmxlcyBhbmQgcmUtdmFsaWRhdGVzIGV2ZXJ5IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgKGBXSVRIIENIRUNLYCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZm9yZWlnbiBrZXlzIGFyZSBlbmFibGVkLlxuICAgKi9cbiAgYXN5bmMgZW5hYmxlRm9yZWlnbktleXMoKSB7XG4gICAgYXdhaXQgdGhpcy5fZXhlY0NvbnN0cmFpbnRUb2dnbGUoRU5BQkxFX0ZPUkVJR05fS0VZU19TUUwsIFwiZW5hYmxlRm9yZWlnbktleXNcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBjb25zdHJhaW50LXRvZ2dsZSBzdGF0ZW1lbnQuIGBBTFRFUiBUQUJMRSAuLi4gTk9DSEVDSy9DSEVDS1xuICAgKiBDT05TVFJBSU5UYCBuZWVkcyBhIHNjaGVtYS1tb2RpZmljYXRpb24gbG9jayBvbiBldmVyeSB0YWJsZSwgc28gaWYgdGhlXG4gICAqIHJlcXVlc3QgdGltZXMgb3V0IGl0IGlzIGFsbW9zdCBhbHdheXMgYmxvY2tlZCBieSBhbm90aGVyIHNlc3Npb24gdGhhdCBpc1xuICAgKiBzdGlsbCBob2xkaW5nIGEgbG9jayAoYSBsZWFrZWQvdW5jb21taXR0ZWQgY29ubmVjdGlvbikuIE9uIGEgdGltZW91dCxcbiAgICogY2FwdHVyZSB3aGljaCBzZXNzaW9ucyB3ZXJlIGJsb2NraW5nIHNvIHRoZSByZWFsIGN1bHByaXQgaXMgbmFtZWQgaW5zdGVhZFxuICAgKiBvZiBsZWF2aW5nIGEgYmFyZSBcIlJlcXVlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGluIDE1MDAwbXNcIi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIENvbnN0cmFpbnQtdG9nZ2xlIFNRTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gT3BlcmF0aW9uIGxhYmVsIGZvciB0aGUgZXJyb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHRvZ2dsZSBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfZXhlY0NvbnN0cmFpbnRUb2dnbGUoc3FsLCBsYWJlbCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KHNxbClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgL1RpbWVvdXQ6IFJlcXVlc3QgZmFpbGVkIHRvIGNvbXBsZXRlL2kudGVzdChlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuX2NhcHR1cmVCbG9ja2luZ1Nlc3Npb25zRm9yRGVidWcoKS5jYXRjaChcbiAgICAgICAgICAoZGlhZ0Vycm9yKSA9PiBgKGJsb2NraW5nIGRpYWdub3N0aWNzIHF1ZXJ5IGZhaWxlZDogJHtkaWFnRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGRpYWdFcnJvci5tZXNzYWdlIDogZGlhZ0Vycm9yfSlgXG4gICAgICAgIClcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX1cXG5cXG5bJHtsYWJlbH0gYmxvY2tlZF0gb3RoZXIgdXNlciBzZXNzaW9ucyB3aXRoIG9wZW4gdHJhbnNhY3Rpb25zIG9yIGFjdGl2ZSByZXF1ZXN0czpcXG4ke3NuYXBzaG90fWAsIHtjYXVzZTogZXJyb3J9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTbmFwc2hvdHMgdGhlIHNlc3Npb25zIHRoYXQgY291bGQgYmUgYmxvY2tpbmcgYSBjb25zdHJhaW50IHRvZ2dsZSBpbiBUSElTXG4gICAqIGRhdGFiYXNlIOKAlCBldmVyeSBzZXNzaW9uIG90aGVyIHRoYW4gdGhpcyBvbmUgdGhhdCBob2xkcyBhIGxvY2sgaW4gYERCX0lEKClgXG4gICAqIG9yIGlzIHJ1bm5pbmcgYSByZXF1ZXN0IGFnYWluc3QgaXQg4oCUIHdpdGggaXRzIGxhc3Qgc3RhdGVtZW50LCB3YWl0IHN0YXRlLFxuICAgKiBhbmQgYmxvY2tpbmcgc2Vzc2lvbiwgZW5vdWdoIHRvIGlkZW50aWZ5IGEgY29ubmVjdGlvbiB0aGF0IGxlYWtlZCBhIGxvY2suXG4gICAqIFNjb3BlZCB0byB0aGUgY3VycmVudCBkYXRhYmFzZSBzbyBhIG11bHRpLWRhdGFiYXNlIHNlcnZlciBkb2VzIG5vdCBsZWFrXG4gICAqIHVucmVsYXRlZCBzZXNzaW9ucycgU1FMIGludG8gdGhlIGVycm9yIGFuZCBidXJ5IHRoZSByZWFsIGJsb2NrZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSlNPTiBzbmFwc2hvdCwgb3IgYSBcIihub25lKVwiIG1hcmtlci5cbiAgICovXG4gIGFzeW5jIF9jYXB0dXJlQmxvY2tpbmdTZXNzaW9uc0ZvckRlYnVnKCkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KGBcbiAgICAgIFdJVEggbG9ja19zZXNzaW9ucyBBUyAoXG4gICAgICAgIFNFTEVDVCBESVNUSU5DVCByZXF1ZXN0X3Nlc3Npb25faWQgQVMgc2Vzc2lvbl9pZFxuICAgICAgICBGUk9NIHN5cy5kbV90cmFuX2xvY2tzXG4gICAgICAgIFdIRVJFIHJlc291cmNlX2RhdGFiYXNlX2lkID0gREJfSUQoKVxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIHMuc2Vzc2lvbl9pZCBBUyBzZXNzaW9uSWQsXG4gICAgICAgIHMuc3RhdHVzIEFTIHNlc3Npb25TdGF0dXMsXG4gICAgICAgIHMubG9naW5fdGltZSBBUyBsb2dpblRpbWUsXG4gICAgICAgIHMubGFzdF9yZXF1ZXN0X3N0YXJ0X3RpbWUgQVMgbGFzdFJlcXVlc3RTdGFydCxcbiAgICAgICAgcy5sYXN0X3JlcXVlc3RfZW5kX3RpbWUgQVMgbGFzdFJlcXVlc3RFbmQsXG4gICAgICAgIHMub3Blbl90cmFuc2FjdGlvbl9jb3VudCBBUyBvcGVuVHJhbnNhY3Rpb25Db3VudCxcbiAgICAgICAgci5zdGF0dXMgQVMgcmVxdWVzdFN0YXR1cyxcbiAgICAgICAgci5jb21tYW5kIEFTIGNvbW1hbmQsXG4gICAgICAgIHIud2FpdF90eXBlIEFTIHdhaXRUeXBlLFxuICAgICAgICByLndhaXRfdGltZSBBUyB3YWl0VGltZU1zLFxuICAgICAgICByLmJsb2NraW5nX3Nlc3Npb25faWQgQVMgYmxvY2tpbmdTZXNzaW9uSWQsXG4gICAgICAgIENBU1QoaWIuZXZlbnRfaW5mbyBBUyBOVkFSQ0hBUihNQVgpKSBBUyBsYXN0U3FsXG4gICAgICBGUk9NIHN5cy5kbV9leGVjX3Nlc3Npb25zIHNcbiAgICAgIExFRlQgSk9JTiBzeXMuZG1fZXhlY19yZXF1ZXN0cyByIE9OIHIuc2Vzc2lvbl9pZCA9IHMuc2Vzc2lvbl9pZFxuICAgICAgT1VURVIgQVBQTFkgc3lzLmRtX2V4ZWNfaW5wdXRfYnVmZmVyKHMuc2Vzc2lvbl9pZCwgTlVMTCkgaWJcbiAgICAgIFdIRVJFIHMuaXNfdXNlcl9wcm9jZXNzID0gMVxuICAgICAgICBBTkQgcy5zZXNzaW9uX2lkIDw+IEBAU1BJRFxuICAgICAgICBBTkQgKHMuc2Vzc2lvbl9pZCBJTiAoU0VMRUNUIHNlc3Npb25faWQgRlJPTSBsb2NrX3Nlc3Npb25zKSBPUiByLmRhdGFiYXNlX2lkID0gREJfSUQoKSlcbiAgICBgKVxuXG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gXCIobm9uZSDigJQgbm8gb3RoZXIgc2Vzc2lvbiBoZWxkIGEgbG9jayBvciByYW4gYSByZXF1ZXN0IGluIHRoaXMgZGF0YWJhc2Ugd2hlbiBxdWVyaWVkKVwiXG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocm93cywgbnVsbCwgMilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUgc3Fscy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5Ecm9wVGFibGVTcWxBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlU1FMcyh0YWJsZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IGRyb3BBcmdzID0gT2JqZWN0LmFzc2lnbih7dGFibGVOYW1lLCBkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGRyb3BUYWJsZSA9IG5ldyBEcm9wVGFibGUoZHJvcEFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgZHJvcFRhYmxlLnRvU1FMcygpXG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgdGhlIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIHRoYXQgcmVmZXJlbmNlIHRoZSBnaXZlbiB0YWJsZS4gTVNTUUxcbiAgICogcmVmdXNlcyB0byBkcm9wIGEgdGFibGUgdGhhdCBpcyBzdGlsbCByZWZlcmVuY2VkIGJ5IGEgRk9SRUlHTiBLRVlcbiAgICogY29uc3RyYWludCBldmVuIHdoZW4gY29uc3RyYWludHMgYXJlIGRpc2FibGVkIHZpYSBOT0NIRUNLLCBzbyB0aGVcbiAgICogcmVmZXJlbmNpbmcgY29uc3RyYWludHMgbXVzdCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgdGFibGUgY2FuIGJlIGRyb3BwZWQuXG4gICAqIFRoaXMgbGV0cyBjYWxsZXJzIGRyb3AgdGFibGVzIGluIGFueSBvcmRlciAoZS5nLiB3aXBpbmcgYSB3aG9sZSBzY2hlbWEpXG4gICAqIHdpdGhvdXQgZmlyc3QgZHJvcHBpbmcgZXZlcnkgZGVwZW5kZW50IHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9kcm9wUmVmZXJlbmNpbmdGb3JlaWduS2V5cyh0YWJsZU5hbWUpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgIFwiU0VMRUNUIGZrLm5hbWUgQVMgY29uc3RyYWludF9uYW1lLCBPQkpFQ1RfTkFNRShmay5wYXJlbnRfb2JqZWN0X2lkKSBBUyBwYXJlbnRfdGFibGUgXCIgK1xuICAgICAgYEZST00gc3lzLmZvcmVpZ25fa2V5cyBmayBXSEVSRSBmay5yZWZlcmVuY2VkX29iamVjdF9pZCA9IE9CSkVDVF9JRCgke3RoaXMucXVvdGUodGFibGVOYW1lKX0pYFxuICAgIClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnROYW1lID0gcm93LmNvbnN0cmFpbnRfbmFtZSA/PyByb3cuQ09OU1RSQUlOVF9OQU1FXG4gICAgICBjb25zdCBwYXJlbnRUYWJsZSA9IHJvdy5wYXJlbnRfdGFibGUgPz8gcm93LlBBUkVOVF9UQUJMRVxuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBBTFRFUiBUQUJMRSBbJHtwYXJlbnRUYWJsZX1dIERST1AgQ09OU1RSQUlOVCBbJHtjb25zdHJhaW50TmFtZX1dYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkRyb3BUYWJsZVNxbEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRyb3BUYWJsZSh0YWJsZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuX2Fzc2VydE5vdFJlYWRPbmx5KClcbiAgICBhd2FpdCB0aGlzLl9kcm9wUmVmZXJlbmNpbmdGb3JlaWduS2V5cyh0YWJsZU5hbWUpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5kcm9wVGFibGVTUUxzKHRhYmxlTmFtZSwgYXJncylcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCB0eXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0eXBlLlxuICAgKi9cbiAgZ2V0VHlwZSgpIHsgcmV0dXJuIFwibXNzcWxcIiB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVlcnkgYWN0dWFsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gU1FMIHN0cmluZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIC0gUXVlcnkgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeVJlc3VsdFR5cGU+fSAtIFJlc29sdmVzIHdpdGggdGhlIHF1ZXJ5IGFjdHVhbC5cbiAgICovXG4gIGFzeW5jIF9xdWVyeUFjdHVhbChzcWwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCByZXN1bHRcbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IG9wdGlvbnMucmVxdWVzdFRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHtyZXF1ZXN0VGltZW91dDogb3B0aW9ucy5yZXF1ZXN0VGltZW91dE1zfVxuICAgICAgICAvLyBub2RlLW1zc3FsIHN1cHBvcnRzIHJlcXVlc3QtbG9jYWwgb3ZlcnJpZGVzLCBidXQgaXRzIERlZmluaXRlbHlUeXBlZFxuICAgICAgICAvLyBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbiBzdGlsbCBleHBvc2VzIG9ubHkgdGhlIGxlZ2FjeSBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RPcHRpb25zXG4gICAgICAgICAgPyBSZWZsZWN0LmNvbnN0cnVjdChtc3NxbC5SZXF1ZXN0LCBbdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uIHx8IHRoaXMuY29ubmVjdGlvbiwgcmVxdWVzdE9wdGlvbnNdKVxuICAgICAgICAgIDogdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBtc3NxbC5SZXF1ZXN0KHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbilcbiAgICAgICAgICAgIDogbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5jb25uZWN0aW9uKVxuICAgICAgICByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LnF1ZXJ5KHNxbClcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT0gXCJObyBjb25uZWN0aW9uIGlzIHNwZWNpZmllZCBmb3IgdGhhdCByZXF1ZXN0LlwiICYmIHRyaWVzIDw9IDMpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiUmVjb25uZWN0aW5nIHRvIGRhdGFiYXNlXCIpXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWNvbm5lY3QoKVxuICAgICAgICAgIC8vIFJldHJ5XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIC8vIFJlLXRocm93IGVycm9yIGJlY2F1c2UgdGhlIHN0YWNrLXRyYWNlIGlzIGJyb2tlbiBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgYXBwLWRldmVsb3BtZW50LlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkICcke2Vycm9yLm1lc3NhZ2V9JzogJHtzcWx9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBmYWlsZWQgJyR7ZXJyb3J9JzogJHtzcWx9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXN1bHQucmVjb3Jkc2V0cykgPyByZXN1bHQucmVjb3Jkc2V0c1swXSB8fCBbXSA6IFtdXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBtdXRhdGlvbiB3aXRoIGFmZmVjdGVkLXJvdyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIE11dGF0aW9uIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBBZmZlY3RlZCByb3cgY291bnQuXG4gICAqL1xuICBhc3luYyBfYWZmZWN0ZWRSb3dzQWN0dWFsKHNxbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb25cbiAgICAgID8gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5fY3VycmVudFRyYW5zYWN0aW9uKVxuICAgICAgOiBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLmNvbm5lY3Rpb24pXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5xdWVyeShzcWwpXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzQWZmZWN0ZWQucmVkdWNlKCh0b3RhbCwgY291bnQpID0+IHRvdGFsICsgY291bnQsIDApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSB0byBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vcXVlcnkvaW5kZXguanNcIikuZGVmYXVsdH0gcXVlcnkgLSBRdWVyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnlUb1NxbChxdWVyeSkgeyByZXR1cm4gbmV3IFF1ZXJ5UGFyc2VyKHtxdWVyeX0pLnRvU3FsKCkgfVxuXG4gIHNob3VsZFNldEF1dG9JbmNyZW1lbnRXaGVuUHJpbWFyeUtleSgpIHsgcmV0dXJuIHRydWUgfVxuICBzdXBwb3J0c0RlZmF1bHRQcmltYXJ5S2V5VVVJRCgpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFuIGV4cGxpY2l0IHByaW1hcnkta2V5IGluc2VydCBhcyBvbmUgYmF0Y2ggcmVxdWVzdDogU1FMIFNlcnZlciBzY29wZXNcbiAgICogSURFTlRJVFlfSU5TRVJUIHRvIHRoZSBzZXNzaW9uLCBhbmQgbm9kZS1tc3NxbCBwb29sLWJhY2tlZCByZXF1ZXN0cyBtYXkgdXNlXG4gICAqIGEgZGlmZmVyZW50IHBoeXNpY2FsIHNlc3Npb24gcGVyIHF1ZXJ5LCBzbyBlbmFibGluZyBpdCBpbiBhIHNlcGFyYXRlIHF1ZXJ5XG4gICAqIGNhbiBsZWF2ZSB0aGUgYWN0dWFsIElOU0VSVCBvbiBhbm90aGVyIHNlc3Npb24uIEEgc2luZ2xlIGJhdGNoIGtlZXBzIHRoZVxuICAgKiB3aG9sZSBzZXF1ZW5jZSBvbiBvbmUgc2Vzc2lvbiBieSBjb25zdHJ1Y3Rpb246IGVuYWJsZSwgaW5zZXJ0LCBkaXNhYmxlIG9uXG4gICAqIHN1Y2Nlc3MsIGFuZCBhIENBVENIIHRoYXQgZGlzYWJsZXMgYW5kIHJldGhyb3dzIHRoZSBvcmlnaW5hbCBlcnJvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9uc30gYXJncy5vcHRpb25zIC0gUXVlcnkgb3B0aW9ucyBmb3IgdGhlIHN0YW5kYXJkIHF1ZXJ5IHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNxbCAtIEdlbmVyYXRlZCBpbnNlcnQgU1FMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBUYWJsZSBiZWluZyBpbnNlcnRlZCBpbnRvLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gSW5zZXJ0IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGluc2VydFdpdGhFeHBsaWNpdFByaW1hcnlLZXkoe29wdGlvbnMsIHNxbCwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHF1b3RlZFRhYmxlID0gdGhpcy5xdW90ZVRhYmxlKHRhYmxlTmFtZSlcbiAgICBjb25zdCBiYXRjaCA9IFtcbiAgICAgIGBTRVQgSURFTlRJVFlfSU5TRVJUICR7cXVvdGVkVGFibGV9IE9OO2AsXG4gICAgICBcIkJFR0lOIFRSWVwiLFxuICAgICAgYCR7c3FsfTtgLFxuICAgICAgYFNFVCBJREVOVElUWV9JTlNFUlQgJHtxdW90ZWRUYWJsZX0gT0ZGO2AsXG4gICAgICBcIkVORCBUUllcIixcbiAgICAgIFwiQkVHSU4gQ0FUQ0hcIixcbiAgICAgIGBTRVQgSURFTlRJVFlfSU5TRVJUICR7cXVvdGVkVGFibGV9IE9GRjtgLFxuICAgICAgXCJUSFJPVztcIixcbiAgICAgIFwiRU5EIENBVENIXCJcbiAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnF1ZXJ5KGJhdGNoLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXNjYXBlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZXNjYXBlLlxuICAgKi9cbiAgZXNjYXBlKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpXG4gICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogYCR7dmFsdWV9YFxuXG4gICAgY29uc3QgcmVzdWx0V2l0aFF1b3RlcyA9IGVzY2FwZVN0cmluZyhzdHJpbmdWYWx1ZSwgbnVsbClcbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRXaXRoUXVvdGVzLnN1YnN0cmluZygxLCByZXN1bHRXaXRoUXVvdGVzLmxlbmd0aCAtIDEpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZS5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXJ9IC0gVGhlIHF1b3RlZCB2YWx1ZS5cbiAgICovXG4gIHF1b3RlKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09IFwibnVtYmVyXCIpIHJldHVybiB2YWx1ZVxuICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSlcblxuICAgIHJldHVybiBgTiR7ZXNjYXBlU3RyaW5nKHN0cmluZ1ZhbHVlLCBudWxsKX1gXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHF1b3RlIGNvbHVtbi5cbiAgICovXG4gIHF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpIHsgcmV0dXJuIHRoaXMub3B0aW9ucygpLnF1b3RlQ29sdW1uTmFtZShjb2x1bW5OYW1lKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVvdGUgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBTdHJpbmcuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHF1b3RlIHRhYmxlLlxuICAgKi9cbiAgcXVvdGVUYWJsZShzdHJpbmcpIHsgcmV0dXJuIHRoaXMub3B0aW9ucygpLnF1b3RlVGFibGVOYW1lKHN0cmluZykgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbmFtZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2xkQ29sdW1uTmFtZSAtIFByZXZpb3VzIGNvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3Q29sdW1uTmFtZSAtIE5ldyBjb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9sZENvbHVtbk5hbWUsIG5ld0NvbHVtbk5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBFWEVDIHNwX3JlbmFtZSAke3RoaXMucXVvdGUoYCR7dGFibGVOYW1lfS4ke29sZENvbHVtbk5hbWV9YCl9LCAke3RoaXMucXVvdGUobmV3Q29sdW1uTmFtZSl9LCAnQ09MVU1OJ2ApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxldGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRGVsZXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgZGVsZXRlU3FsKHt0YWJsZU5hbWUsIGNvbmRpdGlvbnN9KSB7XG4gICAgY29uc3QgZGVsZXRlSW5zdHJ1Y3Rpb24gPSBuZXcgRGVsZXRlKHtjb25kaXRpb25zLCBkcml2ZXI6IHRoaXMsIHRhYmxlTmFtZX0pXG5cbiAgICByZXR1cm4gZGVsZXRlSW5zdHJ1Y3Rpb24udG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IHNxbC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5JbnNlcnRTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBpbnNlcnRTcWwoYXJncykge1xuICAgIGNvbnN0IGluc2VydEFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGluc2VydCA9IG5ldyBJbnNlcnQoaW5zZXJ0QXJncylcblxuICAgIHJldHVybiBpbnNlcnQudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pj59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgdGFibGVzLlxuICAgKi9cbiAgYXN5bmMgZ2V0VGFibGVzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInRhYmxlc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldEFyZ3MoKT8uc2NoZW1hIHx8IHRoaXMuZ2V0QXJncygpPy5zcWxDb25maWc/Lm9wdGlvbnM/LnNjaGVtYVxuICAgICAgY29uc3Qgc2NoZW1hQ2xhdXNlID0gc2NoZW1hXG4gICAgICAgID8gYCBBTkQgW1RBQkxFX1NDSEVNQV0gPSAke3RoaXMucXVvdGUoc2NoZW1hKX1gXG4gICAgICAgIDogXCIgQU5EIFtUQUJMRV9TQ0hFTUFdID0gU0NIRU1BX05BTUUoKVwiXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KGBTRUxFQ1QgW1RBQkxFX05BTUVdIEZST00gW0lORk9STUFUSU9OX1NDSEVNQV0uW1RBQkxFU10gV0hFUkUgW1RBQkxFX0NBVEFMT0ddID0gREJfTkFNRSgpJHtzY2hlbWFDbGF1c2V9YClcbiAgICAgIGNvbnN0IHRhYmxlcyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdCkge1xuICAgICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovIChyb3cpKVxuXG4gICAgICAgIHRhYmxlcy5wdXNoKHRhYmxlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFibGVzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBLZWVwcyBjb25zdHJhaW50IHRvZ2dsZXMgYW5kIGNsZWFudXAgaW5zaWRlIGVhY2ggcGh5c2ljYWwgU1FMIFNlcnZlclxuICAgKiByZXF1ZXN0IHNvIGEgcG9vbCBjYW5ub3Qgc3BsaXQgbGlmZWN5Y2xlIG93bmVyc2hpcCBhY3Jvc3Mgc2Vzc2lvbnMuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+fSB0YWJsZXMgLSBFbGlnaWJsZSB0YWJsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIG9uZSBjbGVhbnVwIGF0dGVtcHQgc3VjY2VlZHMuXG4gICAqL1xuICBhc3luYyBfdHJ1bmNhdGVBbGxUYWJsZXModGFibGVzKSB7XG4gICAgYXdhaXQgdGhpcy5fdHJ1bmNhdGVBbGxUYWJsZXNXaXRoUmV0cmllcyh0YWJsZXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgZmFpbC1sb3VkIGNsZWFudXAgYmF0Y2ggd2l0aCByZXN0b3JhdGlvbiBvbiBib3RoIHN1Y2Nlc3MgYW5kXG4gICAqIGZhaWx1cmUuIFRoZSBvdXRlciByZXRyeSBvd25lciByZWZyZXNoZXMgc3RhbGUgdGFibGUgc25hcHNob3RzLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pn0gdGFibGVzIC0gQ3VycmVudCBlbGlnaWJsZSB0YWJsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSBiYXRjaCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luYyBfdHJ1bmNhdGVBbGxUYWJsZXNBdHRlbXB0KHRhYmxlcykge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBbXG4gICAgICBcIkJFR0lOIFRSWVwiLFxuICAgICAgYCAgJHtESVNBQkxFX0ZPUkVJR05fS0VZU19TUUx9O2AsXG4gICAgICAuLi50aGlzLl90cnVuY2F0ZVRhYmxlU3RhdGVtZW50cyh0YWJsZXMpLFxuICAgICAgYCAgJHtFTkFCTEVfRk9SRUlHTl9LRVlTX1NRTH07YCxcbiAgICAgIFwiRU5EIFRSWVwiLFxuICAgICAgXCJCRUdJTiBDQVRDSFwiLFxuICAgICAgYCAgJHtFTkFCTEVfRk9SRUlHTl9LRVlTX1NRTH07YCxcbiAgICAgIFwiICBUSFJPVztcIixcbiAgICAgIFwiRU5EIENBVENIO1wiXG4gICAgXVxuXG4gICAgYXdhaXQgdGhpcy5xdWVyeShzdGF0ZW1lbnRzLmpvaW4oXCJcXG5cIikpXG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGFsbCBlbGlnaWJsZSB0YWJsZXMgaW4gb25lIFNRTCBTZXJ2ZXIgcmVxdWVzdCwgcmV0YWluaW5nIHRoZVxuICAgKiByZWNvZ25pemVkIGZvcmVpZ24ta2V5IGZhbGxiYWNrIHVzZWQgYnkgdGhlIHBlci10YWJsZSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+fSB0YWJsZXMgLSBFbGlnaWJsZSB0YWJsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIGJhdGNoIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIHRydW5jYXRlVGFibGVzKHRhYmxlcykge1xuICAgIGF3YWl0IHRoaXMucXVlcnkodGhpcy5fdHJ1bmNhdGVUYWJsZVN0YXRlbWVudHModGFibGVzKS5qb2luKFwiXFxuXCIpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcGVyLXRhYmxlIHRydW5jYXRlL2RlbGV0ZS1mYWxsYmFjayBzdGF0ZW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4uL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdD59IHRhYmxlcyAtIEVsaWdpYmxlIHRhYmxlcy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgX3RydW5jYXRlVGFibGVTdGF0ZW1lbnRzKHRhYmxlcykge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgIGNvbnN0IHF1b3RlZFRhYmxlID0gdGhpcy5xdW90ZVRhYmxlKHRhYmxlLmdldE5hbWUoKSlcblxuICAgICAgc3RhdGVtZW50cy5wdXNoKFxuICAgICAgICBcIkJFR0lOIFRSWVwiLFxuICAgICAgICBgICBUUlVOQ0FURSBUQUJMRSAke3F1b3RlZFRhYmxlfTtgLFxuICAgICAgICBcIkVORCBUUllcIixcbiAgICAgICAgXCJCRUdJTiBDQVRDSFwiLFxuICAgICAgICBcIiAgSUYgRVJST1JfTlVNQkVSKCkgPSA0NzEyXCIsXG4gICAgICAgIFwiICBCRUdJTlwiLFxuICAgICAgICBgICAgIERFTEVURSBGUk9NICR7cXVvdGVkVGFibGV9O2AsXG4gICAgICAgIFwiICBFTkRcIixcbiAgICAgICAgXCIgIEVMU0VcIixcbiAgICAgICAgXCIgIEJFR0lOXCIsXG4gICAgICAgIFwiICAgIFRIUk9XO1wiLFxuICAgICAgICBcIiAgRU5EXCIsXG4gICAgICAgIFwiRU5EIENBVENIO1wiXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudHNcbiAgfVxuXG4gIGFzeW5jIGxhc3RJbnNlcnRJRChvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIFNDT1BFX0lERU5USVRZKCkgQVMgbGFzdF9pbnNlcnRfaWRcIiwgb3B0aW9ucylcbiAgICBjb25zdCBsYXN0SW5zZXJ0SUQgPSBkaWdnKHJlc3VsdCwgMCwgXCJsYXN0X2luc2VydF9pZFwiKVxuXG4gICAgaWYgKGxhc3RJbnNlcnRJRCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZ2V0IHRoZSBsYXN0IGluc2VydGVkIElEXCIpXG5cbiAgICByZXR1cm4gbGFzdEluc2VydElEXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7T3B0aW9uc30gLSBUaGUgb3B0aW9ucyBvcHRpb25zLlxuICAgKi9cbiAgb3B0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMpIHRoaXMuX29wdGlvbnMgPSBuZXcgT3B0aW9ucyh7ZHJpdmVyOiB0aGlzfSlcblxuICAgIHJldHVybiB0aGlzLl9vcHRpb25zXG4gIH1cblxuICBhc3luYyBfc3RhcnRUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICBhd2FpdCB0aGlzLl9ydW5QaHlzaWNhbENvbm5lY3Rpb25SZXF1ZXN0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIkEgdHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBydW5uaW5nXCIpXG4gICAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgYXdhaXQgdGhpcy5jb25uZWN0KClcblxuICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbmV3IG1zc3FsLlRyYW5zYWN0aW9uKHRoaXMuY29ubmVjdGlvbilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uLmJlZ2luKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgX2NvbW1pdFRyYW5zYWN0aW9uQWN0aW9uKCkge1xuICAgIGF3YWl0IHRoaXMuX3J1blBoeXNpY2FsQ29ubmVjdGlvblJlcXVlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIkEgdHJhbnNhY3Rpb24gaXNuJ3QgcnVubmluZ1wiKVxuXG4gICAgICBhd2FpdCB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24uY29tbWl0KClcbiAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgX3JvbGxiYWNrVHJhbnNhY3Rpb25BY3Rpb24oKSB7XG4gICAgYXdhaXQgdGhpcy5fcnVuUGh5c2ljYWxDb25uZWN0aW9uUmVxdWVzdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIkEgdHJhbnNhY3Rpb24gaXNuJ3QgcnVubmluZyAtIGlnbm9yaW5nIGJlY2F1c2UgdGhhdCBjYW4gaGFwcGVuIGlmIHNvbWV0aGluZyBlbHNlIGhhcyBmYWlsZWQgaW4gdGhlIGRiXCIpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24ucm9sbGJhY2soKVxuICAgICAgfSBjYXRjaCAodHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yKSB7XG4gICAgICAgIC8vIFdoZW4gU1FMIFNlcnZlciBoYXMgYWxyZWFkeSBhYm9ydGVkIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiwgYVxuICAgICAgICAvLyBzdGFsZSBjb25jdXJyZW50IHJlcXVlc3QgdHJpZ2dlcmVkIFhBQ1RfQUJPUlQpLCB0aGVcbiAgICAgICAgLy8gbXNzcWwuVHJhbnNhY3Rpb24ucm9sbGJhY2soKSBjYWxsIGZhaWxzIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIFRyYW5zYWN0aW9uIG9iamVjdCBpcyBkZWFkLiAgSXNzdWUgYSByYXcgUk9MTEJBQ0sgb24gdGhlXG4gICAgICAgIC8vIHVuZGVybHlpbmcgY29ubmVjdGlvbiB0byBjbGVhciBTUUwgU2VydmVyJ3Mgc2Vzc2lvbi1sZXZlbFxuICAgICAgICAvLyBhYm9ydGVkLXRyYW5zYWN0aW9uIHN0YXRlIHNvIHRoZSBjb25uZWN0aW9uIGlzIHVzYWJsZSBmb3IgdGhlXG4gICAgICAgIC8vIG5leHQgQkVHSU4gVFJBTlNBQ1RJT04uXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJUcmFuc2FjdGlvbi5yb2xsYmFjaygpIGZhaWxlZCwgY2xlYXJpbmcgc2Vzc2lvbiBzdGF0ZSB3aXRoIHJhdyBST0xMQkFDS1wiLCB7XG4gICAgICAgICAgZXJyb3I6IHRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gdHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yLm1lc3NhZ2UgOiB0cmFuc2FjdGlvblJvbGxiYWNrRXJyb3JcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5jb25uZWN0aW9uKVxuXG4gICAgICAgIGF3YWl0IHJlcXVlc3QucXVlcnkoXCJJRiBAQFRSQU5DT1VOVCA+IDAgUk9MTEJBQ0tcIilcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RhcnQgc2F2ZSBwb2ludCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYXZlUG9pbnROYW1lIC0gU2F2ZSBwb2ludCBuYW1lLlxuICAgKiBAcGFyYW0ge1BpY2s8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnMsIFwib3BlcmF0aW9uT3duZXJcIj59IFtvcHRpb25zXSAtIFRyYW5zYWN0aW9uIG93bmVyc2hpcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9zdGFydFNhdmVQb2ludEFjdGlvbihzYXZlUG9pbnROYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBTQVZFIFRSQU5TQUNUSU9OIFske3NhdmVQb2ludE5hbWV9XWAsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWxlYXNlIHNhdmUgcG9pbnQgYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2F2ZVBvaW50TmFtZSAtIFNhdmUgcG9pbnQgbmFtZS5cbiAgICogQHBhcmFtIHtQaWNrPGltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zLCBcIm9wZXJhdGlvbk93bmVyXCI+fSBbX29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JlbGVhc2VTYXZlUG9pbnRBY3Rpb24oc2F2ZVBvaW50TmFtZSwgX29wdGlvbnMgPSB7fSkge1xuICAgIC8vIERvIG5vdGhpbmcgaW4gTVMtU1FMLlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcm9sbGJhY2sgc2F2ZSBwb2ludCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYXZlUG9pbnROYW1lIC0gU2F2ZSBwb2ludCBuYW1lLlxuICAgKiBAcGFyYW0ge1BpY2s8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnMsIFwib3BlcmF0aW9uT3duZXJcIj59IFtvcHRpb25zXSAtIFRyYW5zYWN0aW9uIG93bmVyc2hpcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9yb2xsYmFja1NhdmVQb2ludEFjdGlvbihzYXZlUG9pbnROYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShgUk9MTEJBQ0sgVFJBTlNBQ1RJT04gWyR7c2F2ZVBvaW50TmFtZX1dYCwgb3B0aW9ucylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogYCR7ZXJyb3J9YFxuXG4gICAgICAvLyBXaGVuIFhBQ1RfQUJPUlQga2lsbHMgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiwgdGhlIHNhdmVwb2ludFxuICAgICAgLy8gbm8gbG9uZ2VyIGV4aXN0cyBhbmQgdGhlIFJPTExCQUNLIFRSQU5TQUNUSU9OIFtuYW1lXSBmYWlscy5cbiAgICAgIC8vIElzc3VlIGEgcmF3IElGIEBAVFJBTkNPVU5UID4gMCBST0xMQkFDSyB0byBjbGVhciB3aGF0ZXZlclxuICAgICAgLy8gc2Vzc2lvbiBzdGF0ZSByZW1haW5zLCB0aGVuIGxldCB0aGUgZXJyb3IgcHJvcGFnYXRlIHNvIHRoZVxuICAgICAgLy8gb3V0ZXIgdHJhbnNhY3Rpb24oKSBjYWxsIGtub3dzIHRoZSB0cmFuc2FjdGlvbiBpcyBkZWFkLlxuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJUcmFuc2FjdGlvbiBoYXMgbm90IGJlZ3VuXCIpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoXCJUcmFuc2FjdGlvbiBoYXMgYmVlbiBhYm9ydGVkXCIpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiU2F2ZXBvaW50IHJvbGxiYWNrIGZhaWxlZDsgdHJhbnNhY3Rpb24gYWxyZWFkeSBkZWFkLCBjbGVhcmluZyBzZXNzaW9uIHN0YXRlXCIpXG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBtc3NxbC5SZXF1ZXN0KHRoaXMuY29ubmVjdGlvbilcblxuICAgICAgICBhd2FpdCByZXF1ZXN0LnF1ZXJ5KFwiSUYgQEBUUkFOQ09VTlQgPiAwIFJPTExCQUNLXCIpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVTYXZlUG9pbnROYW1lKCkge1xuICAgIHJldHVybiBgc3Ake25ldyBVVUlEKDQpLmZvcm1hdCgpLnJlcGxhY2VBbGwoXCItXCIsIFwiXCIpfWAuc3Vic3RyaW5nKDAsIDMyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXBkYXRlIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlVwZGF0ZVNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHVwZGF0ZVNxbCh7Y29uZGl0aW9ucywgZGF0YSwgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBVcGRhdGUoe2NvbmRpdGlvbnMsIGRhdGEsIGRyaXZlcjogdGhpcywgdGFibGVOYW1lfSlcblxuICAgIHJldHVybiB1cGRhdGUudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXBzZXJ0IHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlVwc2VydFNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHVwc2VydFNxbChhcmdzKSB7XG4gICAgY29uc3QgdXBzZXJ0ID0gbmV3IFVwc2VydCh7Li4uYXJncywgZHJpdmVyOiB0aGlzfSlcblxuICAgIHJldHVybiB1cHNlcnQudG9TcWwoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RydWN0dXJlIHNxbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgc3RydWN0dXJlU3FsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInN0cnVjdHVyZVNxbFwiLCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgU3RydWN0dXJlU3FsKHtkcml2ZXI6IHRoaXN9KS50b1NxbCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCBhIFNRTCBTZXJ2ZXIgYXBwbGljYXRpb24gbG9jayBpcyBhY3F1aXJlZCBvbiB0aGlzXG4gICAqIGNvbm5lY3Rpb24gdmlhIGBzcF9nZXRhcHBsb2NrYC4gVGhlIFNlc3Npb24gbG9jayBvd25lciBzY29wZXMgdGhlIGxvY2tcbiAgICogdG8gdGhlIGN1cnJlbnQgc2Vzc2lvbiwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rpb24tc2NvcGVkIHNlbWFudGljcyBvblxuICAgKiBNeVNRTCBhbmQgUG9zdGdyZVNRTC5cbiAgICpcbiAgICogYHNwX2dldGFwcGxvY2tgIHJldHVybnMgMCBvbiBpbW1lZGlhdGUgZ3JhbnQsIDEgYWZ0ZXIgd2FpdGluZywgYW5kXG4gICAqIG5lZ2F0aXZlIHZhbHVlcyBvbiBmYWlsdXJlICh0aW1lb3V0LCBkZWFkbG9jaywgY2FuY2VsZWQsIHBhcmFtZXRlclxuICAgKiBlcnJvcikuIFdlIHRyZWF0IDAvMSBhcyBzdWNjZXNzIGFuZCAtMSAodGltZW91dCkgYXMgYSBjbGVhbiBgZmFsc2VgO1xuICAgKiBhbnl0aGluZyBlbHNlIHRocm93cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEBwYXJhbSB7e3RpbWVvdXRNcz86IG51bWJlciB8IG51bGx9fSBbYXJnc10gLSBPcHRpb25hbCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kczsgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgbmVnYXRpdmUgYmxvY2tzIGZvcmV2ZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGFjcXVpcmVkLCBmYWxzZSBpZiB0aGUgdGltZW91dCBlbGFwc2VkLlxuICAgKi9cbiAgYXN5bmMgX2FjcXVpcmVBZHZpc29yeUxvY2sobmFtZSwge3RpbWVvdXRNc30gPSB7fSkge1xuICAgIGNvbnN0IHRpbWVvdXRWYWx1ZSA9IHR5cGVvZiB0aW1lb3V0TXMgPT09IFwibnVtYmVyXCIgJiYgdGltZW91dE1zID49IDAgPyBNYXRoLmNlaWwodGltZW91dE1zKSA6IC0xXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuX2Fkdmlzb3J5TG9ja1F1ZXJ5KFxuICAgICAgYERFQ0xBUkUgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBJTlQ7IEVYRUMgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCA9IHNwX2dldGFwcGxvY2sgQFJlc291cmNlID0gJHt0aGlzLnF1b3RlKG5hbWUpfSwgQExvY2tNb2RlID0gJ0V4Y2x1c2l2ZScsIEBMb2NrT3duZXIgPSAnU2Vzc2lvbicsIEBMb2NrVGltZW91dCA9ICR7dGltZW91dFZhbHVlfTsgU0VMRUNUIEB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQgQVMgdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0YFxuICAgIClcbiAgICBjb25zdCByZXN1bHQgPSBOdW1iZXIocm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQpXG5cbiAgICBpZiAocmVzdWx0ID09PSAwIHx8IHJlc3VsdCA9PT0gMSkgcmV0dXJuIHRydWVcblxuICAgIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gLTEpIHJldHVybiBmYWxzZVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBzcF9nZXRhcHBsb2NrIHJldHVybmVkICR7cmVzdWx0fSBmb3IgYWR2aXNvcnkgbG9jayAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSAoc2VlIFNRTCBTZXJ2ZXIgZG9jdW1lbnRhdGlvbiBmb3Igc3BfZ2V0YXBwbG9jayByZXR1cm4gY29kZXMpYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRyeSBhY3F1aXJlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIHRoZSBsb2NrIHdhcyBhY3F1aXJlZCwgZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgaGVsZC5cbiAgICovXG4gIGFzeW5jIF90cnlBY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCB7dGltZW91dE1zOiAwfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGVhc2UgYWR2aXNvcnkgbG9jay5cbiAgICpcbiAgICogYHNwX3JlbGVhc2VhcHBsb2NrYCByZXR1cm5zIDAgd2hlbiB0aGUgbG9jayB3YXMgcmVsZWFzZWQsIGJ1dCBTUUwgU2VydmVyXG4gICAqIHJhaXNlcyBlcnJvciB7QGxpbmsgQVBQTE9DS19OT1RfSEVMRF9FUlJPUl9OVU1CRVJ9IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFcbiAgICogZmFpbHVyZSBjb2RlIHdoZW4gdGhlIHNlc3Npb24gZG9lcyBub3QgY3VycmVudGx5IGhvbGQgdGhlIGxvY2suIFRoYXRcbiAgICogZXJyb3IgYWJvcnRzIHRoZSBiYXRjaCBiZWZvcmUgdGhlIHRyYWlsaW5nIGBTRUxFQ1RgIGNhbiBydW4sIHNvIHdlIGNhdGNoXG4gICAqIGl0IGFuZCByZXNvbHZlIHRvIGBmYWxzZWAgdG8gaG9ub3IgdGhlIGNyb3NzLWRyaXZlciBjb250cmFjdCBmb3IgYW5cbiAgICogYWxyZWFkeS11bmhlbGQgbG9jay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGhlbGQgYnkgdGhpcyBzZXNzaW9uIGFuZCBoYXMgbm93IGJlZW4gcmVsZWFzZWQuXG4gICAqL1xuICBhc3luYyBfcmVsZWFzZUFkdmlzb3J5TG9jayhuYW1lKSB7XG4gICAgbGV0IHJvd3NcblxuICAgIHRyeSB7XG4gICAgICByb3dzID0gYXdhaXQgdGhpcy5fYWR2aXNvcnlMb2NrUXVlcnkoXG4gICAgICAgIGBERUNMQVJFIEB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQgSU5UOyBFWEVDIEB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQgPSBzcF9yZWxlYXNlYXBwbG9jayBAUmVzb3VyY2UgPSAke3RoaXMucXVvdGUobmFtZSl9LCBATG9ja093bmVyID0gJ1Nlc3Npb24nOyBTRUxFQ1QgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgXG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9pc0FwcGxvY2tOb3RIZWxkRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25JZkZpbmFsUmVsZWFzZSgpXG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gTnVtYmVyKHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0KVxuXG4gICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbklmRmluYWxSZWxlYXNlKClcblxuICAgIHJldHVybiByZXN1bHQgPT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFuIGFkdmlzb3J5LWxvY2sgc3RhdGVtZW50IHRocm91Z2ggb25lIHRyYW5zYWN0aW9uIHJlcXVlc3QgcGFyZW50LlxuICAgKiBub2RlLW1zc3FsIHJlc2VydmVzIG9uZSBwaHlzaWNhbCBzZXNzaW9uIGZvciBhIFRyYW5zYWN0aW9uLCB3aGVyZWFzXG4gICAqIHNlcGFyYXRlIENvbm5lY3Rpb25Qb29sIHJlcXVlc3RzIG1heSBjaGVjayBvdXQgZGlmZmVyZW50IHNlc3Npb25zLiBUaGVcbiAgICogdHJhbnNhY3Rpb24gY29udGFpbnMgb25seSBhcHBsaWNhdGlvbi1sb2NrIHN0YXRlbWVudHM7IGNhbGxlci9tb2RlbCB3b3JrXG4gICAqIGNvbnRpbnVlcyB0aHJvdWdoIGl0cyBvcmlnaW5hbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gQWR2aXNvcnktbG9jayBTUUwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBSZXN1bHQgcm93cy5cbiAgICovXG4gIGFzeW5jIF9hZHZpc29yeUxvY2tRdWVyeShzcWwpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuX2Vuc3VyZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKClcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IG1zc3FsLlJlcXVlc3QodHJhbnNhY3Rpb24pXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LnF1ZXJ5KHNxbClcblxuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0LnJlY29yZHNldHMpID8gcmVzdWx0LnJlY29yZHNldHNbMF0gfHwgW10gOiBbXVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZCAnJHtlcnJvci5tZXNzYWdlfSc6ICR7c3FsfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZCAnJHtlcnJvcn0nOiAke3NxbH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IHBhcmVudCB0aGF0IHJlc2VydmVzIHRoZSBhZHZpc29yeS1sb2NrXG4gICAqIHNlc3Npb24gdW50aWwgdGhlIGZpbmFsIHJlbGVhc2Ugb3IgZHJpdmVyIGNsb3NlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJtc3NxbFwiKS5UcmFuc2FjdGlvbj59IC0gU2Vzc2lvbi1hZmZpbmUgcGFyZW50LlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9hZHZpc29yeUxvY2tUcmFuc2FjdGlvbikgcmV0dXJuIHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb24pIHRocm93IG5ldyBFcnJvcihcIk1TU1FMIGNvbm5lY3Rpb24gdW5hdmFpbGFibGUgZm9yIGFkdmlzb3J5IGxvY2tcIilcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IG1zc3FsLlRyYW5zYWN0aW9uKHRoaXMuY29ubmVjdGlvbilcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLmJlZ2luKClcbiAgICB0aGlzLl9hZHZpc29yeUxvY2tUcmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uXG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgcmVzZXJ2ZWQgc2Vzc2lvbiBhZnRlciB0aGUgbGFzdCB0cmFja2VkIGxvY2sgcmVsZWFzZS5cbiAgICogQmFzZSB1bnRyYWNrcyB0aGUgY3VycmVudCByZWxlYXNlIGFmdGVyIHRoZSBkcml2ZXIgaG9vayByZXR1cm5zLCBzbyBhXG4gICAqIGN1cnJlbnQgdG90YWwgb2Ygb25lIG1lYW5zIHRoaXMgaXMgdGhlIGZpbmFsIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIGNsZWFudXAgd2hlbiB0aGlzIGlzIGZpbmFsLlxuICAgKi9cbiAgYXN5bmMgX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25JZkZpbmFsUmVsZWFzZSgpIHtcbiAgICBsZXQgaGVsZENvdW50ID0gMFxuXG4gICAgZm9yIChjb25zdCBjb3VudCBvZiB0aGlzLl9oZWxkQWR2aXNvcnlMb2Nrcy52YWx1ZXMoKSkgaGVsZENvdW50ICs9IGNvdW50XG5cbiAgICBpZiAoaGVsZENvdW50IDw9IDEpIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxzIGJhY2sgdGhlIG90aGVyd2lzZS1lbXB0eSB0cmFuc2FjdGlvbiBhbmQgcmV0dXJucyBpdHMgcGh5c2ljYWxcbiAgICogc2Vzc2lvbiB0byBub2RlLW1zc3FsLiBSb2xsYmFjayBpcyBjbGVhbnVwIG9ubHk7IGFkdmlzb3J5IGxvY2tzIGFyZVxuICAgKiBleHBsaWNpdGx5IHJlbGVhc2VkIGZpcnN0IHdoZW5ldmVyIHRoZWlyIHJlbGVhc2Ugc3RhdGVtZW50IHN1Y2NlZWRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBzZXNzaW9uIGNsZWFudXAuXG4gICAqL1xuICBhc3luYyBfY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uXG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uID0gbnVsbFxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJvbGxiYWNrKClcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIHRoZSBTUUwgU2VydmVyIFwiYXBwbGljYXRpb24gbG9jayBpcyBub3QgY3VycmVudGx5IGhlbGRcIiBlcnJvclxuICAgKiByYWlzZWQgYnkgYHNwX3JlbGVhc2VhcHBsb2NrYC4gSXQgd2Fsa3MgdGhlIHdyYXBwZWQtZXJyb3IgY2F1c2UgY2hhaW5cbiAgICogYmVjYXVzZSBgcXVlcnlgIHJlLXdyYXBzIHRoZSBkcml2ZXIncyBgUmVxdWVzdEVycm9yYCBpbiBhIHBsYWluIGBFcnJvcmAsXG4gICAqIGFuZCBtYXRjaGVzIG9uIHRoZSBzdGFibGUgbnVtZXJpYyBlcnJvciBudW1iZXIgcmF0aGVyIHRoYW4gdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBFcnJvciB0aHJvd24gd2hpbGUgcmVsZWFzaW5nIHRoZSBsb2NrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBlcnJvciBtZWFucyB0aGUgbG9jayB3YXMgbm90IGhlbGQgYnkgdGhpcyBzZXNzaW9uLlxuICAgKi9cbiAgX2lzQXBwbG9ja05vdEhlbGRFcnJvcihlcnJvcikge1xuICAgIGxldCBjdXJyZW50ID0gZXJyb3JcblxuICAgIHdoaWxlIChjdXJyZW50IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTnVtYmVyID0gLyoqIEB0eXBlIHt7bnVtYmVyPzogdW5rbm93bn19ICovIChjdXJyZW50KS5udW1iZXJcblxuICAgICAgaWYgKHR5cGVvZiBlcnJvck51bWJlciA9PT0gXCJudW1iZXJcIiAmJiBlcnJvck51bWJlciA9PT0gQVBQTE9DS19OT1RfSEVMRF9FUlJPUl9OVU1CRVIpIHJldHVybiB0cnVlXG5cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNhdXNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBzZXNzaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgYXBwbGljYXRpb24gbG9jay5cbiAgICpcbiAgICogVGhpcyBjb21iaW5lcyB0d28gcHJvYmVzIGJlY2F1c2UgbmVpdGhlciBpcyBzdWZmaWNpZW50IG9uIGl0cyBvd246XG4gICAqICAgLSBgQVBQTE9DS19NT0RFKC4uLiwgJ1Nlc3Npb24nKWAgb25seSByZXBvcnRzIGxvY2tzIGhlbGQgYnkgdGhlXG4gICAqICAgICAqKmN1cnJlbnQqKiBzZXNzaW9uLCBzbyBpdCBtaXNzZXMgbG9ja3MgaGVsZCBieSBhbnkgb3RoZXJcbiAgICogICAgIHNlc3Npb24gYW5kIHdvdWxkIHJldHVybiBgTm9Mb2NrYCBldmVuIHVuZGVyIGNyb3NzLXNlc3Npb25cbiAgICogICAgIGNvbnRlbnRpb24uXG4gICAqICAgLSBgQVBQTE9DS19URVNUKC4uLiwgJ0V4Y2x1c2l2ZScsICdTZXNzaW9uJylgIHJldHVybnMgd2hldGhlciBhblxuICAgKiAgICAgRXhjbHVzaXZlIGxvY2sgY291bGQgYmUgZ3JhbnRlZCB0byAqdGhpcyogc2Vzc2lvbiByaWdodCBub3cuIEFcbiAgICogICAgIHJldHVybiB2YWx1ZSBvZiAwIG1lYW5zIHNvbWVib2R5IGVsc2UgaG9sZHMgYW4gaW5jb21wYXRpYmxlXG4gICAqICAgICBsb2NrOyBhIHZhbHVlIG9mIDEgbWVhbnMgaXQgaXMgZWl0aGVyIGZyZWUgKipvcioqIGFscmVhZHkgaGVsZFxuICAgKiAgICAgYnkgdXMgcmUtZW50cmFudGx5ICh3aGljaCB0aGUgYEFQUExPQ0tfTU9ERWAgY2hlY2sgY2F0Y2hlcykuXG4gICAqXG4gICAqIFRoZSBjb21iaW5lZCByZXN1bHQgaXMgXCJoZWxkXCIgaWZmIHdlIGhvbGQgaXQgb3Vyc2VsdmVzIG9yXG4gICAqIGBBUFBMT0NLX1RFU1RgIHJlcG9ydHMgd2UgY2Fubm90IGFjcXVpcmUgaXQgd2l0aG91dCB3YWl0aW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiBhbnkgc2Vzc2lvbiBjdXJyZW50bHkgaG9sZHMgdGhlIGxvY2suXG4gICAqL1xuICBhc3luYyBpc0Fkdmlzb3J5TG9ja0hlbGQobmFtZSkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgYFNFTEVDVCBgICtcbiAgICAgICAgYEFQUExPQ0tfTU9ERSgncHVibGljJywgJHt0aGlzLnF1b3RlKG5hbWUpfSwgJ1Nlc3Npb24nKSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfc2VsZl9tb2RlLCBgICtcbiAgICAgICAgYEFQUExPQ0tfVEVTVCgncHVibGljJywgJHt0aGlzLnF1b3RlKG5hbWUpfSwgJ0V4Y2x1c2l2ZScsICdTZXNzaW9uJykgQVMgdmVsb2Npb3VzX2Fkdmlzb3J5X3Rlc3RfcmVzdWx0YFxuICAgIClcbiAgICBjb25zdCBzZWxmTW9kZSA9IHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X3NlbGZfbW9kZVxuICAgIGNvbnN0IGhlbGRCeVNlbGYgPSB0eXBlb2Ygc2VsZk1vZGUgPT09IFwic3RyaW5nXCIgJiYgc2VsZk1vZGUubGVuZ3RoID4gMCAmJiBzZWxmTW9kZSAhPT0gXCJOb0xvY2tcIlxuXG4gICAgaWYgKGhlbGRCeVNlbGYpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCB0ZXN0UmVzdWx0ID0gTnVtYmVyKHJvd3M/LlswXT8udmVsb2Npb3VzX2Fkdmlzb3J5X3Rlc3RfcmVzdWx0KVxuXG4gICAgcmV0dXJuIHRlc3RSZXN1bHQgPT09IDBcbiAgfVxufVxuIl19
|
|
837
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvZHJpdmVycy9tc3NxbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxVQUFVLE1BQU0sc0JBQXNCLENBQUE7QUFDN0MsT0FBTyxJQUFJLE1BQU0sWUFBWSxDQUFBO0FBQzdCLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sV0FBVyxNQUFNLHVCQUF1QixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sWUFBWSxNQUFNLHdCQUF3QixDQUFBO0FBQ2pELE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFDNUMsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFBO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUE7QUFDMUIsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxXQUFXLE1BQU0sdUJBQXVCLENBQUE7QUFDL0MsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUU1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sNkJBQTZC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QUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLDRCQUE0QixDQUFBO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFBO1FBRS9GLElBQUksVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRTNCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFBO1FBRXBFLE9BQU8sVUFBVSxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLDhCQUE4QixDQUFDLElBQUk7UUFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUMzQiwrSkFBK0osSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsTCxDQUFBO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsOEJBQThCLENBQUE7UUFFeEQsT0FBTyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWx0ZXJUYWJsZSBmcm9tIFwiLi9zcWwvYWx0ZXItdGFibGUuanNcIlxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2Jhc2UuanNcIlxuaW1wb3J0IENyZWF0ZURhdGFiYXNlIGZyb20gXCIuL3NxbC9jcmVhdGUtZGF0YWJhc2UuanNcIlxuaW1wb3J0IENyZWF0ZUluZGV4IGZyb20gXCIuL3NxbC9jcmVhdGUtaW5kZXguanNcIlxuaW1wb3J0IENyZWF0ZVRhYmxlIGZyb20gXCIuL3NxbC9jcmVhdGUtdGFibGUuanNcIlxuaW1wb3J0IERlbGV0ZSBmcm9tIFwiLi9zcWwvZGVsZXRlLmpzXCJcbmltcG9ydCBEcm9wRGF0YWJhc2UgZnJvbSBcIi4vc3FsL2Ryb3AtZGF0YWJhc2UuanNcIlxuaW1wb3J0IERyb3BUYWJsZSBmcm9tIFwiLi9zcWwvZHJvcC10YWJsZS5qc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IGVzY2FwZVN0cmluZyBmcm9tIFwic3FsLWVzY2FwZS1zdHJpbmdcIlxuaW1wb3J0IEluc2VydCBmcm9tIFwiLi9zcWwvaW5zZXJ0LmpzXCJcbmltcG9ydCBPcHRpb25zIGZyb20gXCIuL29wdGlvbnMuanNcIlxuaW1wb3J0IG1zc3FsIGZyb20gXCJtc3NxbFwiXG5pbXBvcnQgbmV0IGZyb20gXCJub2RlOm5ldFwiXG5pbXBvcnQgUXVlcnlQYXJzZXIgZnJvbSBcIi4vcXVlcnktcGFyc2VyLmpzXCJcbmltcG9ydCBSZW1vdmVJbmRleCBmcm9tIFwiLi9zcWwvcmVtb3ZlLWluZGV4LmpzXCJcbmltcG9ydCBUYWJsZSBmcm9tIFwiLi90YWJsZS5qc1wiXG5pbXBvcnQgU3RydWN0dXJlU3FsIGZyb20gXCIuL3N0cnVjdHVyZS1zcWwuanNcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IFVwc2VydCBmcm9tIFwiLi9zcWwvdXBzZXJ0LmpzXCJcbmltcG9ydCBVcGRhdGUgZnJvbSBcIi4vc3FsL3VwZGF0ZS5qc1wiXG5pbXBvcnQgVVVJRCBmcm9tIFwicHVyZS11dWlkXCJcblxuLyoqXG4gKiBTUUwgU2VydmVyIGVycm9yIG51bWJlciByYWlzZWQgYnkgYHNwX3JlbGVhc2VhcHBsb2NrYCB3aGVuIHRoZSBjdXJyZW50XG4gKiBzZXNzaW9uIGRvZXMgbm90IGhvbGQgdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBsb2NrLiBSZWxlYXNpbmcgYSBsb2NrIHRoZVxuICogc2Vzc2lvbiBubyBsb25nZXIgaG9sZHMgaXMgYSBub3JtYWwgcmFjZSAoYSBzaGFyZWQgY29ubmVjdGlvbidzIGZpbmFsXG4gKiBjaGVjay1pbiBtYXkgYWxyZWFkeSBoYXZlIGF1dG8tcmVsZWFzZWQgaXQpLCB3aGljaCB0aGUgY3Jvc3MtZHJpdmVyXG4gKiBgcmVsZWFzZUFkdmlzb3J5TG9ja2AgY29udHJhY3QgbW9kZWxzIGJ5IHJlc29sdmluZyB0byBgZmFsc2VgLiBXZSB0cmFuc2xhdGVcbiAqIHRoaXMgc3BlY2lmaWMgZXJyb3IgaW50byB0aGF0IHJlc3VsdCByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGVzY2FwZS5cbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IEFQUExPQ0tfTk9UX0hFTERfRVJST1JfTlVNQkVSID0gMTIyM1xuY29uc3QgRElTQUJMRV9GT1JFSUdOX0tFWVNfU1FMID0gXCJFWEVDIHNwX01TZm9yZWFjaHRhYmxlIFxcXCJBTFRFUiBUQUJMRSA/IE5PQ0hFQ0sgQ09OU1RSQUlOVCBhbGxcXFwiXCJcbmNvbnN0IEVOQUJMRV9GT1JFSUdOX0tFWVNfU1FMID0gXCJFWEVDIHNwX01TZm9yZWFjaHRhYmxlIEBjb21tYW5kMT1cXFwicHJpbnQgJz8nXFxcIiwgQGNvbW1hbmQyPVxcXCJBTFRFUiBUQUJMRSA/IFdJVEggQ0hFQ0sgQ0hFQ0sgQ09OU1RSQUlOVCBhbGxcXFwiXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzTXNzcWwgZXh0ZW5kcyBCYXNle1xuICAvKiogQHR5cGUge2ltcG9ydChcIm1zc3FsXCIpLlRyYW5zYWN0aW9uIHwgbnVsbH0gKi9cbiAgX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uID0gbnVsbFxuXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZ2V0QXJncygpXG4gICAgY29uc3Qgc3FsQ29uZmlnID0gZGlnZyhhcmdzLCBcInNxbENvbmZpZ1wiKVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24pIGF3YWl0IHRoaXMuY2xvc2UoKVxuXG4gICAgICBpZiAoc3FsQ29uZmlnKSB7XG4gICAgICAgIHNxbENvbmZpZy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgc3FsQ29uZmlnLm9wdGlvbnMsIHt1c2VVVEM6IHRydWV9KVxuICAgICAgfVxuXG4gICAgICBpZiAoc3FsQ29uZmlnPy5zZXJ2ZXIgJiYgIXNxbENvbmZpZy5vcHRpb25zPy5zZXJ2ZXJOYW1lICYmIG5ldC5pc0lQKHNxbENvbmZpZy5zZXJ2ZXIpKSB7XG4gICAgICAgIHNxbENvbmZpZy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgc3FsQ29uZmlnLm9wdGlvbnMsIHtzZXJ2ZXJOYW1lOiBcIlwifSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb25uZWN0aW9uID0gbmV3IG1zc3FsLkNvbm5lY3Rpb25Qb29sKHNxbENvbmZpZylcbiAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5jb25uZWN0KClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUmUtdGhyb3cgdG8gZml4IHVudXNlYWJsZSBzdGFjayB0cmFjZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgY29ubmVjdCB0byBkYXRhYmFzZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9jbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgcmV0dXJuXG5cbiAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9uXG4gICAgdGhpcy5jb25uZWN0aW9uID0gdW5kZWZpbmVkXG4gICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgIHRoaXMuX3RyYW5zYWN0aW9uc0NvdW50ID0gMFxuICAgIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHNlc3Npb25FcnJvclxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzZXNzaW9uRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY2xvc2UgTVNTUUwgYWR2aXNvcnktbG9jayBzZXNzaW9uXCIsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAyMDAwfSwgKCkgPT4gY29ubmVjdGlvbi5jbG9zZSgpKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiRmFpbGVkIHRvIGNsb3NlIE1TU1FMIGNvbm5lY3Rpb24gY2xlYW5seVwiLCB7ZXJyb3J9KVxuICAgIH1cblxuICAgIGlmIChzZXNzaW9uRXJyb3IpIHRocm93IHNlc3Npb25FcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWx0ZXIgdGFibGUgc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi90YWJsZS1kYXRhL2luZGV4LmpzXCIpLmRlZmF1bHR9IHRhYmxlRGF0YSAtIFRhYmxlIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSB7XG4gICAgY29uc3QgYWx0ZXJBcmdzID0ge3RhYmxlRGF0YSwgZHJpdmVyOiB0aGlzfVxuICAgIGNvbnN0IGFsdGVyVGFibGUgPSBuZXcgQWx0ZXJUYWJsZShhbHRlckFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgYWx0ZXJUYWJsZS50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIGRhdGFiYXNlIHNxbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlTmFtZSAtIERhdGFiYXNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pZk5vdEV4aXN0c10gLSBXaGV0aGVyIGlmIG5vdCBleGlzdHMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGNyZWF0ZURhdGFiYXNlU3FsKGRhdGFiYXNlTmFtZSwgYXJncykge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkYXRhYmFzZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgY3JlYXRlRGF0YWJhc2UgPSBuZXcgQ3JlYXRlRGF0YWJhc2UoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBjcmVhdGVEYXRhYmFzZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIGRhdGFiYXNlIHNxbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlTmFtZSAtIERhdGFiYXNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pZkV4aXN0c10gLSBXaGV0aGVyIGlmIGV4aXN0cy5cbiAgICogQHJldHVybnMge3N0cmluZ1tdfSAtIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgZHJvcERhdGFiYXNlU3FsKGRhdGFiYXNlTmFtZSwgYXJncykge1xuICAgIGNvbnN0IGRyb3BBcmdzID0gT2JqZWN0LmFzc2lnbih7ZGF0YWJhc2VOYW1lLCBkcml2ZXI6IHRoaXN9LCBhcmdzKVxuICAgIGNvbnN0IGRyb3BEYXRhYmFzZSA9IG5ldyBEcm9wRGF0YWJhc2UoZHJvcEFyZ3MpXG5cbiAgICByZXR1cm4gZHJvcERhdGFiYXNlLnRvU3FsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSBpbmRleCBzcWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuQ3JlYXRlSW5kZXhTcWxBcmdzfSBpbmRleERhdGEgLSBJbmRleCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUluZGV4U1FMcyhpbmRleERhdGEpIHtcbiAgICBjb25zdCBjcmVhdGVBcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJpdmVyOiB0aGlzfSwgaW5kZXhEYXRhKVxuICAgIGNvbnN0IGNyZWF0ZUluZGV4ID0gbmV3IENyZWF0ZUluZGV4KGNyZWF0ZUFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlSW5kZXgudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBpbmRleCBzcWxzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUmVtb3ZlSW5kZXhTcWxBcmdzfSBpbmRleERhdGEgLSBJbmRleCBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUluZGV4U1FMcyhpbmRleERhdGEpIHtcbiAgICBjb25zdCByZW1vdmVBcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJpdmVyOiB0aGlzfSwgaW5kZXhEYXRhKVxuICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gbmV3IFJlbW92ZUluZGV4KHJlbW92ZUFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgcmVtb3ZlSW5kZXgudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSB0YWJsZSBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiKS5kZWZhdWx0fSB0YWJsZURhdGEgLSBUYWJsZSBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlU3FsKHRhYmxlRGF0YSkge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSB7dGFibGVEYXRhLCBkcml2ZXI6IHRoaXMsIGluZGV4SW5DcmVhdGVUYWJsZTogZmFsc2V9XG4gICAgY29uc3QgY3JlYXRlVGFibGUgPSBuZXcgQ3JlYXRlVGFibGUoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBhd2FpdCBjcmVhdGVUYWJsZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjdXJyZW50IGRhdGFiYXNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFJlc29sdmVzIHdpdGggdGhlIGN1cnJlbnQgZGF0YWJhc2UuXG4gICAqL1xuICBhc3luYyBjdXJyZW50RGF0YWJhc2UoKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgREJfTkFNRSgpIEFTIGRiX25hbWVcIilcblxuICAgIHJldHVybiBkaWdnKHJvd3MsIDAsIFwiZGJfbmFtZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIGV2ZXJ5IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgKGJ1bGsgYE5PQ0hFQ0tgKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBmb3JlaWduIGtleXMgYXJlIGRpc2FibGVkLlxuICAgKi9cbiAgYXN5bmMgZGlzYWJsZUZvcmVpZ25LZXlzKCkge1xuICAgIGF3YWl0IHRoaXMuX2V4ZWNDb25zdHJhaW50VG9nZ2xlKERJU0FCTEVfRk9SRUlHTl9LRVlTX1NRTCwgXCJkaXNhYmxlRm9yZWlnbktleXNcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1lbmFibGVzIGFuZCByZS12YWxpZGF0ZXMgZXZlcnkgZm9yZWlnbiBrZXkgY29uc3RyYWludCAoYFdJVEggQ0hFQ0tgKS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBmb3JlaWduIGtleXMgYXJlIGVuYWJsZWQuXG4gICAqL1xuICBhc3luYyBlbmFibGVGb3JlaWduS2V5cygpIHtcbiAgICBhd2FpdCB0aGlzLl9leGVjQ29uc3RyYWludFRvZ2dsZShFTkFCTEVfRk9SRUlHTl9LRVlTX1NRTCwgXCJlbmFibGVGb3JlaWduS2V5c1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIGNvbnN0cmFpbnQtdG9nZ2xlIHN0YXRlbWVudC4gYEFMVEVSIFRBQkxFIC4uLiBOT0NIRUNLL0NIRUNLXG4gICAqIENPTlNUUkFJTlRgIG5lZWRzIGEgc2NoZW1hLW1vZGlmaWNhdGlvbiBsb2NrIG9uIGV2ZXJ5IHRhYmxlLCBzbyBpZiB0aGVcbiAgICogcmVxdWVzdCB0aW1lcyBvdXQgaXQgaXMgYWxtb3N0IGFsd2F5cyBibG9ja2VkIGJ5IGFub3RoZXIgc2Vzc2lvbiB0aGF0IGlzXG4gICAqIHN0aWxsIGhvbGRpbmcgYSBsb2NrIChhIGxlYWtlZC91bmNvbW1pdHRlZCBjb25uZWN0aW9uKS4gT24gYSB0aW1lb3V0LFxuICAgKiBjYXB0dXJlIHdoaWNoIHNlc3Npb25zIHdlcmUgYmxvY2tpbmcgc28gdGhlIHJlYWwgY3VscHJpdCBpcyBuYW1lZCBpbnN0ZWFkXG4gICAqIG9mIGxlYXZpbmcgYSBiYXJlIFwiUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUgaW4gMTUwMDBtc1wiLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gQ29uc3RyYWludC10b2dnbGUgU1FMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBPcGVyYXRpb24gbGFiZWwgZm9yIHRoZSBlcnJvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgdG9nZ2xlIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIF9leGVjQ29uc3RyYWludFRvZ2dsZShzcWwsIGxhYmVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoc3FsKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAvVGltZW91dDogUmVxdWVzdCBmYWlsZWQgdG8gY29tcGxldGUvaS50ZXN0KGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGhpcy5fY2FwdHVyZUJsb2NraW5nU2Vzc2lvbnNGb3JEZWJ1ZygpLmNhdGNoKFxuICAgICAgICAgIChkaWFnRXJyb3IpID0+IGAoYmxvY2tpbmcgZGlhZ25vc3RpY3MgcXVlcnkgZmFpbGVkOiAke2RpYWdFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZGlhZ0Vycm9yLm1lc3NhZ2UgOiBkaWFnRXJyb3J9KWBcbiAgICAgICAgKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlcnJvci5tZXNzYWdlfVxcblxcblske2xhYmVsfSBibG9ja2VkXSBvdGhlciB1c2VyIHNlc3Npb25zIHdpdGggb3BlbiB0cmFuc2FjdGlvbnMgb3IgYWN0aXZlIHJlcXVlc3RzOlxcbiR7c25hcHNob3R9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90cyB0aGUgc2Vzc2lvbnMgdGhhdCBjb3VsZCBiZSBibG9ja2luZyBhIGNvbnN0cmFpbnQgdG9nZ2xlIGluIFRISVNcbiAgICogZGF0YWJhc2Ug4oCUIGV2ZXJ5IHNlc3Npb24gb3RoZXIgdGhhbiB0aGlzIG9uZSB0aGF0IGhvbGRzIGEgbG9jayBpbiBgREJfSUQoKWBcbiAgICogb3IgaXMgcnVubmluZyBhIHJlcXVlc3QgYWdhaW5zdCBpdCDigJQgd2l0aCBpdHMgbGFzdCBzdGF0ZW1lbnQsIHdhaXQgc3RhdGUsXG4gICAqIGFuZCBibG9ja2luZyBzZXNzaW9uLCBlbm91Z2ggdG8gaWRlbnRpZnkgYSBjb25uZWN0aW9uIHRoYXQgbGVha2VkIGEgbG9jay5cbiAgICogU2NvcGVkIHRvIHRoZSBjdXJyZW50IGRhdGFiYXNlIHNvIGEgbXVsdGktZGF0YWJhc2Ugc2VydmVyIGRvZXMgbm90IGxlYWtcbiAgICogdW5yZWxhdGVkIHNlc3Npb25zJyBTUUwgaW50byB0aGUgZXJyb3IgYW5kIGJ1cnkgdGhlIHJlYWwgYmxvY2tlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKU09OIHNuYXBzaG90LCBvciBhIFwiKG5vbmUpXCIgbWFya2VyLlxuICAgKi9cbiAgYXN5bmMgX2NhcHR1cmVCbG9ja2luZ1Nlc3Npb25zRm9yRGVidWcoKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoYFxuICAgICAgV0lUSCBsb2NrX3Nlc3Npb25zIEFTIChcbiAgICAgICAgU0VMRUNUIERJU1RJTkNUIHJlcXVlc3Rfc2Vzc2lvbl9pZCBBUyBzZXNzaW9uX2lkXG4gICAgICAgIEZST00gc3lzLmRtX3RyYW5fbG9ja3NcbiAgICAgICAgV0hFUkUgcmVzb3VyY2VfZGF0YWJhc2VfaWQgPSBEQl9JRCgpXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgcy5zZXNzaW9uX2lkIEFTIHNlc3Npb25JZCxcbiAgICAgICAgcy5zdGF0dXMgQVMgc2Vzc2lvblN0YXR1cyxcbiAgICAgICAgcy5sb2dpbl90aW1lIEFTIGxvZ2luVGltZSxcbiAgICAgICAgcy5sYXN0X3JlcXVlc3Rfc3RhcnRfdGltZSBBUyBsYXN0UmVxdWVzdFN0YXJ0LFxuICAgICAgICBzLmxhc3RfcmVxdWVzdF9lbmRfdGltZSBBUyBsYXN0UmVxdWVzdEVuZCxcbiAgICAgICAgcy5vcGVuX3RyYW5zYWN0aW9uX2NvdW50IEFTIG9wZW5UcmFuc2FjdGlvbkNvdW50LFxuICAgICAgICByLnN0YXR1cyBBUyByZXF1ZXN0U3RhdHVzLFxuICAgICAgICByLmNvbW1hbmQgQVMgY29tbWFuZCxcbiAgICAgICAgci53YWl0X3R5cGUgQVMgd2FpdFR5cGUsXG4gICAgICAgIHIud2FpdF90aW1lIEFTIHdhaXRUaW1lTXMsXG4gICAgICAgIHIuYmxvY2tpbmdfc2Vzc2lvbl9pZCBBUyBibG9ja2luZ1Nlc3Npb25JZCxcbiAgICAgICAgQ0FTVChpYi5ldmVudF9pbmZvIEFTIE5WQVJDSEFSKE1BWCkpIEFTIGxhc3RTcWxcbiAgICAgIEZST00gc3lzLmRtX2V4ZWNfc2Vzc2lvbnMgc1xuICAgICAgTEVGVCBKT0lOIHN5cy5kbV9leGVjX3JlcXVlc3RzIHIgT04gci5zZXNzaW9uX2lkID0gcy5zZXNzaW9uX2lkXG4gICAgICBPVVRFUiBBUFBMWSBzeXMuZG1fZXhlY19pbnB1dF9idWZmZXIocy5zZXNzaW9uX2lkLCBOVUxMKSBpYlxuICAgICAgV0hFUkUgcy5pc191c2VyX3Byb2Nlc3MgPSAxXG4gICAgICAgIEFORCBzLnNlc3Npb25faWQgPD4gQEBTUElEXG4gICAgICAgIEFORCAocy5zZXNzaW9uX2lkIElOIChTRUxFQ1Qgc2Vzc2lvbl9pZCBGUk9NIGxvY2tfc2Vzc2lvbnMpIE9SIHIuZGF0YWJhc2VfaWQgPSBEQl9JRCgpKVxuICAgIGApXG5cbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBcIihub25lIOKAlCBubyBvdGhlciBzZXNzaW9uIGhlbGQgYSBsb2NrIG9yIHJhbiBhIHJlcXVlc3QgaW4gdGhpcyBkYXRhYmFzZSB3aGVuIHF1ZXJpZWQpXCJcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyb3dzLCBudWxsLCAyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZSBzcWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkRyb3BUYWJsZVNxbEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGVTUUxzKHRhYmxlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZHJvcEFyZ3MgPSBPYmplY3QuYXNzaWduKHt0YWJsZU5hbWUsIGRyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgZHJvcFRhYmxlID0gbmV3IERyb3BUYWJsZShkcm9wQXJncylcblxuICAgIHJldHVybiBhd2FpdCBkcm9wVGFibGUudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgdGhhdCByZWZlcmVuY2UgdGhlIGdpdmVuIHRhYmxlLiBNU1NRTFxuICAgKiByZWZ1c2VzIHRvIGRyb3AgYSB0YWJsZSB0aGF0IGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgYSBGT1JFSUdOIEtFWVxuICAgKiBjb25zdHJhaW50IGV2ZW4gd2hlbiBjb25zdHJhaW50cyBhcmUgZGlzYWJsZWQgdmlhIE5PQ0hFQ0ssIHNvIHRoZVxuICAgKiByZWZlcmVuY2luZyBjb25zdHJhaW50cyBtdXN0IGJlIHJlbW92ZWQgYmVmb3JlIHRoZSB0YWJsZSBjYW4gYmUgZHJvcHBlZC5cbiAgICogVGhpcyBsZXRzIGNhbGxlcnMgZHJvcCB0YWJsZXMgaW4gYW55IG9yZGVyIChlLmcuIHdpcGluZyBhIHdob2xlIHNjaGVtYSlcbiAgICogd2l0aG91dCBmaXJzdCBkcm9wcGluZyBldmVyeSBkZXBlbmRlbnQgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Ryb3BSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzKHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgXCJTRUxFQ1QgZmsubmFtZSBBUyBjb25zdHJhaW50X25hbWUsIE9CSkVDVF9OQU1FKGZrLnBhcmVudF9vYmplY3RfaWQpIEFTIHBhcmVudF90YWJsZSBcIiArXG4gICAgICBgRlJPTSBzeXMuZm9yZWlnbl9rZXlzIGZrIFdIRVJFIGZrLnJlZmVyZW5jZWRfb2JqZWN0X2lkID0gT0JKRUNUX0lEKCR7dGhpcy5xdW90ZSh0YWJsZU5hbWUpfSlgXG4gICAgKVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgY29uc3RyYWludE5hbWUgPSByb3cuY29uc3RyYWludF9uYW1lID8/IHJvdy5DT05TVFJBSU5UX05BTUVcbiAgICAgIGNvbnN0IHBhcmVudFRhYmxlID0gcm93LnBhcmVudF90YWJsZSA/PyByb3cuUEFSRU5UX1RBQkxFXG5cbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoYEFMVEVSIFRBQkxFIFske3BhcmVudFRhYmxlfV0gRFJPUCBDT05TVFJBSU5UIFske2NvbnN0cmFpbnROYW1lfV1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRyb3AgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuRHJvcFRhYmxlU3FsQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZHJvcFRhYmxlKHRhYmxlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90UmVhZE9ubHkoKVxuICAgIGF3YWl0IHRoaXMuX2Ryb3BSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzKHRhYmxlTmFtZSlcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmRyb3BUYWJsZVNRTHModGFibGVOYW1lLCBhcmdzKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHR5cGUuXG4gICAqL1xuICBnZXRUeXBlKCkgeyByZXR1cm4gXCJtc3NxbFwiIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBhY3R1YWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zfSBbb3B0aW9uc10gLSBRdWVyeSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5UmVzdWx0VHlwZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcXVlcnkgYWN0dWFsLlxuICAgKi9cbiAgYXN5bmMgX3F1ZXJ5QWN0dWFsKHNxbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGxldCB0cmllcyA9IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cmllcysrXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gb3B0aW9ucy5yZXF1ZXN0VGltZW91dE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDoge3JlcXVlc3RUaW1lb3V0OiBvcHRpb25zLnJlcXVlc3RUaW1lb3V0TXN9XG4gICAgICAgIC8vIG5vZGUtbXNzcWwgc3VwcG9ydHMgcmVxdWVzdC1sb2NhbCBvdmVycmlkZXMsIGJ1dCBpdHMgRGVmaW5pdGVseVR5cGVkXG4gICAgICAgIC8vIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uIHN0aWxsIGV4cG9zZXMgb25seSB0aGUgbGVnYWN5IGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdE9wdGlvbnNcbiAgICAgICAgICA/IFJlZmxlY3QuY29uc3RydWN0KG1zc3FsLlJlcXVlc3QsIFt0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24gfHwgdGhpcy5jb25uZWN0aW9uLCByZXF1ZXN0T3B0aW9uc10pXG4gICAgICAgICAgOiB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb25cbiAgICAgICAgICAgID8gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5fY3VycmVudFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgOiBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLmNvbm5lY3Rpb24pXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QucXVlcnkoc3FsKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZSA9PSBcIk5vIGNvbm5lY3Rpb24gaXMgc3BlY2lmaWVkIGZvciB0aGF0IHJlcXVlc3QuXCIgJiYgdHJpZXMgPD0gMykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJSZWNvbm5lY3RpbmcgdG8gZGF0YWJhc2VcIilcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlY29ubmVjdCgpXG4gICAgICAgICAgLy8gUmV0cnlcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgLy8gUmUtdGhyb3cgZXJyb3IgYmVjYXVzZSB0aGUgc3RhY2stdHJhY2UgaXMgYnJva2VuIGFuZCBjYW4ndCBiZSB1c2VkIGZvciBhcHAtZGV2ZWxvcG1lbnQuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBmYWlsZWQgJyR7ZXJyb3IubWVzc2FnZX0nOiAke3NxbH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1ZXJ5IGZhaWxlZCAnJHtlcnJvcn0nOiAke3NxbH1gLCB7Y2F1c2U6IGVycm9yfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3VsdC5yZWNvcmRzZXRzKSA/IHJlc3VsdC5yZWNvcmRzZXRzWzBdIHx8IFtdIDogW11cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIG11dGF0aW9uIHdpdGggYWZmZWN0ZWQtcm93IG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsIC0gTXV0YXRpb24gU1FMLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIEFmZmVjdGVkIHJvdyBjb3VudC5cbiAgICovXG4gIGFzeW5jIF9hZmZlY3RlZFJvd3NBY3R1YWwoc3FsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvblxuICAgICAgPyBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24pXG4gICAgICA6IG5ldyBtc3NxbC5SZXF1ZXN0KHRoaXMuY29ubmVjdGlvbilcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXF1ZXN0LnF1ZXJ5KHNxbClcbiAgICByZXR1cm4gcmVzdWx0LnJvd3NBZmZlY3RlZC5yZWR1Y2UoKHRvdGFsLCBjb3VudCkgPT4gdG90YWwgKyBjb3VudCwgMClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1ZXJ5IHRvIHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9xdWVyeS9pbmRleC5qc1wiKS5kZWZhdWx0fSBxdWVyeSAtIFF1ZXJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBxdWVyeVRvU3FsKHF1ZXJ5KSB7IHJldHVybiBuZXcgUXVlcnlQYXJzZXIoe3F1ZXJ5fSkudG9TcWwoKSB9XG5cbiAgc2hvdWxkU2V0QXV0b0luY3JlbWVudFdoZW5QcmltYXJ5S2V5KCkgeyByZXR1cm4gdHJ1ZSB9XG4gIHN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEKCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gZXhwbGljaXQgcHJpbWFyeS1rZXkgaW5zZXJ0IGFzIG9uZSBiYXRjaCByZXF1ZXN0OiBTUUwgU2VydmVyIHNjb3Blc1xuICAgKiBJREVOVElUWV9JTlNFUlQgdG8gdGhlIHNlc3Npb24sIGFuZCBub2RlLW1zc3FsIHBvb2wtYmFja2VkIHJlcXVlc3RzIG1heSB1c2VcbiAgICogYSBkaWZmZXJlbnQgcGh5c2ljYWwgc2Vzc2lvbiBwZXIgcXVlcnksIHNvIGVuYWJsaW5nIGl0IGluIGEgc2VwYXJhdGUgcXVlcnlcbiAgICogY2FuIGxlYXZlIHRoZSBhY3R1YWwgSU5TRVJUIG9uIGFub3RoZXIgc2Vzc2lvbi4gQSBzaW5nbGUgYmF0Y2gga2VlcHMgdGhlXG4gICAqIHdob2xlIHNlcXVlbmNlIG9uIG9uZSBzZXNzaW9uIGJ5IGNvbnN0cnVjdGlvbjogZW5hYmxlLCBpbnNlcnQsIGRpc2FibGUgb25cbiAgICogc3VjY2VzcywgYW5kIGEgQ0FUQ0ggdGhhdCBkaXNhYmxlcyBhbmQgcmV0aHJvd3MgdGhlIG9yaWdpbmFsIGVycm9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlPcHRpb25zfSBhcmdzLm9wdGlvbnMgLSBRdWVyeSBvcHRpb25zIGZvciB0aGUgc3RhbmRhcmQgcXVlcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3FsIC0gR2VuZXJhdGVkIGluc2VydCBTUUwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhYmxlTmFtZSAtIFRhYmxlIGJlaW5nIGluc2VydGVkIGludG8uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBJbnNlcnQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0V2l0aEV4cGxpY2l0UHJpbWFyeUtleSh7b3B0aW9ucywgc3FsLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgcXVvdGVkVGFibGUgPSB0aGlzLnF1b3RlVGFibGUodGFibGVOYW1lKVxuICAgIGNvbnN0IGJhdGNoID0gW1xuICAgICAgYFNFVCBJREVOVElUWV9JTlNFUlQgJHtxdW90ZWRUYWJsZX0gT047YCxcbiAgICAgIFwiQkVHSU4gVFJZXCIsXG4gICAgICBgJHtzcWx9O2AsXG4gICAgICBgU0VUIElERU5USVRZX0lOU0VSVCAke3F1b3RlZFRhYmxlfSBPRkY7YCxcbiAgICAgIFwiRU5EIFRSWVwiLFxuICAgICAgXCJCRUdJTiBDQVRDSFwiLFxuICAgICAgYFNFVCBJREVOVElUWV9JTlNFUlQgJHtxdW90ZWRUYWJsZX0gT0ZGO2AsXG4gICAgICBcIlRIUk9XO1wiLFxuICAgICAgXCJFTkQgQ0FUQ0hcIlxuICAgIF0uam9pbihcIlxcblwiKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnkoYmF0Y2gsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBlc2NhcGUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBlc2NhcGUuXG4gICAqL1xuICBlc2NhcGUodmFsdWUpIHtcbiAgICB2YWx1ZSA9IHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSlcbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiBgJHt2YWx1ZX1gXG5cbiAgICBjb25zdCByZXN1bHRXaXRoUXVvdGVzID0gZXNjYXBlU3RyaW5nKHN0cmluZ1ZhbHVlLCBudWxsKVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdFdpdGhRdW90ZXMuc3Vic3RyaW5nKDEsIHJlc3VsdFdpdGhRdW90ZXMubGVuZ3RoIC0gMSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1b3RlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlcn0gLSBUaGUgcXVvdGVkIHZhbHVlLlxuICAgKi9cbiAgcXVvdGUodmFsdWUpIHtcbiAgICB2YWx1ZSA9IHRoaXMuX2NvbnZlcnRWYWx1ZSh2YWx1ZSlcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlXG4gICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKVxuXG4gICAgcmV0dXJuIGBOJHtlc2NhcGVTdHJpbmcoc3RyaW5nVmFsdWUsIG51bGwpfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1b3RlIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcXVvdGUgY29sdW1uLlxuICAgKi9cbiAgcXVvdGVDb2x1bW4oY29sdW1uTmFtZSkgeyByZXR1cm4gdGhpcy5vcHRpb25zKCkucXVvdGVDb2x1bW5OYW1lKGNvbHVtbk5hbWUpIH1cblxuICAvKipcbiAgICogUnVucyBxdW90ZSB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIFN0cmluZy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcXVvdGUgdGFibGUuXG4gICAqL1xuICBxdW90ZVRhYmxlKHN0cmluZykgeyByZXR1cm4gdGhpcy5vcHRpb25zKCkucXVvdGVUYWJsZU5hbWUoc3RyaW5nKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVuYW1lIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDb2x1bW5OYW1lIC0gUHJldmlvdXMgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDb2x1bW5OYW1lIC0gTmV3IGNvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoYEVYRUMgc3BfcmVuYW1lICR7dGhpcy5xdW90ZShgJHt0YWJsZU5hbWV9LiR7b2xkQ29sdW1uTmFtZX1gKX0sICR7dGhpcy5xdW90ZShuZXdDb2x1bW5OYW1lKX0sICdDT0xVTU4nYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGV0ZSBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5EZWxldGVTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBkZWxldGVTcWwoe3RhYmxlTmFtZSwgY29uZGl0aW9uc30pIHtcbiAgICBjb25zdCBkZWxldGVJbnN0cnVjdGlvbiA9IG5ldyBEZWxldGUoe2NvbmRpdGlvbnMsIGRyaXZlcjogdGhpcywgdGFibGVOYW1lfSlcblxuICAgIHJldHVybiBkZWxldGVJbnN0cnVjdGlvbi50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbnNlcnQgc3FsLlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkluc2VydFNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIGluc2VydFNxbChhcmdzKSB7XG4gICAgY29uc3QgaW5zZXJ0QXJncyA9IE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGFyZ3MpXG4gICAgY29uc3QgaW5zZXJ0ID0gbmV3IEluc2VydChpbnNlcnRBcmdzKVxuXG4gICAgcmV0dXJuIGluc2VydC50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgdGFibGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB0YWJsZXMuXG4gICAqL1xuICBhc3luYyBnZXRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NhY2hlZFNjaGVtYU1ldGFkYXRhKFwidGFibGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0QXJncygpPy5zY2hlbWEgfHwgdGhpcy5nZXRBcmdzKCk/LnNxbENvbmZpZz8ub3B0aW9ucz8uc2NoZW1hXG4gICAgICBjb25zdCBzY2hlbWFDbGF1c2UgPSBzY2hlbWFcbiAgICAgICAgPyBgIEFORCBbVEFCTEVfU0NIRU1BXSA9ICR7dGhpcy5xdW90ZShzY2hlbWEpfWBcbiAgICAgICAgOiBcIiBBTkQgW1RBQkxFX1NDSEVNQV0gPSBTQ0hFTUFfTkFNRSgpXCJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoYFNFTEVDVCBbVEFCTEVfTkFNRV0gRlJPTSBbSU5GT1JNQVRJT05fU0NIRU1BXS5bVEFCTEVTXSBXSEVSRSBbVEFCTEVfQ0FUQUxPR10gPSBEQl9OQU1FKCkke3NjaGVtYUNsYXVzZX1gKVxuICAgICAgY29uc3QgdGFibGVzID0gW11cblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKHJvdykpXG5cbiAgICAgICAgdGFibGVzLnB1c2godGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZXNcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEtlZXBzIGNvbnN0cmFpbnQgdG9nZ2xlcyBhbmQgY2xlYW51cCBpbnNpZGUgZWFjaCBwaHlzaWNhbCBTUUwgU2VydmVyXG4gICAqIHJlcXVlc3Qgc28gYSBwb29sIGNhbm5vdCBzcGxpdCBsaWZlY3ljbGUgb3duZXJzaGlwIGFjcm9zcyBzZXNzaW9ucy5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4uL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdD59IHRhYmxlcyAtIEVsaWdpYmxlIHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgb25lIGNsZWFudXAgYXR0ZW1wdCBzdWNjZWVkcy5cbiAgICovXG4gIGFzeW5jIF90cnVuY2F0ZUFsbFRhYmxlcyh0YWJsZXMpIHtcbiAgICBhd2FpdCB0aGlzLl90cnVuY2F0ZUFsbFRhYmxlc1dpdGhSZXRyaWVzKHRhYmxlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uZSBmYWlsLWxvdWQgY2xlYW51cCBiYXRjaCB3aXRoIHJlc3RvcmF0aW9uIG9uIGJvdGggc3VjY2VzcyBhbmRcbiAgICogZmFpbHVyZS4gVGhlIG91dGVyIHJldHJ5IG93bmVyIHJlZnJlc2hlcyBzdGFsZSB0YWJsZSBzbmFwc2hvdHMuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+fSB0YWJsZXMgLSBDdXJyZW50IGVsaWdpYmxlIHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGJhdGNoIGNvbXBsZXRlcy5cbiAgICovXG4gIGFzeW5jIF90cnVuY2F0ZUFsbFRhYmxlc0F0dGVtcHQodGFibGVzKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IFtcbiAgICAgIFwiQkVHSU4gVFJZXCIsXG4gICAgICBgICAke0RJU0FCTEVfRk9SRUlHTl9LRVlTX1NRTH07YCxcbiAgICAgIC4uLnRoaXMuX3RydW5jYXRlVGFibGVTdGF0ZW1lbnRzKHRhYmxlcyksXG4gICAgICBgICAke0VOQUJMRV9GT1JFSUdOX0tFWVNfU1FMfTtgLFxuICAgICAgXCJFTkQgVFJZXCIsXG4gICAgICBcIkJFR0lOIENBVENIXCIsXG4gICAgICBgICAke0VOQUJMRV9GT1JFSUdOX0tFWVNfU1FMfTtgLFxuICAgICAgXCIgIFRIUk9XO1wiLFxuICAgICAgXCJFTkQgQ0FUQ0g7XCJcbiAgICBdXG5cbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KHN0YXRlbWVudHMuam9pbihcIlxcblwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZXMgYWxsIGVsaWdpYmxlIHRhYmxlcyBpbiBvbmUgU1FMIFNlcnZlciByZXF1ZXN0LCByZXRhaW5pbmcgdGhlXG4gICAqIHJlY29nbml6ZWQgZm9yZWlnbi1rZXkgZmFsbGJhY2sgdXNlZCBieSB0aGUgcGVyLXRhYmxlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge0FycmF5PGltcG9ydChcIi4uL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdD59IHRhYmxlcyAtIEVsaWdpYmxlIHRhYmxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiB0aGUgYmF0Y2ggY29tcGxldGVzLlxuICAgKi9cbiAgYXN5bmMgdHJ1bmNhdGVUYWJsZXModGFibGVzKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeSh0aGlzLl90cnVuY2F0ZVRhYmxlU3RhdGVtZW50cyh0YWJsZXMpLmpvaW4oXCJcXG5cIikpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwZXItdGFibGUgdHJ1bmNhdGUvZGVsZXRlLWZhbGxiYWNrIHN0YXRlbWVudHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi4vYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0Pn0gdGFibGVzIC0gRWxpZ2libGUgdGFibGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119IC0gU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBfdHJ1bmNhdGVUYWJsZVN0YXRlbWVudHModGFibGVzKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgY29uc3QgcXVvdGVkVGFibGUgPSB0aGlzLnF1b3RlVGFibGUodGFibGUuZ2V0TmFtZSgpKVxuXG4gICAgICBzdGF0ZW1lbnRzLnB1c2goXG4gICAgICAgIFwiQkVHSU4gVFJZXCIsXG4gICAgICAgIGAgIFRSVU5DQVRFIFRBQkxFICR7cXVvdGVkVGFibGV9O2AsXG4gICAgICAgIFwiRU5EIFRSWVwiLFxuICAgICAgICBcIkJFR0lOIENBVENIXCIsXG4gICAgICAgIFwiICBJRiBFUlJPUl9OVU1CRVIoKSA9IDQ3MTJcIixcbiAgICAgICAgXCIgIEJFR0lOXCIsXG4gICAgICAgIGAgICAgREVMRVRFIEZST00gJHtxdW90ZWRUYWJsZX07YCxcbiAgICAgICAgXCIgIEVORFwiLFxuICAgICAgICBcIiAgRUxTRVwiLFxuICAgICAgICBcIiAgQkVHSU5cIixcbiAgICAgICAgXCIgICAgVEhST1c7XCIsXG4gICAgICAgIFwiICBFTkRcIixcbiAgICAgICAgXCJFTkQgQ0FUQ0g7XCJcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50c1xuICB9XG5cbiAgYXN5bmMgbGFzdEluc2VydElEKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgU0NPUEVfSURFTlRJVFkoKSBBUyBsYXN0X2luc2VydF9pZFwiLCBvcHRpb25zKVxuICAgIGNvbnN0IGxhc3RJbnNlcnRJRCA9IGRpZ2cocmVzdWx0LCAwLCBcImxhc3RfaW5zZXJ0X2lkXCIpXG5cbiAgICBpZiAobGFzdEluc2VydElEID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBnZXQgdGhlIGxhc3QgaW5zZXJ0ZWQgSURcIilcblxuICAgIHJldHVybiBsYXN0SW5zZXJ0SURcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtPcHRpb25zfSAtIFRoZSBvcHRpb25zIG9wdGlvbnMuXG4gICAqL1xuICBvcHRpb25zKCkge1xuICAgIGlmICghdGhpcy5fb3B0aW9ucykgdGhpcy5fb3B0aW9ucyA9IG5ldyBPcHRpb25zKHtkcml2ZXI6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNcbiAgfVxuXG4gIGFzeW5jIF9zdGFydFRyYW5zYWN0aW9uQWN0aW9uKCkge1xuICAgIGF3YWl0IHRoaXMuX3J1blBoeXNpY2FsQ29ubmVjdGlvblJlcXVlc3QoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmdcIilcbiAgICAgIGlmICghdGhpcy5jb25uZWN0aW9uKSBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuXG4gICAgICB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24gPSBuZXcgbXNzcWwuVHJhbnNhY3Rpb24odGhpcy5jb25uZWN0aW9uKVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9jdXJyZW50VHJhbnNhY3Rpb24uYmVnaW4oKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfY29tbWl0VHJhbnNhY3Rpb25BY3Rpb24oKSB7XG4gICAgYXdhaXQgdGhpcy5fcnVuUGh5c2ljYWxDb25uZWN0aW9uUmVxdWVzdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiQSB0cmFuc2FjdGlvbiBpc24ndCBydW5uaW5nXCIpXG5cbiAgICAgIGF3YWl0IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbi5jb21taXQoKVxuICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgIH0pXG4gIH1cblxuICBhc3luYyBfcm9sbGJhY2tUcmFuc2FjdGlvbkFjdGlvbigpIHtcbiAgICBhd2FpdCB0aGlzLl9ydW5QaHlzaWNhbENvbm5lY3Rpb25SZXF1ZXN0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiQSB0cmFuc2FjdGlvbiBpc24ndCBydW5uaW5nIC0gaWdub3JpbmcgYmVjYXVzZSB0aGF0IGNhbiBoYXBwZW4gaWYgc29tZXRoaW5nIGVsc2UgaGFzIGZhaWxlZCBpbiB0aGUgZGJcIilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2N1cnJlbnRUcmFuc2FjdGlvbi5yb2xsYmFjaygpXG4gICAgICB9IGNhdGNoICh0cmFuc2FjdGlvblJvbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgLy8gV2hlbiBTUUwgU2VydmVyIGhhcyBhbHJlYWR5IGFib3J0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuLCBhXG4gICAgICAgIC8vIHN0YWxlIGNvbmN1cnJlbnQgcmVxdWVzdCB0cmlnZ2VyZWQgWEFDVF9BQk9SVCksIHRoZVxuICAgICAgICAvLyBtc3NxbC5UcmFuc2FjdGlvbi5yb2xsYmFjaygpIGNhbGwgZmFpbHMgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gb2JqZWN0IGlzIGRlYWQuICBJc3N1ZSBhIHJhdyBST0xMQkFDSyBvbiB0aGVcbiAgICAgICAgLy8gdW5kZXJseWluZyBjb25uZWN0aW9uIHRvIGNsZWFyIFNRTCBTZXJ2ZXIncyBzZXNzaW9uLWxldmVsXG4gICAgICAgIC8vIGFib3J0ZWQtdHJhbnNhY3Rpb24gc3RhdGUgc28gdGhlIGNvbm5lY3Rpb24gaXMgdXNhYmxlIGZvciB0aGVcbiAgICAgICAgLy8gbmV4dCBCRUdJTiBUUkFOU0FDVElPTi5cbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcIlRyYW5zYWN0aW9uLnJvbGxiYWNrKCkgZmFpbGVkLCBjbGVhcmluZyBzZXNzaW9uIHN0YXRlIHdpdGggcmF3IFJPTExCQUNLXCIsIHtcbiAgICAgICAgICBlcnJvcjogdHJhbnNhY3Rpb25Sb2xsYmFja0Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyB0cmFuc2FjdGlvblJvbGxiYWNrRXJyb3IubWVzc2FnZSA6IHRyYW5zYWN0aW9uUm9sbGJhY2tFcnJvclxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgbXNzcWwuUmVxdWVzdCh0aGlzLmNvbm5lY3Rpb24pXG5cbiAgICAgICAgYXdhaXQgcmVxdWVzdC5xdWVyeShcIklGIEBAVFJBTkNPVU5UID4gMCBST0xMQkFDS1wiKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRyYW5zYWN0aW9uID0gbnVsbFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdGFydCBzYXZlIHBvaW50IGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNhdmVQb2ludE5hbWUgLSBTYXZlIHBvaW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UGljazxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9ucywgXCJvcGVyYXRpb25Pd25lclwiPn0gW29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3N0YXJ0U2F2ZVBvaW50QWN0aW9uKHNhdmVQb2ludE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoYFNBVkUgVFJBTlNBQ1RJT04gWyR7c2F2ZVBvaW50TmFtZX1dYCwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbGVhc2Ugc2F2ZSBwb2ludCBhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzYXZlUG9pbnROYW1lIC0gU2F2ZSBwb2ludCBuYW1lLlxuICAgKiBAcGFyYW0ge1BpY2s8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeU9wdGlvbnMsIFwib3BlcmF0aW9uT3duZXJcIj59IFtfb3B0aW9uc10gLSBUcmFuc2FjdGlvbiBvd25lcnNoaXAuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcmVsZWFzZVNhdmVQb2ludEFjdGlvbihzYXZlUG9pbnROYW1lLCBfb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gRG8gbm90aGluZyBpbiBNUy1TUUwuXG4gIH1cblxuICAvKipcbiAgICogUnVucyByb2xsYmFjayBzYXZlIHBvaW50IGFjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNhdmVQb2ludE5hbWUgLSBTYXZlIHBvaW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UGljazxpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLlF1ZXJ5T3B0aW9ucywgXCJvcGVyYXRpb25Pd25lclwiPn0gW29wdGlvbnNdIC0gVHJhbnNhY3Rpb24gb3duZXJzaGlwLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX3JvbGxiYWNrU2F2ZVBvaW50QWN0aW9uKHNhdmVQb2ludE5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBST0xMQkFDSyBUUkFOU0FDVElPTiBbJHtzYXZlUG9pbnROYW1lfV1gLCBvcHRpb25zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBgJHtlcnJvcn1gXG5cbiAgICAgIC8vIFdoZW4gWEFDVF9BQk9SVCBraWxscyB0aGUgZW50aXJlIHRyYW5zYWN0aW9uLCB0aGUgc2F2ZXBvaW50XG4gICAgICAvLyBubyBsb25nZXIgZXhpc3RzIGFuZCB0aGUgUk9MTEJBQ0sgVFJBTlNBQ1RJT04gW25hbWVdIGZhaWxzLlxuICAgICAgLy8gSXNzdWUgYSByYXcgSUYgQEBUUkFOQ09VTlQgPiAwIFJPTExCQUNLIHRvIGNsZWFyIHdoYXRldmVyXG4gICAgICAvLyBzZXNzaW9uIHN0YXRlIHJlbWFpbnMsIHRoZW4gbGV0IHRoZSBlcnJvciBwcm9wYWdhdGUgc28gdGhlXG4gICAgICAvLyBvdXRlciB0cmFuc2FjdGlvbigpIGNhbGwga25vd3MgdGhlIHRyYW5zYWN0aW9uIGlzIGRlYWQuXG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIlRyYW5zYWN0aW9uIGhhcyBub3QgYmVndW5cIikgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIlRyYW5zYWN0aW9uIGhhcyBiZWVuIGFib3J0ZWRcIikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJTYXZlcG9pbnQgcm9sbGJhY2sgZmFpbGVkOyB0cmFuc2FjdGlvbiBhbHJlYWR5IGRlYWQsIGNsZWFyaW5nIHNlc3Npb24gc3RhdGVcIilcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IG1zc3FsLlJlcXVlc3QodGhpcy5jb25uZWN0aW9uKVxuXG4gICAgICAgIGF3YWl0IHJlcXVlc3QucXVlcnkoXCJJRiBAQFRSQU5DT1VOVCA+IDAgUk9MTEJBQ0tcIilcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVNhdmVQb2ludE5hbWUoKSB7XG4gICAgcmV0dXJuIGBzcCR7bmV3IFVVSUQoNCkuZm9ybWF0KCkucmVwbGFjZUFsbChcIi1cIiwgXCJcIil9YC5zdWJzdHJpbmcoMCwgMzIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cGRhdGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBkYXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBkYXRlU3FsKHtjb25kaXRpb25zLCBkYXRhLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgdXBkYXRlID0gbmV3IFVwZGF0ZSh7Y29uZGl0aW9ucywgZGF0YSwgZHJpdmVyOiB0aGlzLCB0YWJsZU5hbWV9KVxuXG4gICAgcmV0dXJuIHVwZGF0ZS50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cHNlcnQgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBzZXJ0U3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBzZXJ0U3FsKGFyZ3MpIHtcbiAgICBjb25zdCB1cHNlcnQgPSBuZXcgVXBzZXJ0KHsuLi5hcmdzLCBkcml2ZXI6IHRoaXN9KVxuXG4gICAgcmV0dXJuIHVwc2VydC50b1NxbCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdHJ1Y3R1cmUgc3FsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBzdHJ1Y3R1cmVTcWwoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NhY2hlZFNjaGVtYU1ldGFkYXRhKFwic3RydWN0dXJlU3FsXCIsIGFzeW5jICgpID0+IGF3YWl0IG5ldyBTdHJ1Y3R1cmVTcWwoe2RyaXZlcjogdGhpc30pLnRvU3FsKCkpXG4gIH1cblxuICAvKipcbiAgICogQmxvY2tzIHVudGlsIGEgU1FMIFNlcnZlciBhcHBsaWNhdGlvbiBsb2NrIGlzIGFjcXVpcmVkIG9uIHRoaXNcbiAgICogY29ubmVjdGlvbiB2aWEgYHNwX2dldGFwcGxvY2tgLiBUaGUgU2Vzc2lvbiBsb2NrIG93bmVyIHNjb3BlcyB0aGUgbG9ja1xuICAgKiB0byB0aGUgY3VycmVudCBzZXNzaW9uLCBtYXRjaGluZyB0aGUgY29ubmVjdGlvbi1zY29wZWQgc2VtYW50aWNzIG9uXG4gICAqIE15U1FMIGFuZCBQb3N0Z3JlU1FMLlxuICAgKlxuICAgKiBgc3BfZ2V0YXBwbG9ja2AgcmV0dXJucyAwIG9uIGltbWVkaWF0ZSBncmFudCwgMSBhZnRlciB3YWl0aW5nLCBhbmRcbiAgICogbmVnYXRpdmUgdmFsdWVzIG9uIGZhaWx1cmUgKHRpbWVvdXQsIGRlYWRsb2NrLCBjYW5jZWxlZCwgcGFyYW1ldGVyXG4gICAqIGVycm9yKS4gV2UgdHJlYXQgMC8xIGFzIHN1Y2Nlc3MgYW5kIC0xICh0aW1lb3V0KSBhcyBhIGNsZWFuIGBmYWxzZWA7XG4gICAqIGFueXRoaW5nIGVsc2UgdGhyb3dzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHBhcmFtIHt7dGltZW91dE1zPzogbnVtYmVyIHwgbnVsbH19IFthcmdzXSAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzOyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvciBuZWdhdGl2ZSBibG9ja3MgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiB0aGUgbG9jayB3YXMgYWNxdWlyZWQsIGZhbHNlIGlmIHRoZSB0aW1lb3V0IGVsYXBzZWQuXG4gICAqL1xuICBhc3luYyBfYWNxdWlyZUFkdmlzb3J5TG9jayhuYW1lLCB7dGltZW91dE1zfSA9IHt9KSB7XG4gICAgY29uc3QgdGltZW91dFZhbHVlID0gdHlwZW9mIHRpbWVvdXRNcyA9PT0gXCJudW1iZXJcIiAmJiB0aW1lb3V0TXMgPj0gMCA/IE1hdGguY2VpbCh0aW1lb3V0TXMpIDogLTFcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5fYWR2aXNvcnlMb2NrUXVlcnkoXG4gICAgICBgREVDTEFSRSBAdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0IElOVDsgRVhFQyBAdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0ID0gc3BfZ2V0YXBwbG9jayBAUmVzb3VyY2UgPSAke3RoaXMucXVvdGUobmFtZSl9LCBATG9ja01vZGUgPSAnRXhjbHVzaXZlJywgQExvY2tPd25lciA9ICdTZXNzaW9uJywgQExvY2tUaW1lb3V0ID0gJHt0aW1lb3V0VmFsdWV9OyBTRUxFQ1QgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHRgXG4gICAgKVxuICAgIGNvbnN0IHJlc3VsdCA9IE51bWJlcihyb3dzPy5bMF0/LnZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdClcblxuICAgIGlmIChyZXN1bHQgPT09IDAgfHwgcmVzdWx0ID09PSAxKSByZXR1cm4gdHJ1ZVxuXG4gICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpXG5cbiAgICBpZiAocmVzdWx0ID09PSAtMSkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNwX2dldGFwcGxvY2sgcmV0dXJuZWQgJHtyZXN1bHR9IGZvciBhZHZpc29yeSBsb2NrICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IChzZWUgU1FMIFNlcnZlciBkb2N1bWVudGF0aW9uIGZvciBzcF9nZXRhcHBsb2NrIHJldHVybiBjb2RlcylgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdHJ5IGFjcXVpcmUgYWR2aXNvcnkgbG9jay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGFjcXVpcmVkLCBmYWxzZSBpZiBpdCB3YXMgYWxyZWFkeSBoZWxkLlxuICAgKi9cbiAgYXN5bmMgX3RyeUFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9hY3F1aXJlQWR2aXNvcnlMb2NrKG5hbWUsIHt0aW1lb3V0TXM6IDB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVsZWFzZSBhZHZpc29yeSBsb2NrLlxuICAgKlxuICAgKiBgc3BfcmVsZWFzZWFwcGxvY2tgIHJldHVybnMgMCB3aGVuIHRoZSBsb2NrIHdhcyByZWxlYXNlZCwgYnV0IFNRTCBTZXJ2ZXJcbiAgICogcmFpc2VzIGVycm9yIHtAbGluayBBUFBMT0NLX05PVF9IRUxEX0VSUk9SX05VTUJFUn0gaW5zdGVhZCBvZiByZXR1cm5pbmcgYVxuICAgKiBmYWlsdXJlIGNvZGUgd2hlbiB0aGUgc2Vzc2lvbiBkb2VzIG5vdCBjdXJyZW50bHkgaG9sZCB0aGUgbG9jay4gVGhhdFxuICAgKiBlcnJvciBhYm9ydHMgdGhlIGJhdGNoIGJlZm9yZSB0aGUgdHJhaWxpbmcgYFNFTEVDVGAgY2FuIHJ1biwgc28gd2UgY2F0Y2hcbiAgICogaXQgYW5kIHJlc29sdmUgdG8gYGZhbHNlYCB0byBob25vciB0aGUgY3Jvc3MtZHJpdmVyIGNvbnRyYWN0IGZvciBhblxuICAgKiBhbHJlYWR5LXVuaGVsZCBsb2NrLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIExvY2sgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVHJ1ZSBpZiB0aGUgbG9jayB3YXMgaGVsZCBieSB0aGlzIHNlc3Npb24gYW5kIGhhcyBub3cgYmVlbiByZWxlYXNlZC5cbiAgICovXG4gIGFzeW5jIF9yZWxlYXNlQWR2aXNvcnlMb2NrKG5hbWUpIHtcbiAgICBsZXQgcm93c1xuXG4gICAgdHJ5IHtcbiAgICAgIHJvd3MgPSBhd2FpdCB0aGlzLl9hZHZpc29yeUxvY2tRdWVyeShcbiAgICAgICAgYERFQ0xBUkUgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCBJTlQ7IEVYRUMgQHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdCA9IHNwX3JlbGVhc2VhcHBsb2NrIEBSZXNvdXJjZSA9ICR7dGhpcy5xdW90ZShuYW1lKX0sIEBMb2NrT3duZXIgPSAnU2Vzc2lvbic7IFNFTEVDVCBAdmVsb2Npb3VzX2Fkdmlzb3J5X2xvY2tfcmVzdWx0IEFTIHZlbG9jaW91c19hZHZpc29yeV9sb2NrX3Jlc3VsdGBcbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuX2lzQXBwbG9ja05vdEhlbGRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbklmRmluYWxSZWxlYXNlKClcblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBOdW1iZXIocm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19yZXN1bHQpXG5cbiAgICBhd2FpdCB0aGlzLl9jbG9zZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uSWZGaW5hbFJlbGVhc2UoKVxuXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYW4gYWR2aXNvcnktbG9jayBzdGF0ZW1lbnQgdGhyb3VnaCBvbmUgdHJhbnNhY3Rpb24gcmVxdWVzdCBwYXJlbnQuXG4gICAqIG5vZGUtbXNzcWwgcmVzZXJ2ZXMgb25lIHBoeXNpY2FsIHNlc3Npb24gZm9yIGEgVHJhbnNhY3Rpb24sIHdoZXJlYXNcbiAgICogc2VwYXJhdGUgQ29ubmVjdGlvblBvb2wgcmVxdWVzdHMgbWF5IGNoZWNrIG91dCBkaWZmZXJlbnQgc2Vzc2lvbnMuIFRoZVxuICAgKiB0cmFuc2FjdGlvbiBjb250YWlucyBvbmx5IGFwcGxpY2F0aW9uLWxvY2sgc3RhdGVtZW50czsgY2FsbGVyL21vZGVsIHdvcmtcbiAgICogY29udGludWVzIHRocm91Z2ggaXRzIG9yaWdpbmFsIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBBZHZpc29yeS1sb2NrIFNRTC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5RdWVyeVJlc3VsdFR5cGU+fSAtIFJlc3VsdCByb3dzLlxuICAgKi9cbiAgYXN5bmMgX2Fkdmlzb3J5TG9ja1F1ZXJ5KHNxbCkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5fZW5zdXJlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgbXNzcWwuUmVxdWVzdCh0cmFuc2FjdGlvbilcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QucXVlcnkoc3FsKVxuXG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyZXN1bHQucmVjb3Jkc2V0cykgPyByZXN1bHQucmVjb3Jkc2V0c1swXSB8fCBbXSA6IFtdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkICcke2Vycm9yLm1lc3NhZ2V9JzogJHtzcWx9YCwge2NhdXNlOiBlcnJvcn0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgUXVlcnkgZmFpbGVkICcke2Vycm9yfSc6ICR7c3FsfWAsIHtjYXVzZTogZXJyb3J9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgcGFyZW50IHRoYXQgcmVzZXJ2ZXMgdGhlIGFkdmlzb3J5LWxvY2tcbiAgICogc2Vzc2lvbiB1bnRpbCB0aGUgZmluYWwgcmVsZWFzZSBvciBkcml2ZXIgY2xvc2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIm1zc3FsXCIpLlRyYW5zYWN0aW9uPn0gLSBTZXNzaW9uLWFmZmluZSBwYXJlbnQuXG4gICAqL1xuICBhc3luYyBfZW5zdXJlQWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKSByZXR1cm4gdGhpcy5fYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25cbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICBpZiAoIXRoaXMuY29ubmVjdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTVNTUUwgY29ubmVjdGlvbiB1bmF2YWlsYWJsZSBmb3IgYWR2aXNvcnkgbG9ja1wiKVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgbXNzcWwuVHJhbnNhY3Rpb24odGhpcy5jb25uZWN0aW9uKVxuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24uYmVnaW4oKVxuICAgIHRoaXMuX2Fkdmlzb3J5TG9ja1RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb25cblxuICAgIHJldHVybiB0cmFuc2FjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIHRoZSByZXNlcnZlZCBzZXNzaW9uIGFmdGVyIHRoZSBsYXN0IHRyYWNrZWQgbG9jayByZWxlYXNlLlxuICAgKiBCYXNlIHVudHJhY2tzIHRoZSBjdXJyZW50IHJlbGVhc2UgYWZ0ZXIgdGhlIGRyaXZlciBob29rIHJldHVybnMsIHNvIGFcbiAgICogY3VycmVudCB0b3RhbCBvZiBvbmUgbWVhbnMgdGhpcyBpcyB0aGUgZmluYWwgcmVsZWFzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgY2xlYW51cCB3aGVuIHRoaXMgaXMgZmluYWwuXG4gICAqL1xuICBhc3luYyBfY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbklmRmluYWxSZWxlYXNlKCkge1xuICAgIGxldCBoZWxkQ291bnQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGNvdW50IG9mIHRoaXMuX2hlbGRBZHZpc29yeUxvY2tzLnZhbHVlcygpKSBoZWxkQ291bnQgKz0gY291bnRcblxuICAgIGlmIChoZWxkQ291bnQgPD0gMSkgYXdhaXQgdGhpcy5fY2xvc2VBZHZpc29yeUxvY2tUcmFuc2FjdGlvbigpXG4gIH1cblxuICAvKipcbiAgICogUm9sbHMgYmFjayB0aGUgb3RoZXJ3aXNlLWVtcHR5IHRyYW5zYWN0aW9uIGFuZCByZXR1cm5zIGl0cyBwaHlzaWNhbFxuICAgKiBzZXNzaW9uIHRvIG5vZGUtbXNzcWwuIFJvbGxiYWNrIGlzIGNsZWFudXAgb25seTsgYWR2aXNvcnkgbG9ja3MgYXJlXG4gICAqIGV4cGxpY2l0bHkgcmVsZWFzZWQgZmlyc3Qgd2hlbmV2ZXIgdGhlaXIgcmVsZWFzZSBzdGF0ZW1lbnQgc3VjY2VlZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHNlc3Npb24gY2xlYW51cC5cbiAgICovXG4gIGFzeW5jIF9jbG9zZUFkdmlzb3J5TG9ja1RyYW5zYWN0aW9uKCkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5fYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb25cblxuICAgIGlmICghdHJhbnNhY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5fYWR2aXNvcnlMb2NrVHJhbnNhY3Rpb24gPSBudWxsXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucm9sbGJhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgdGhlIFNRTCBTZXJ2ZXIgXCJhcHBsaWNhdGlvbiBsb2NrIGlzIG5vdCBjdXJyZW50bHkgaGVsZFwiIGVycm9yXG4gICAqIHJhaXNlZCBieSBgc3BfcmVsZWFzZWFwcGxvY2tgLiBJdCB3YWxrcyB0aGUgd3JhcHBlZC1lcnJvciBjYXVzZSBjaGFpblxuICAgKiBiZWNhdXNlIGBxdWVyeWAgcmUtd3JhcHMgdGhlIGRyaXZlcidzIGBSZXF1ZXN0RXJyb3JgIGluIGEgcGxhaW4gYEVycm9yYCxcbiAgICogYW5kIG1hdGNoZXMgb24gdGhlIHN0YWJsZSBudW1lcmljIGVycm9yIG51bWJlciByYXRoZXIgdGhhbiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIHt1bmtub3dufSBlcnJvciAtIEVycm9yIHRocm93biB3aGlsZSByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIGVycm9yIG1lYW5zIHRoZSBsb2NrIHdhcyBub3QgaGVsZCBieSB0aGlzIHNlc3Npb24uXG4gICAqL1xuICBfaXNBcHBsb2NrTm90SGVsZEVycm9yKGVycm9yKSB7XG4gICAgbGV0IGN1cnJlbnQgPSBlcnJvclxuXG4gICAgd2hpbGUgKGN1cnJlbnQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JOdW1iZXIgPSAvKiogQHR5cGUge3tudW1iZXI/OiB1bmtub3dufX0gKi8gKGN1cnJlbnQpLm51bWJlclxuXG4gICAgICBpZiAodHlwZW9mIGVycm9yTnVtYmVyID09PSBcIm51bWJlclwiICYmIGVycm9yTnVtYmVyID09PSBBUFBMT0NLX05PVF9IRUxEX0VSUk9SX05VTUJFUikgcmV0dXJuIHRydWVcblxuICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2F1c2VcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHNlc3Npb24gY3VycmVudGx5IGhvbGRzIHRoZSBhcHBsaWNhdGlvbiBsb2NrLlxuICAgKlxuICAgKiBUaGlzIGNvbWJpbmVzIHR3byBwcm9iZXMgYmVjYXVzZSBuZWl0aGVyIGlzIHN1ZmZpY2llbnQgb24gaXRzIG93bjpcbiAgICogICAtIGBBUFBMT0NLX01PREUoLi4uLCAnU2Vzc2lvbicpYCBvbmx5IHJlcG9ydHMgbG9ja3MgaGVsZCBieSB0aGVcbiAgICogICAgICoqY3VycmVudCoqIHNlc3Npb24sIHNvIGl0IG1pc3NlcyBsb2NrcyBoZWxkIGJ5IGFueSBvdGhlclxuICAgKiAgICAgc2Vzc2lvbiBhbmQgd291bGQgcmV0dXJuIGBOb0xvY2tgIGV2ZW4gdW5kZXIgY3Jvc3Mtc2Vzc2lvblxuICAgKiAgICAgY29udGVudGlvbi5cbiAgICogICAtIGBBUFBMT0NLX1RFU1QoLi4uLCAnRXhjbHVzaXZlJywgJ1Nlc3Npb24nKWAgcmV0dXJucyB3aGV0aGVyIGFuXG4gICAqICAgICBFeGNsdXNpdmUgbG9jayBjb3VsZCBiZSBncmFudGVkIHRvICp0aGlzKiBzZXNzaW9uIHJpZ2h0IG5vdy4gQVxuICAgKiAgICAgcmV0dXJuIHZhbHVlIG9mIDAgbWVhbnMgc29tZWJvZHkgZWxzZSBob2xkcyBhbiBpbmNvbXBhdGlibGVcbiAgICogICAgIGxvY2s7IGEgdmFsdWUgb2YgMSBtZWFucyBpdCBpcyBlaXRoZXIgZnJlZSAqKm9yKiogYWxyZWFkeSBoZWxkXG4gICAqICAgICBieSB1cyByZS1lbnRyYW50bHkgKHdoaWNoIHRoZSBgQVBQTE9DS19NT0RFYCBjaGVjayBjYXRjaGVzKS5cbiAgICpcbiAgICogVGhlIGNvbWJpbmVkIHJlc3VsdCBpcyBcImhlbGRcIiBpZmYgd2UgaG9sZCBpdCBvdXJzZWx2ZXMgb3JcbiAgICogYEFQUExPQ0tfVEVTVGAgcmVwb3J0cyB3ZSBjYW5ub3QgYWNxdWlyZSBpdCB3aXRob3V0IHdhaXRpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIGFueSBzZXNzaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgbG9jay5cbiAgICovXG4gIGFzeW5jIGlzQWR2aXNvcnlMb2NrSGVsZChuYW1lKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBgU0VMRUNUIGAgK1xuICAgICAgICBgQVBQTE9DS19NT0RFKCdwdWJsaWMnLCAke3RoaXMucXVvdGUobmFtZSl9LCAnU2Vzc2lvbicpIEFTIHZlbG9jaW91c19hZHZpc29yeV9zZWxmX21vZGUsIGAgK1xuICAgICAgICBgQVBQTE9DS19URVNUKCdwdWJsaWMnLCAke3RoaXMucXVvdGUobmFtZSl9LCAnRXhjbHVzaXZlJywgJ1Nlc3Npb24nKSBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfdGVzdF9yZXN1bHRgXG4gICAgKVxuICAgIGNvbnN0IHNlbGZNb2RlID0gcm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfc2VsZl9tb2RlXG4gICAgY29uc3QgaGVsZEJ5U2VsZiA9IHR5cGVvZiBzZWxmTW9kZSA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmTW9kZS5sZW5ndGggPiAwICYmIHNlbGZNb2RlICE9PSBcIk5vTG9ja1wiXG5cbiAgICBpZiAoaGVsZEJ5U2VsZikgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBOdW1iZXIocm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfdGVzdF9yZXN1bHQpXG5cbiAgICByZXR1cm4gdGVzdFJlc3VsdCA9PT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMgdGhlIGN1cnJlbnQgaG9sZGVyIG9mIHRoZSBuYW1lZCBhcHBsaWNhdGlvbiBsb2NrIHRvIGl0c1xuICAgKiByZXF1ZXN0aW5nIHNlc3Npb24gZnJvbSBgc3lzLmRtX3RyYW5fbG9ja3NgLCBjYXB0dXJlZCBhdCB0aGUgdGVsZW1ldHJ5XG4gICAqIGV2ZW50IG1vbWVudCAoYmVzdC1lZmZvcnQ7IHRoZSBjYWxsZXIgZ3VhcmRzIGZhaWx1cmVzKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IG51bGw+fSAtIFNRTCBTZXJ2ZXIgc2Vzc2lvbiBpZCBvZiB0aGUgaG9sZGVyLCBvciBudWxsIHdoZW4gbm8gc2Vzc2lvbiBob2xkcyB0aGUgbG9jay5cbiAgICovXG4gIGFzeW5jIGFkdmlzb3J5TG9ja0hvbGRlckNvbm5lY3Rpb25JZChuYW1lKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICBgU0VMRUNUIFRPUCAxIHJlcXVlc3Rfc2Vzc2lvbl9pZCBBUyB2ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19ob2xkZXIgRlJPTSBzeXMuZG1fdHJhbl9sb2NrcyBXSEVSRSByZXNvdXJjZV90eXBlID0gJ0FQUExJQ0FUSU9OTE9DSycgQU5EIHJlc291cmNlX2Rlc2NyaXB0aW9uID0gJHt0aGlzLnF1b3RlKG5hbWUpfWBcbiAgICApXG4gICAgY29uc3QgaG9sZGVyID0gcm93cz8uWzBdPy52ZWxvY2lvdXNfYWR2aXNvcnlfbG9ja19ob2xkZXJcblxuICAgIHJldHVybiBob2xkZXIgPT09IG51bGwgfHwgaG9sZGVyID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGhvbGRlcilcbiAgfVxufVxuIl19
|
|
@@ -373,6 +373,14 @@ export default class VelociousDatabaseDriversMysql extends Base {
|
|
|
373
373
|
* @returns {Promise<boolean>} - True if the lock was held by this session and has now been released.
|
|
374
374
|
*/
|
|
375
375
|
_releaseAdvisoryLock(name: string): Promise<boolean>;
|
|
376
|
+
/**
|
|
377
|
+
* Attributes the current holder of the named lock to its physical session
|
|
378
|
+
* connection id via `IS_USED_LOCK(name)`, captured at the telemetry event
|
|
379
|
+
* moment (best-effort; the caller guards failures).
|
|
380
|
+
* @param {string} name - Lock name.
|
|
381
|
+
* @returns {Promise<string | null>} - MariaDB/MySQL connection id of the holder, or null when no session holds the lock.
|
|
382
|
+
*/
|
|
383
|
+
advisoryLockHolderConnectionId(name: string): Promise<string | null>;
|
|
376
384
|
/**
|
|
377
385
|
* Runs is advisory lock held.
|
|
378
386
|
* @param {string} name - Lock name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/mysql/index.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/database/drivers/mysql/index.js"],"names":[],"mappings":"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"}
|