@dbx-tools/postgres 0.6.73 → 0.6.75

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 CHANGED
@@ -200,6 +200,9 @@ order does not matter; a different spelling does. Read `bus.channelName` to see
200
200
  what a set of parts resolved to, or to confirm two processes agree. Defaults to a
201
201
  shared `dbx_tools_topic_bus` channel.
202
202
 
203
+ `topicBus.channelName(parts)` exposes the derivation without constructing a bus,
204
+ which is useful for configuration checks and cross-runtime contract tests.
205
+
203
206
  ## Why A Separate Package?
204
207
 
205
208
  Advisory locks are connection-scoped, and that is easy to get wrong invisibly:
@@ -218,6 +221,7 @@ native surface to prefer here.
218
221
  | Module | Purpose |
219
222
  | -------------- | ------------------------------------------------------------------ |
220
223
  | `advisoryLock` | Stable lock IDs plus session- and transaction-scoped lock helpers. |
224
+ | `topicBus` | Topic bus, message contracts, and deterministic `channelName`. |
221
225
  | `topicBus` | Structured topic broadcast/listen over PostgreSQL `NOTIFY`. |
222
226
 
223
227
  Both modules are also flattened onto the package root, so
@@ -129,6 +129,29 @@ export interface PostgresTopicBusOptions {
129
129
  */
130
130
  onError?: (cause: unknown) => void;
131
131
  }
132
+ /**
133
+ * Derive a legal Postgres channel name from whatever a caller used to identify
134
+ * the channel.
135
+ *
136
+ * Callers think in terms of what the channel IS - an app name, a tenant id, a
137
+ * `[env, feature]` pair, a config object - and none of those are identifiers.
138
+ * Rejecting them pushed the sanitizing onto every call site, which is how two
139
+ * services end up disagreeing about whether the channel is `my-app`, `my_app`,
140
+ * or `myApp` and silently never hear each other.
141
+ *
142
+ * The parts are tokenized and joined into an identifier, then a short hash of the
143
+ * ORIGINAL parts is appended. The hash is what makes the mapping trustworthy:
144
+ * tokenizing alone is lossy, so `my-app` and `my_app` and `myApp` would collapse
145
+ * onto one channel, and a name long enough to hit `NAMEDATALEN` would collide
146
+ * with anything sharing its leading tokens. With the suffix, the readable part
147
+ * stays readable and distinct inputs stay distinct.
148
+ *
149
+ * Deterministic across processes and runs, which is the whole point - two
150
+ * services given the same parts must land on the same channel without
151
+ * coordinating. Hash inputs are structure-aware, so `["a", "b"]` and `["a_b"]`
152
+ * differ, and object key order does not.
153
+ */
154
+ export declare function channelName(value: unknown): string;
132
155
  /**
133
156
  * Broadcasts structured messages by topic and delivers them to every process
134
157
  * listening on the same channel.
@@ -142,7 +142,8 @@ async function senderMetadata() {
142
142
  * coordinating. Hash inputs are structure-aware, so `["a", "b"]` and `["a_b"]`
143
143
  * differ, and object key order does not.
144
144
  */
145
- function channelName(parts) {
145
+ export function channelName(value) {
146
+ const parts = object.toOneOrMany(value);
146
147
  // Hash the CANONICAL form, the same rule `advisoryLockId` uses, so structure and
147
148
  // types decide identity: `["a","b"]` differs from `["ab"]`, `1` from `"1"`, and
148
149
  // object key order does not matter. Hashing the raw parts would instead lean on
@@ -252,7 +253,7 @@ export class PostgresTopicBus {
252
253
  closed = false;
253
254
  constructor(pool, options = {}) {
254
255
  this.pool = pool;
255
- this.channelName = channelName(object.toOneOrMany(options.channel === undefined ? DEFAULT_CHANNEL : options.channel));
256
+ this.channelName = channelName(options.channel === undefined ? DEFAULT_CHANNEL : options.channel);
256
257
  this.metadata = options.metadata;
257
258
  this.onError = options.onError ?? (() => undefined);
258
259
  }
@@ -496,4 +497,4 @@ export class PostgresTopicBus {
496
497
  }
497
498
  }
498
499
  }
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXL0Ysb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQzlDOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixxRkFBcUY7QUFDckYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsMEVBQTBFO0FBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9COzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQWtCckM7Ozs7R0FJRztBQUNILElBQUksWUFBMkQsQ0FBQztBQTZHaEU7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQXFEO0lBQzVFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQXdDLEVBQUU7UUFDNUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsZUFBZTtJQUN0QixPQUFPLGVBQWUsQ0FBQztR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WUFDL0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsT0FBTztnQkFDVCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsT0FBTztZQUNULENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTztnQkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsS0FBSyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUM3RixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9waWMgZmFuLW91dCBvdmVyIFBvc3RncmVTUUwgYExJU1RFTmAvYE5PVElGWWAsIGZvciB0ZWxsaW5nIGV2ZXJ5IHJ1bm5pbmdcbiAqIGluc3RhbmNlIG9mIGFuIGFwcCB0aGF0IHNvbWV0aGluZyBoYXBwZW5lZC5cbiAqXG4gKiBUaGUgc2libGluZyBgYWR2aXNvcnktbG9ja2AgbW9kdWxlIGlzIGFib3V0IG1ha2luZyBzdXJlIG9ubHkgT05FIGNvbm5lY3Rpb25cbiAqIGRvZXMgYSB0aGluZzsgdGhpcyBvbmUgaXMgdGhlIG9wcG9zaXRlIC0gRVZFUlkgbGlzdGVuaW5nIHNlc3Npb24gZ2V0cyBldmVyeVxuICogbm90aWZpY2F0aW9uLiBUaGF0IG1ha2VzIGl0IHRoZSByaWdodCBwcmltaXRpdmUgZm9yIGxpdmUgVUkgdXBkYXRlc1xuICogKGFuIFNTRSBzdHJlYW0gcGVyIGJyb3dzZXIgdGFiLCBhIGNhY2hlIGludmFsaWRhdGlvbiwgYSBwcmVzZW5jZSBwaW5nKSBhbmQgdGhlXG4gKiB3cm9uZyBvbmUgZm9yIHdvcmsgZGlzdHJpYnV0aW9uOiB0aGVyZSBhcmUgbm8gY29tcGV0aW5nIGNvbnN1bWVycywgbm8gYWNrcywgYW5kXG4gKiBubyByZXBsYXkuXG4gKlxuICogRGVsaXZlcnkgaXMgYmVzdC1lZmZvcnQgYW5kIGxpdmUuIGBOT1RJRllgIHJlYWNoZXMgc2Vzc2lvbnMgdGhhdCBhcmUgbGlzdGVuaW5nXG4gKiBhdCB0aGUgbW9tZW50IGl0IGNvbW1pdHMsIHNvIGEgbGlzdGVuZXIgdGhhdCBjb25uZWN0cyBhIHNlY29uZCBsYXRlciBuZXZlciBzZWVzXG4gKiBpdCwgYW5kIGEgbGlzdGVuZXIgd2hvc2UgY29ubmVjdGlvbiBkcm9wcyBtaXNzZXMgZXZlcnl0aGluZyB1bnRpbCB0aGUgYnVzXG4gKiByZWNvbm5lY3RzLiBVc2UgYSB0YWJsZSBvciBhIHF1ZXVlIHdoZW4gYSBzdWJzY3JpYmVyIG5lZWRzIGR1cmFiaWxpdHkuXG4gKlxuICogT05FIENIQU5ORUwsIE1BTlkgVE9QSUNTLiBFdmVyeSBidXMgaW5zdGFuY2UgbGlzdGVucyBvbiBhIHNpbmdsZSBQb3N0Z3Jlc1xuICogY2hhbm5lbCAoYGNoYW5uZWxgLCBkZWZhdWx0IGBkYnhfdG9vbHNfdG9waWNfYnVzYCkgYW5kIGZpbHRlcnMgYnkgdGhlXG4gKiBlbnZlbG9wZSdzIGB0b3BpY2AgaW4tcHJvY2Vzcywgc28gYWRkaW5nIGEgdG9waWMgY29zdHMgbm8gY29ubmVjdGlvbiBhbmQgbm9cbiAqIGBMSVNURU5gLiBUaGUgdHJhZGVvZmYgaXMgdGhhdCBldmVyeSBsaXN0ZW5pbmcgc2Vzc2lvbiBkZWNvZGVzIGV2ZXJ5IG1lc3NhZ2Ugb25cbiAqIHRoZSBjaGFubmVsOyBnaXZlIGEgZ2VudWluZWx5IGhpZ2gtdm9sdW1lLCB1bnJlbGF0ZWQgc3RyZWFtIGl0cyBvd24gYGNoYW5uZWxgXG4gKiByYXRoZXIgdGhhbiBhIHRvcGljLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBob3N0bmFtZSB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBhc3luYyBhcyBhc3luY1V0aWwsIGVycm9yLCBoYXNoLCBqc29uLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IE5vdGlmaWNhdGlvbiwgUG9vbENsaWVudCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgdHlwZSB7IFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vYWR2aXNvcnktbG9jay50c1wiO1xuXG4vKipcbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCBvd25zIHRoZSBKU09OLXJvdW5kLXRyaXAgcnVsZTsgdGhpcyBhbGlhcyBqdXN0IGtlZXBzIHRoZVxuICogZ2VuZXJpYyBzaWduYXR1cmVzIGJlbG93IHJlYWRhYmxlLiBDb25zdW1lcnMgaW1wb3J0IHRoZSB0eXBlIGZyb20gc2hhcmVkLWNvcmUuXG4gKi9cbnR5cGUgU2VyaWFsaXphYmxlVmFsdWUgPSBvYmplY3QuU2VyaWFsaXphYmxlVmFsdWU7XG5cbi8qKiBDaGFubmVsIHBhcnRzIHVzZWQgd2hlbiBhIGNhbGxlciBuYW1lcyBubyBjaGFubmVsIG9mIGl0cyBvd24uICovXG5jb25zdCBERUZBVUxUX0NIQU5ORUwgPSBcImRieF90b29sc190b3BpY19idXNcIjtcbi8qKlxuICogYE5BTUVEQVRBTEVOIC0gMWAuIFBvc3RncmVzIFRSVU5DQVRFUyBhIGxvbmdlciBjaGFubmVsIG5hbWUgcmF0aGVyIHRoYW5cbiAqIHJlamVjdGluZyBpdCwgd2hpY2ggd291bGQgc3BsaXQgcHVibGlzaGVycyBhbmQgbGlzdGVuZXJzIG9udG8gZGlmZmVyZW50XG4gKiBjaGFubmVscyB3aGlsZSBldmVyeSBjYWxsIGxvb2tlZCBsaWtlIGl0IHN1Y2NlZWRlZC5cbiAqL1xuY29uc3QgTUFYX0NIQU5ORUxfTEVOR1RIID0gNjM7XG4vKiogQmFzZS0zMiBjaGFycyBvZiB0aGUgY2hhbm5lbCdzIGlkZW50aXR5IHN1ZmZpeC4gTWF4IDcgLSB0aGUgZGlnZXN0IGlzIDMyIGJpdHMuICovXG5jb25zdCBDSEFOTkVMX0hBU0hfTEVOR1RIID0gNjtcbi8qKiBCb2R5IHVzZWQgd2hlbiB0aGUgcGFydHMgdG9rZW5pemUgdG8gbm90aGluZywgb3IgbGVhZCB3aXRoIGEgZGlnaXQuICovXG5jb25zdCBDSEFOTkVMX0ZBTExCQUNLID0gXCJidXNcIjtcbi8qKlxuICogRW5jb2RlZC1lbnZlbG9wZSBjZWlsaW5nLiBQb3N0Z3JlU1FMIGNhcHMgYSBgTk9USUZZYCBwYXlsb2FkIGF0IDgwMDAgYnl0ZXMgYW5kXG4gKiBmYWlscyB0aGUgc3RhdGVtZW50IHBhc3QgdGhhdCwgc28gdGhlIGJ1cyByZWplY3RzIHRoZSBtZXNzYWdlIGZpcnN0IHdpdGggYSBzaXplXG4gKiBpdCBjYW4gbmFtZS4gVGhlIG1hcmdpbiBiZWxvdyA4MDAwIGNvdmVycyB0aGUgc2VydmVyJ3Mgb3duIGFjY291bnRpbmcuXG4gKi9cbmNvbnN0IE1BWF9OT1RJRllfQllURVMgPSA3XzkwMDtcbmNvbnN0IE1JTl9SRUNPTk5FQ1RfREVMQVlfTVMgPSAyNTA7XG5jb25zdCBNQVhfUkVDT05ORUNUX0RFTEFZX01TID0gNV8wMDA7XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBBcHBLaXQncyBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCB0aGUgYnVzIHJlYWRzIGZvciBzZW5kZXJcbiAqIGlkZW50aXR5LiBGaWVsZHMgYXJlIGB1bmtub3duYCBiZWNhdXNlIHRoaXMgaXMgYSBzdHJ1Y3R1cmFsIHZpZXcgb2YgYW4gT1BUSU9OQUxcbiAqIHBlZXI6IHRoZSB2YWx1ZXMgYXJlIHRyaW1tZWQgYW5kIHZhbGlkYXRlZCByYXRoZXIgdGhhbiB0cnVzdGVkLlxuICovXG50eXBlIEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gIHVzZXJFbWFpbD86IHVua25vd247XG4gIHVzZXJJZD86IHVua25vd247XG4gIHVzZXJOYW1lPzogdW5rbm93bjtcbn07XG5cbi8qKiBTdHJ1Y3R1cmFsIHZpZXcgb2YgYEBkYXRhYnJpY2tzL2FwcGtpdGAsIGltcG9ydGVkIGxhemlseSBhbmQgbmV2ZXIgcmVxdWlyZWQuICovXG50eXBlIEFwcEtpdE1vZHVsZSA9IHtcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCgpOiBBcHBLaXRFeGVjdXRpb25Db250ZXh0O1xufTtcblxuLyoqXG4gKiBDYWNoZWQgcmVzdWx0IG9mIHRoZSBvbmUgb3B0aW9uYWwtcGVlciBpbXBvcnQsIHJlc29sdmVkIHRvIGB1bmRlZmluZWRgIHdoZW5cbiAqIEFwcEtpdCBpcyBub3QgaW5zdGFsbGVkLiBNZW1vaXplZCBzbyBhIGJ1cyBpbiBhIHBsYWluIFBvc3RncmVzIHByb2Nlc3MgcGF5cyBmb3JcbiAqIHRoZSBmYWlsZWQgcmVzb2x1dGlvbiBvbmNlIGluc3RlYWQgb2YgcGVyIGJyb2FkY2FzdC5cbiAqL1xubGV0IGFwcEtpdE1vZHVsZTogUHJvbWlzZTxBcHBLaXRNb2R1bGUgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEZsYXQta2V5ZWQgY29udGV4dCB0cmF2ZWxsaW5nIGFsb25nc2lkZSBhIG1lc3NhZ2UgYm9keTogd2hvIHNlbnQgaXQsIGZyb21cbiAqIHdoZXJlLCBpbiB3aGljaCBkZXBsb3ltZW50LiBWYWx1ZXMgbWF5IG5lc3QsIGJ1dCB0aGUga2V5cyBhcmUgdGhlIGFkZHJlc3NhYmxlXG4gKiBwYXJ0IC0gYSBsaXN0ZW5lciBmaWx0ZXJpbmcgb3IgbGFiZWxsaW5nIG1lc3NhZ2VzIHJlYWRzIGBtZXRhZGF0YS51c2VyYCwgbm90IGFcbiAqIHBhdGggaW50byB0aGUgYm9keS5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YSA9IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZVZhbHVlPjtcblxuLyoqXG4gKiBUaGUgd2lyZSBlbnZlbG9wZSBldmVyeSBzdWJzY3JpYmVyIHJlY2VpdmVzLCBhbmQgd2hhdCB7QGxpbmtcbiAqIFBvc3RncmVzVG9waWNCdXMuYnJvYWRjYXN0fSByZXR1cm5zIHRvIHRoZSBwdWJsaXNoZXIuXG4gKlxuICogYGlkYCwgYHRvcGljYCwgYW5kIGBwdWJsaXNoZWRBdGAgYXJlIGFzc2lnbmVkIGJ5IHRoZSBidXM7IGB0eXBlYCwgYG1ldGFkYXRhYCxcbiAqIGFuZCBgYm9keWAgY29tZSBmcm9tIHRoZSBjYWxsZXIgKHdpdGggYXV0b21hdGljIGNvbnRleHQgbWVyZ2VkIHVuZGVyXG4gKiBgbWV0YWRhdGFgKS4gVGhlIHNoYXBlIGlzIHN0YWJsZSBlbm91Z2ggdG8gaGFuZCBzdHJhaWdodCB0byBhbiBTU0UgYGRhdGE6YFxuICogZnJhbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9waWNNZXNzYWdlPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKipcbiAgICogUGVyLW1lc3NhZ2UgaWRlbnRpdHkgZ2VuZXJhdGVkIGJ5IHRoZSBwdWJsaXNoZXIsIHVuaXF1ZSBhY3Jvc3MgaW5zdGFuY2VzLlxuICAgKiBTdWl0YWJsZSBmb3IgZGVkdXBlIHdoZW4gYSBjbGllbnQgcmVjb25uZWN0cyBhbmQgZm9yIGFuIFNTRSBgaWQ6YCBmaWVsZC4gTm90XG4gICAqIG9yZGVyZWQsIGFuZCBub3QgYSBkYXRhYmFzZSBrZXkuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogVGhlIHRvcGljIHRoaXMgd2FzIGJyb2FkY2FzdCBvbjsgbGlzdGVuZXJzIG9uIG90aGVyIHRvcGljcyBuZXZlciBzZWUgaXQuICovXG4gIHRvcGljOiBzdHJpbmc7XG4gIC8qKiBDYWxsZXItY2hvc2VuIGV2ZW50IG5hbWUsIGUuZy4gYG9yZGVyLnVwZGF0ZWRgLiBOZXZlciBlbXB0eS4gKi9cbiAgdHlwZTogc3RyaW5nO1xuICAvKiogQXV0b21hdGljIGNvbnRleHQgbWVyZ2VkIHdpdGggY2FsbGVyIG1ldGFkYXRhLiBTZWUge0BsaW5rIFRvcGljTWV0YWRhdGF9LiAqL1xuICBtZXRhZGF0YTogVG9waWNNZXRhZGF0YTtcbiAgLyoqIFRoZSBjYWxsZXIncyBwYXlsb2FkLCB1bmNoYW5nZWQuICovXG4gIGJvZHk6IFRCb2R5O1xuICAvKipcbiAgICogSVNPLTg2MDEgcHVibGlzaCB0aW1lIGZyb20gdGhlIFBVQkxJU0hJTkcgcHJvY2VzcydzIGNsb2NrLCBub3QgdGhlIGRhdGFiYXNlJ3MuXG4gICAqIEZpbmUgZm9yIGRpc3BsYXk7IGRvIG5vdCBvcmRlciBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCBpbnN0YW5jZXMgYnkgaXQuXG4gICAqL1xuICBwdWJsaXNoZWRBdDogc3RyaW5nO1xufVxuXG4vKiogV2hhdCBhIGNhbGxlciBzdXBwbGllcyB0byB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY1B1Ymxpc2hJbnB1dDxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlID0gU2VyaWFsaXphYmxlVmFsdWU+IHtcbiAgLyoqIEV2ZW50IG5hbWUsIGUuZy4gYGNoYXQubWVzc2FnZWAuIE11c3QgYmUgbm9uLWJsYW5rLiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb250ZXh0IHRvIGF0dGFjaC4gV2lucyBvdmVyIGFueSBhdXRvbWF0aWMga2V5IG9mIHRoZSBzYW1lIG5hbWUsIHNvIGEgY2FsbGVyXG4gICAqIGNhbiBvdmVycmlkZSBhIG1hY2hpbmUgZGVmYXVsdCAoYHByb2plY3RgKSBvciBhZGQgaXRzIG93biAoYHRyYWNlSWRgKS5cbiAgICovXG4gIG1ldGFkYXRhPzogVG9waWNNZXRhZGF0YTtcbiAgLyoqIFRoZSBwYXlsb2FkLiBNdXN0IHNhdGlzZnkgYG9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlYC4gKi9cbiAgYm9keTogVEJvZHk7XG59XG5cbi8qKlxuICogU3Vic2NyaWJlciBjYWxsYmFjay4gSW52b2tlZCBvbmNlIHBlciBtYXRjaGluZyBtZXNzYWdlIG9uIHRoZSBub3RpZmljYXRpb25cbiAqIGNvbm5lY3Rpb24ncyBjYWxsYmFjaywgc28gaXQgc2hvdWxkIG5vdCBibG9jazogYSByZXR1cm5lZCBwcm9taXNlIGlzIGF3YWl0ZWRcbiAqIG9ubHkgdG8gcm91dGUgYSByZWplY3Rpb24gdG8gYG9uRXJyb3JgLCBhbmQgbGlzdGVuZXJzIGZvciBvbmUgbWVzc2FnZSBydW5cbiAqIGNvbmN1cnJlbnRseSByYXRoZXIgdGhhbiBpbiByZWdpc3RyYXRpb24gb3JkZXIuXG4gKlxuICogYFRCb2R5YCBpcyB1bmNoZWNrZWQgYXQgcnVudGltZS4gVGhlIGJ1cyBndWFyYW50ZWVzIHRoZSBib2R5IGlzIHNlcmlhbGl6YWJsZSxcbiAqIG5vdCB0aGF0IGl0IG1hdGNoZXMgdGhlIHR5cGUgcGFyYW1ldGVyLCBzbyB2YWxpZGF0ZSBhbnl0aGluZyBhIGxpc3RlbmVyXG4gKiBicmFuY2hlcyBvbi5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNMaXN0ZW5lcjxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlID0gU2VyaWFsaXphYmxlVmFsdWU+ID0gKFxuICBtZXNzYWdlOiBUb3BpY01lc3NhZ2U8VEJvZHk+LFxuKSA9PiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG5cbi8qKlxuICogUmVzb2x2ZXMgbWV0YWRhdGEgYXQgcHVibGlzaCB0aW1lIGluc3RlYWQgb2YgY29uc3RydWN0aW9uIHRpbWUsIGZvciBjb250ZXh0IGFcbiAqIHByb2Nlc3MgbGVhcm5zIGxhdGUgb3IgYXN5bmNocm9ub3VzbHkgLSBhbiBpbnN0YW5jZSBpZCBmcm9tIGEgY29udHJvbCBwbGFuZSwgYVxuICogZGlzY292ZXJlZCBhZGRyZXNzIGEgY2FsbGVyIGNob29zZXMgdG8gYXR0YWNoLiBDYWxsZWQgb24gZXZlcnkgYnJvYWRjYXN0LCBzb1xuICogbWVtb2l6ZSBhbnl0aGluZyBleHBlbnNpdmU7IGEgcmVqZWN0aW9uIGZhaWxzIHRoZSBicm9hZGNhc3QuXG4gKi9cbmV4cG9ydCB0eXBlIFRvcGljTWV0YWRhdGFQcm92aWRlciA9ICgpID0+IFRvcGljTWV0YWRhdGEgfCBQcm9taXNlTGlrZTxUb3BpY01ldGFkYXRhPjtcblxuLyoqIENvbnN0cnVjdGlvbiBvcHRpb25zIGZvciB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1c30uICovXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoYXQgaWRlbnRpZmllcyB0aGlzIGNoYW5uZWwgLSBhbnl0aGluZywgbm90IGp1c3QgYW4gaWRlbnRpZmllcjogYSBuYW1lLCBhblxuICAgKiBpZCwgYSBgW2VudiwgZmVhdHVyZV1gIHBhaXIsIGEgY29uZmlnIG9iamVjdC4gVGhlIHBhcnRzIGFyZSB0b2tlbml6ZWQgaW50byBhXG4gICAqIGxlZ2FsIFBvc3RncmVzIGNoYW5uZWwgbmFtZSB3aXRoIGEgc2hvcnQgaGFzaCBvZiB0aGUgb3JpZ2luYWxzIGFwcGVuZGVkLCBzb1xuICAgKiB0aGUgZGVyaXZhdGlvbiBpcyBkZXRlcm1pbmlzdGljIGFuZCBubyBjYWxsIHNpdGUgaGFzIHRvIHNhbml0aXplLiBTZWVcbiAgICoge0BsaW5rIFBvc3RncmVzVG9waWNCdXMuY2hhbm5lbE5hbWV9IGZvciB0aGUgcmVzb2x2ZWQgbmFtZS5cbiAgICpcbiAgICogT25lIHZhbHVlIG9yIG1hbnk6IGFuIGFycmF5IGlzIHJlYWQgYXMgbXVsdGlwbGUgcGFydHNcbiAgICogKHtAbGluayBvYmplY3QuT25lT3JNYW55fSksIGFueXRoaW5nIGVsc2UgYXMgYSBzaW5nbGUgcGFydC4gU29cbiAgICogYFtcImJpbGxpbmdcIiwgXCJwcm9kXCJdYCBhbmQgYFwiYmlsbGluZ19wcm9kXCJgIGFyZSBkaWZmZXJlbnQgY2hhbm5lbHMsIHNpbmNlIHRoZVxuICAgKiBoYXNoIHNlZXMgZGlmZmVyZW50IHN0cnVjdHVyZS5cbiAgICpcbiAgICogRXZlcnkgcGFydGljaXBhdGluZyBwcm9jZXNzIG11c3QgcGFzcyBFUVVJVkFMRU5UIHBhcnRzLCBzaW5jZSBhIGRpZmZlcmVudFxuICAgKiBzcGVsbGluZyBoYXNoZXMgdG8gYSBkaWZmZXJlbnQgY2hhbm5lbC4gRGVmYXVsdHMgdG8gYSBzaGFyZWRcbiAgICogYGRieF90b29sc190b3BpY19idXNgIGNoYW5uZWwuXG4gICAqL1xuICBjaGFubmVsPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4dHJhIGNvbnRleHQgYWRkZWQgdG8gZXZlcnkgbWVzc2FnZSB0aGlzIGJ1cyBwdWJsaXNoZXMsIGVpdGhlciBhIGZpeGVkXG4gICAqIHJlY29yZCBvciBhIHtAbGluayBUb3BpY01ldGFkYXRhUHJvdmlkZXJ9IGNhbGxlZCBwZXIgYnJvYWRjYXN0LiBPdmVycmlkZXNcbiAgICogYXV0b21hdGljIG1hY2hpbmUga2V5czsgcGVyLWNhbGwgYG1ldGFkYXRhYCBvdmVycmlkZXMgdGhpcy5cbiAgICovXG4gIG1ldGFkYXRhPzogVG9waWNNZXRhZGF0YSB8IFRvcGljTWV0YWRhdGFQcm92aWRlcjtcbiAgLyoqXG4gICAqIFNpbmsgZm9yIGZhaWx1cmVzIHRoYXQgaGF2ZSBubyBjYWxsZXIgdG8gdGhyb3cgdG86IGEgbGlzdGVuZXIgdGhhdCByZWplY3RlZCxcbiAgICogYSBkcm9wcGVkIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uLCBhIGZhaWxlZCByZWNvbm5lY3QgYXR0ZW1wdC4gRGVmYXVsdHMgdG9cbiAgICogc3dhbGxvd2luZyB0aGVtLCBzbyB3aXJlIHRoaXMgdG8gYSBsb2dnZXIgaW4gYW55dGhpbmcgbG9uZy1ydW5uaW5nLlxuICAgKi9cbiAgb25FcnJvcj86IChjYXVzZTogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBEcm9wIGtleXMgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAsIHNvIGFuIHVuc2V0IGVudmlyb25tZW50IHZhcmlhYmxlIGxlYXZlc1xuICogdGhlIGtleSBBQlNFTlQgcmF0aGVyIHRoYW4gcHJlc2VudC1hbmQtbnVsbC4gQWJzZW5jZSBpcyB3aGF0IGxldHMgY2FsbGVyXG4gKiBtZXRhZGF0YSBhbmQgbGF0ZXIgbWVyZ2UgbGF5ZXJzIHN1cHBseSB0aGUga2V5IGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZWRNZXRhZGF0YSh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZVZhbHVlIHwgdW5kZWZpbmVkPik6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIFNlcmlhbGl6YWJsZVZhbHVlXSA9PiB7XG4gICAgICByZXR1cm4gZW50cnlbMV0gIT09IHVuZGVmaW5lZDtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBDb250ZXh0IGV2ZXJ5IG1lc3NhZ2UgZ2V0cyBmb3IgZnJlZTogd2hpY2ggcHJvamVjdCwgaG9zdCwgYW5kIGRlcGxveW1lbnRcbiAqIHB1Ymxpc2hlZCBpdC5cbiAqXG4gKiBSZWFkIGZyZXNoIHBlciBicm9hZGNhc3QgcmF0aGVyIHRoYW4gY2FjaGVkLCBiZWNhdXNlIGEgbG9uZy1saXZlZCBwcm9jZXNzIGNhblxuICogYmUgcmUtcGFyZW50ZWQgKGEgZGVwbG95bWVudCBpZCBhcHBlYXJpbmcgYWZ0ZXIgYm9vdCkuIEtleXMgdGhhdCByZXNvbHZlIHRvXG4gKiBub3RoaW5nIGFyZSBvbWl0dGVkLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgaW5jbHVkZWQ6IHB1YmxpYy9jbGllbnQgSVAsIHByb2Nlc3MgaWQsIENQVSBhcmNoaXRlY3R1cmUsXG4gKiBydW50aW1lIG5hbWUsIGFuZCBydW50aW1lIHZlcnNpb24uIElQcyBhbmQgcGlkcyBhcmUgbm9pc3ksIG9mdGVuIHNlbnNpdGl2ZSxcbiAqIGFuZCBidXJuIGBOT1RJRllgIHBheWxvYWQgYnVkZ2V0OyBhcmNoaXRlY3R1cmUvcnVudGltZSBhcmUgY29uc3RhbnQgcGVyXG4gKiBkZXBsb3ltZW50IGFuZCBwYXkgdGhlIHNhbWUgY29zdC4gQSBwcm9jZXNzIHRoYXQgd2FudHMgYW55IG9mIHRoZW0gcGFzc2VzIGFcbiAqIHtAbGluayBUb3BpY01ldGFkYXRhUHJvdmlkZXJ9IG9yIHBlci1tZXNzYWdlIGBtZXRhZGF0YWAuXG4gKi9cbmZ1bmN0aW9uIG1hY2hpbmVNZXRhZGF0YSgpOiBUb3BpY01ldGFkYXRhIHtcbiAgcmV0dXJuIGRlZmluZWRNZXRhZGF0YSh7XG4gICAgcHJvamVjdDpcbiAgICAgIHN0cmluZy5maXJzdE5vbkVtcHR5KFtcbiAgICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19CVU5ETEVfTkFNRSxcbiAgICAgICAgcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FLFxuICAgICAgICBwcm9jZXNzLmVudi5ucG1fcGFja2FnZV9uYW1lLFxuICAgICAgXSkgPz8gdW5kZWZpbmVkLFxuICAgIGhvc3RuYW1lOiBob3N0bmFtZSgpLFxuICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgIGVudmlyb25tZW50OiBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudi5OT0RFX0VOVikgPz8gdW5kZWZpbmVkLFxuICAgIGFwcE5hbWU6IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX05BTUUpID8/IHVuZGVmaW5lZCxcbiAgICBkZXBsb3ltZW50SWQ6IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQVBQX0RFUExPWU1FTlRfSUQpID8/IHVuZGVmaW5lZCxcbiAgICBkYXRhYnJpY2tzSG9zdDogc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUKSA/PyB1bmRlZmluZWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IG9mIHRoZSBzaWduZWQtaW4gdXNlciBvbiB3aG9zZSBiZWhhbGYgdGhpcyBicm9hZGNhc3QgaGFwcGVucywgd2hlbiB0aGVcbiAqIHByb2Nlc3MgY2FuIHRlbGwuXG4gKlxuICogYEBkYXRhYnJpY2tzL2FwcGtpdGAgaXMgYW4gT1BUSU9OQUwgcGVlciwgc28gdGhlIGltcG9ydCBpcyBsYXp5IGFuZCBhIG1pc3NpbmdcbiAqIG1vZHVsZSBpcyBub3QgYW4gZXJyb3IgLSB0aGlzIGlzIGEgcGxhaW4gUG9zdGdyZXMgcGFja2FnZSB0aGF0IGFkZHMgc2VuZGVyXG4gKiBpZGVudGl0eSB3aGVuIGl0IGhhcHBlbnMgdG8gcnVuIGluc2lkZSBhbiBBcHBLaXQgYXBwLiBPdXRzaWRlIGFuIGFjdGl2ZVxuICogcGVyLXJlcXVlc3QgZXhlY3V0aW9uIGNvbnRleHQgQXBwS2l0IHRocm93cywgd2hpY2ggbWVhbnMgXCJubyB1c2VyIGhlcmVcIiwgc28gdGhlXG4gKiByZXN1bHQgaXMgZW1wdHkgbWV0YWRhdGEgcmF0aGVyIHRoYW4gYSBmYWlsZWQgYnJvYWRjYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzZW5kZXJNZXRhZGF0YSgpOiBQcm9taXNlPFRvcGljTWV0YWRhdGE+IHtcbiAgYXBwS2l0TW9kdWxlID8/PSBpbXBvcnQoXCJAZGF0YWJyaWNrcy9hcHBraXRcIilcbiAgICAudGhlbigobW9kdWxlKSA9PiBtb2R1bGUgYXMgQXBwS2l0TW9kdWxlKVxuICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICBjb25zdCBhcHBraXQgPSBhd2FpdCBhcHBLaXRNb2R1bGU7XG4gIGlmICghYXBwa2l0KSByZXR1cm4ge307XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGV4dCA9IGFwcGtpdC5nZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgcmV0dXJuIGRlZmluZWRNZXRhZGF0YSh7XG4gICAgICBzZW5kZXJJZDogc3RyaW5nLnRyaW1Ub051bGwoY29udGV4dC51c2VySWQpID8/IHVuZGVmaW5lZCxcbiAgICAgIHNlbmRlck5hbWU6IHN0cmluZy50cmltVG9OdWxsKGNvbnRleHQudXNlck5hbWUpID8/IHVuZGVmaW5lZCxcbiAgICAgIHNlbmRlckVtYWlsOiBzdHJpbmcudHJpbVRvTnVsbChjb250ZXh0LnVzZXJFbWFpbCkgPz8gdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmUgYSBsZWdhbCBQb3N0Z3JlcyBjaGFubmVsIG5hbWUgZnJvbSB3aGF0ZXZlciBhIGNhbGxlciB1c2VkIHRvIGlkZW50aWZ5XG4gKiB0aGUgY2hhbm5lbC5cbiAqXG4gKiBDYWxsZXJzIHRoaW5rIGluIHRlcm1zIG9mIHdoYXQgdGhlIGNoYW5uZWwgSVMgLSBhbiBhcHAgbmFtZSwgYSB0ZW5hbnQgaWQsIGFcbiAqIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0IC0gYW5kIG5vbmUgb2YgdGhvc2UgYXJlIGlkZW50aWZpZXJzLlxuICogUmVqZWN0aW5nIHRoZW0gcHVzaGVkIHRoZSBzYW5pdGl6aW5nIG9udG8gZXZlcnkgY2FsbCBzaXRlLCB3aGljaCBpcyBob3cgdHdvXG4gKiBzZXJ2aWNlcyBlbmQgdXAgZGlzYWdyZWVpbmcgYWJvdXQgd2hldGhlciB0aGUgY2hhbm5lbCBpcyBgbXktYXBwYCwgYG15X2FwcGAsXG4gKiBvciBgbXlBcHBgIGFuZCBzaWxlbnRseSBuZXZlciBoZWFyIGVhY2ggb3RoZXIuXG4gKlxuICogVGhlIHBhcnRzIGFyZSB0b2tlbml6ZWQgYW5kIGpvaW5lZCBpbnRvIGFuIGlkZW50aWZpZXIsIHRoZW4gYSBzaG9ydCBoYXNoIG9mIHRoZVxuICogT1JJR0lOQUwgcGFydHMgaXMgYXBwZW5kZWQuIFRoZSBoYXNoIGlzIHdoYXQgbWFrZXMgdGhlIG1hcHBpbmcgdHJ1c3R3b3J0aHk6XG4gKiB0b2tlbml6aW5nIGFsb25lIGlzIGxvc3N5LCBzbyBgbXktYXBwYCBhbmQgYG15X2FwcGAgYW5kIGBteUFwcGAgd291bGQgY29sbGFwc2VcbiAqIG9udG8gb25lIGNoYW5uZWwsIGFuZCBhIG5hbWUgbG9uZyBlbm91Z2ggdG8gaGl0IGBOQU1FREFUQUxFTmAgd291bGQgY29sbGlkZVxuICogd2l0aCBhbnl0aGluZyBzaGFyaW5nIGl0cyBsZWFkaW5nIHRva2Vucy4gV2l0aCB0aGUgc3VmZml4LCB0aGUgcmVhZGFibGUgcGFydFxuICogc3RheXMgcmVhZGFibGUgYW5kIGRpc3RpbmN0IGlucHV0cyBzdGF5IGRpc3RpbmN0LlxuICpcbiAqIERldGVybWluaXN0aWMgYWNyb3NzIHByb2Nlc3NlcyBhbmQgcnVucywgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IC0gdHdvXG4gKiBzZXJ2aWNlcyBnaXZlbiB0aGUgc2FtZSBwYXJ0cyBtdXN0IGxhbmQgb24gdGhlIHNhbWUgY2hhbm5lbCB3aXRob3V0XG4gKiBjb29yZGluYXRpbmcuIEhhc2ggaW5wdXRzIGFyZSBzdHJ1Y3R1cmUtYXdhcmUsIHNvIGBbXCJhXCIsIFwiYlwiXWAgYW5kIGBbXCJhX2JcIl1gXG4gKiBkaWZmZXIsIGFuZCBvYmplY3Qga2V5IG9yZGVyIGRvZXMgbm90LlxuICovXG5mdW5jdGlvbiBjaGFubmVsTmFtZShwYXJ0czogb2JqZWN0Lk9uZU9yTWFueTx1bmtub3duPik6IHN0cmluZyB7XG4gIC8vIEhhc2ggdGhlIENBTk9OSUNBTCBmb3JtLCB0aGUgc2FtZSBydWxlIGBhZHZpc29yeUxvY2tJZGAgdXNlcywgc28gc3RydWN0dXJlIGFuZFxuICAvLyB0eXBlcyBkZWNpZGUgaWRlbnRpdHk6IGBbXCJhXCIsXCJiXCJdYCBkaWZmZXJzIGZyb20gYFtcImFiXCJdYCwgYDFgIGZyb20gYFwiMVwiYCwgYW5kXG4gIC8vIG9iamVjdCBrZXkgb3JkZXIgZG9lcyBub3QgbWF0dGVyLiBIYXNoaW5nIHRoZSByYXcgcGFydHMgd291bGQgaW5zdGVhZCBsZWFuIG9uXG4gIC8vIHRoZSBoYXNoIG1vZHVsZSdzIGNhbm9uaWNhbGl6ZXIsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi5cbiAgY29uc3Qgc3VmZml4ID0gaGFzaC5mbnZIYXNoV2l0aE9wdGlvbnMoXG4gICAgeyBsZW5ndGg6IENIQU5ORUxfSEFTSF9MRU5HVEggfSxcbiAgICBwYXJ0cy5tYXAoKHBhcnQpID0+IG9iamVjdC50b1N0YWJsZUtleShwYXJ0KSkuam9pbihcIlxcdTAwMDBcIiksXG4gICk7XG4gIC8vIE9ubHkgcGFydHMgdGhhdCBzdHJpbmdpZnkgdG8gc29tZXRoaW5nIGEgcmVhZGVyIHJlY29nbml6ZXMgY29udHJpYnV0ZSB0byB0aGVcbiAgLy8gcmVhZGFibGUgaGFsZi4gQW4gb2JqZWN0IHdvdWxkIHRva2VuaXplIGZyb20gYFN0cmluZyh2YWx1ZSlgIGFzXG4gIC8vIGBvYmplY3Rfb2JqZWN0YCwgd2hpY2ggaXMgbm9pc2UgLSBpdCBzdGlsbCBzaGFwZXMgdGhlIGhhc2gsIHNvIGlkZW50aXR5IGlzXG4gIC8vIHVuYWZmZWN0ZWQuXG4gIGNvbnN0IGxhYmVsbGVkID0gcGFydHMuZmlsdGVyKChwYXJ0KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBwYXJ0O1xuICAgIHJldHVybiB0eXBlID09PSBcInN0cmluZ1wiIHx8IHR5cGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgfHwgdHlwZSA9PT0gXCJiaWdpbnRcIjtcbiAgfSk7XG4gIC8vIFRydW5jYXRlIHJhdGhlciB0aGFuIGNhcCB0aHJvdWdoIHRoZSB0b2tlbml6ZXI6IGB0cmltYCB3b3VsZCBEUk9QIGEgc2luZ2xlXG4gIC8vIHRva2VuIGxvbmdlciB0aGFuIHRoZSBidWRnZXQsIHR1cm5pbmcgb25lIGxvbmcgbmFtZSBpbnRvIHRoZSBiYXJlIGZhbGxiYWNrIGFuZFxuICAvLyBtYWtpbmcgZXZlcnkgbG9uZyBuYW1lIGxvb2sgYWxpa2UuIFRoZSBoYXNoIHN0aWxsIHNlcGFyYXRlcyB0aGVtLCBidXQgdGhlXG4gIC8vIGNoYW5uZWwgaXMgdW5yZWFkYWJsZSBpbiBhIGxvZy5cbiAgY29uc3QgYm9keSA9IHN0cmluZ1xuICAgIC50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyh7IGRlbGltaXRlcjogXCJfXCIgfSwgLi4ubGFiZWxsZWQpXG4gICAgLnNsaWNlKDAsIE1BWF9DSEFOTkVMX0xFTkdUSCAtIHN1ZmZpeC5sZW5ndGggLSAxKVxuICAgIC5yZXBsYWNlKC9fKyQvLCBcIlwiKTtcbiAgLy8gQW4gaWRlbnRpZmllciBjYW5ub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0IGFuZCB0aGUgaGFzaCBhbHBoYWJldCBpc1xuICAvLyBkaWdpdC1sZWFkaW5nLCBzbyBhIG51bWVyaWMgb3IgZW1wdHkgYm9keSBuZWVkcyBhIGxldHRlciBpbiBmcm9udC5cbiAgY29uc3QgcHJlZml4ID0gL15bQS1aYS16X10vLnRlc3QoYm9keSkgPyBib2R5IDogYCR7Q0hBTk5FTF9GQUxMQkFDS31fJHtib2R5fWA7XG4gIHJldHVybiBgJHtwcmVmaXh9XyR7c3VmZml4fWAucmVwbGFjZSgvXysvZywgXCJfXCIpO1xufVxuXG4vKiogUXVvdGUgYSB2YWxpZGF0ZWQgY2hhbm5lbCBmb3IgYExJU1RFTmAvYFVOTElTVEVOYCwgd2hpY2ggdGFrZSBubyBwYXJhbWV0ZXJzLiAqL1xuZnVuY3Rpb24gcXVvdGVJZGVudGlmaWVyKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFwiJHt2YWx1ZS5yZXBsYWNlQWxsKCdcIicsICdcIlwiJyl9XCJgO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgYE5PVElGWWAgcGF5bG9hZCBpbnRvIGFuIGVudmVsb3BlLCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgZm9yIGFueXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBvbmUuXG4gKlxuICogVGhlIGNoYW5uZWwgaXMgc2hhcmVkIGFuZCBhbnkgUG9zdGdyZXMgc2Vzc2lvbiBjYW4gYHBnX25vdGlmeWAgb24gaXQsIHNvIGFuXG4gKiB1bnJlY29nbml6ZWQgcGF5bG9hZCBpcyBleHBlY3RlZCBpbnB1dCwgbm90IGFuIGV4Y2VwdGlvbi4gUHVibGlzaGVycyBydW4gdGhpc1xuICogb3ZlciB0aGVpciBvd24gZW5jb2RlZCBtZXNzYWdlIHRvbywgd2hpY2ggaXMgaG93IGEgYm9keSB0aGF0IHN0cmluZ2lmaWVzIGJ1dFxuICogZG9lcyBub3Qgcm91bmQtdHJpcCBpcyBjYXVnaHQgYmVmb3JlIGl0IHNoaXBzLlxuICovXG5mdW5jdGlvbiBkZWNvZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRvcGljTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlY29yZCA9IGpzb24ucGFyc2VSZWNvcmQodmFsdWUpO1xuICBpZiAoXG4gICAgIXJlY29yZCB8fFxuICAgIHR5cGVvZiByZWNvcmQuaWQgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnRvcGljICE9PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHJlY29yZC50eXBlICE9PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHJlY29yZC5wdWJsaXNoZWRBdCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgICFyZWNvcmQubWV0YWRhdGEgfHxcbiAgICB0eXBlb2YgcmVjb3JkLm1ldGFkYXRhICE9PSBcIm9iamVjdFwiIHx8XG4gICAgQXJyYXkuaXNBcnJheShyZWNvcmQubWV0YWRhdGEpIHx8XG4gICAgIShcImJvZHlcIiBpbiByZWNvcmQpIHx8XG4gICAgIW9iamVjdC5pc1NlcmlhbGl6YWJsZVZhbHVlKHJlY29yZC5tZXRhZGF0YSkgfHxcbiAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUocmVjb3JkLmJvZHkpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpZDogcmVjb3JkLmlkLFxuICAgIHRvcGljOiByZWNvcmQudG9waWMsXG4gICAgdHlwZTogcmVjb3JkLnR5cGUsXG4gICAgbWV0YWRhdGE6IHJlY29yZC5tZXRhZGF0YSBhcyBUb3BpY01ldGFkYXRhLFxuICAgIGJvZHk6IHJlY29yZC5ib2R5IGFzIFNlcmlhbGl6YWJsZVZhbHVlLFxuICAgIHB1Ymxpc2hlZEF0OiByZWNvcmQucHVibGlzaGVkQXQsXG4gIH07XG59XG5cbi8qKlxuICogQnJvYWRjYXN0cyBzdHJ1Y3R1cmVkIG1lc3NhZ2VzIGJ5IHRvcGljIGFuZCBkZWxpdmVycyB0aGVtIHRvIGV2ZXJ5IHByb2Nlc3NcbiAqIGxpc3RlbmluZyBvbiB0aGUgc2FtZSBjaGFubmVsLlxuICpcbiAqIENPTk5FQ1RJT04gU0hBUEUuIFB1Ymxpc2hpbmcgYm9ycm93cyBhIHBvb2xlZCBjb25uZWN0aW9uIHBlciBjYWxsLCBsaWtlIGFueVxuICogb3RoZXIgcXVlcnkuIExpc3RlbmluZyBjYW5ub3Q6IGBMSVNURU5gIGlzIHNlc3Npb24gc3RhdGUsIHNvIHRoZSBidXMgaG9sZHMgT05FXG4gKiBkZWRpY2F0ZWQgY2xpZW50IG91dCBvZiB0aGUgcG9vbCBmb3IgYXMgbG9uZyBhcyBpdCBoYXMgc3Vic2NyaWJlcnMsIG5vIG1hdHRlclxuICogaG93IG1hbnkgdG9waWNzIG9yIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4gU2l6ZSB0aGUgcG9vbCB3aXRoIHRoYXQgb25lXG4gKiBsb25nLWxpdmVkIGNoZWNrb3V0IGluIG1pbmQuXG4gKlxuICogTElGRUNZQ0xFLiBDb25zdHJ1Y3Rpb24gaXMgaW5lcnQgLSBub3RoaW5nIGNvbm5lY3RzIHVudGlsIHRoZSBmaXJzdFxuICoge0BsaW5rIGxpc3Rlbn0gKG9yIGFuIGV4cGxpY2l0IHtAbGluayBzdGFydH0pLiB7QGxpbmsgY2xvc2V9IGlzIHJlcXVpcmVkIHRvIGdpdmVcbiAqIHRoZSBjb25uZWN0aW9uIGJhY2s7IGEgY2xvc2VkIGJ1cyBzdGF5cyBjbG9zZWQgYW5kIHRocm93cyBvbiBmdXJ0aGVyIHVzZSByYXRoZXJcbiAqIHRoYW4gc2lsZW50bHkgcmVjb25uZWN0aW5nLiBSZWdpc3RlciBpdCB3aXRoIHRoZSBob3N0J3Mgc2h1dGRvd24gaG9vay5cbiAqXG4gKiBGQUlMVVJFIEhBTkRMSU5HLiBBIGxvc3Qgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gcmVjb25uZWN0cyBvbiBpdHMgb3duIHdpdGhcbiAqIGJvdW5kZWQgYmFja29mZiB3aGlsZSBzdWJzY3JpYmVycyByZW1haW4sIHJlcG9ydGluZyBlYWNoIGZhaWxlZCBhdHRlbXB0IHRocm91Z2hcbiAqIGBvbkVycm9yYC4gTWVzc2FnZXMgcHVibGlzaGVkIGR1cmluZyB0aGUgZ2FwIGFyZSBsb3N0IC0gYE5PVElGWWAgaGFzIG5vIHJlcGxheS5cbiAqIEEgdGhyb3dpbmcgb3IgcmVqZWN0aW5nIGxpc3RlbmVyIG5ldmVyIGFmZmVjdHMgdGhlIHB1Ymxpc2hlciBvciB0aGUgb3RoZXJcbiAqIGxpc3RlbmVyczsgaXRzIGZhaWx1cmUgZ29lcyB0byBgb25FcnJvcmAuXG4gKlxuICogTm90IHNhZmUgdG8gc2hhcmUgb25lIGluc3RhbmNlIGFjcm9zcyB1bnJlbGF0ZWQgY2hhbm5lbHMgLSBjb25zdHJ1Y3Qgb25lIGJ1c1xuICogcGVyIGNoYW5uZWwuIFRoZSBjaGFubmVsIGl0c2VsZiBpcyBERVJJVkVEIGZyb20gdGhlIGBjaGFubmVsYCBvcHRpb24gcmF0aGVyXG4gKiB0aGFuIHRha2VuIGxpdGVyYWxseTsgc2VlIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzT3B0aW9ucy5jaGFubmVsfSBhbmRcbiAqIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmNoYW5uZWxOYW1lfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3RncmVzVG9waWNCdXMge1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIFBvc3RncmVzIGNoYW5uZWwgdGhpcyBidXMgbGlzdGVucyBhbmQgcHVibGlzaGVzIG9uLCBkZXJpdmVkIGZyb21cbiAgICogdGhlIGBjaGFubmVsYCBvcHRpb24uIFJlYWQgaXQgdG8gY29uZmlybSB0d28gcHJvY2Vzc2VzIGFncmVlLCBvciB0byBsb2cgd2hhdCBhXG4gICAqIHNldCBvZiBwYXJ0cyBhY3R1YWxseSByZXNvbHZlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IFRvcGljTWV0YWRhdGEgfCBUb3BpY01ldGFkYXRhUHJvdmlkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25FcnJvcjogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8VG9waWNMaXN0ZW5lcj4+KCk7XG4gIHByaXZhdGUgY2xpZW50OiBQb29sQ2xpZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YXJ0aW5nOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlY29ubmVjdGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWNvbm5lY3RBYm9ydCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2w6IFBnUG9vbExpa2UgJiBQZ1F1ZXJ5YWJsZSxcbiAgICBvcHRpb25zOiBQb3N0Z3Jlc1RvcGljQnVzT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICB0aGlzLmNoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWUoXG4gICAgICBvYmplY3QudG9PbmVPck1hbnkob3B0aW9ucy5jaGFubmVsID09PSB1bmRlZmluZWQgPyBERUZBVUxUX0NIQU5ORUwgOiBvcHRpb25zLmNoYW5uZWwpLFxuICAgICk7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgdGhpcy5vbkVycm9yID0gb3B0aW9ucy5vbkVycm9yID8/ICgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGRlZGljYXRlZCBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgYExJU1RFTmAuXG4gICAqXG4gICAqIElkZW1wb3RlbnQsIGFuZCBzYWZlIHRvIGNhbGwgY29uY3VycmVudGx5IC0gb3ZlcmxhcHBpbmcgY2FsbHMgYXdhaXQgdGhlIHNhbWVcbiAgICogaW4tZmxpZ2h0IGNvbm5lY3QuIHtAbGluayBsaXN0ZW59IGNhbGxzIHRoaXMsIHNvIGl0IGlzIG9ubHkgbmVlZGVkIHRvIHN1cmZhY2VcbiAgICogYSBjb25uZWN0aW9uIHByb2JsZW0gYXQgc3RhcnR1cCByYXRoZXIgdGhhbiBvbiBmaXJzdCBzdWJzY3JpYmUuIFRocm93cyBpZiB0aGVcbiAgICogYnVzIGlzIGNsb3NlZCwgb3IgaWYgdGhlIHBvb2wgY2Fubm90IGhhbmQgb3V0IGEgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICB0aGlzLnN0YXJ0aW5nID8/PSB0aGlzLmNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgbWVzc2FnZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGVudmVsb3BlIHRoYXQgd2FzIHNlbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIG9uY2UgUG9zdGdyZXMgaGFzIGFjY2VwdGVkIHRoZSBgTk9USUZZYCwgd2hpY2ggc2F5cyBub3RoaW5nIGFib3V0XG4gICAqIGFueW9uZSByZWNlaXZpbmcgaXQ6IHNlc3Npb25zIG5vdCBsaXN0ZW5pbmcgYXQgdGhhdCBtb21lbnQgbWlzcyBpdC4gUHVibGlzaGluZ1xuICAgKiBuZWVkcyBubyB7QGxpbmsgc3RhcnR9IGFuZCBubyBzdWJzY3JpYmVycy5cbiAgICpcbiAgICogVmFsaWRhdGlvbiBpcyBkZWxpYmVyYXRlbHkgZnJvbnQtbG9hZGVkLCBzaW5jZSBhIG1lc3NhZ2UgdGhhdCBmYWlscyBvbiB0aGVcbiAgICogd2lyZSBpcyBmYXIgaGFyZGVyIHRvIGRpYWdub3NlIHRoYW4gb25lIHJlamVjdGVkIGF0IHRoZSBjYWxsOiBgVHlwZUVycm9yYCBmb3IgYVxuICAgKiBibGFuayB0b3BpYyBvciB0eXBlLCBvciBhIGJvZHkvbWV0YWRhdGEgdGhhdCB3b3VsZCBub3Qgcm91bmQtdHJpcCB0aHJvdWdoIEpTT05cbiAgICogdW5jaGFuZ2VkIChgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgKTsgYFJhbmdlRXJyb3JgIHdoZW4gdGhlIGVuY29kZWRcbiAgICogZW52ZWxvcGUgZXhjZWVkcyB0aGUgYE5PVElGWWAgcGF5bG9hZCBsaW1pdCwgd2hpY2ggdGhlIGF1dG9tYXRpYyBtZXRhZGF0YVxuICAgKiBjb3VudHMgYWdhaW5zdCAtIHNlbmQgYSByZWZlcmVuY2UgYW5kIGxldCB0aGUgcmVjZWl2ZXIgZmV0Y2ggdGhlIHBheWxvYWQuXG4gICAqIFRocm93cyBpZiB0aGUgYnVzIGlzIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGJyb2FkY2FzdDxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlPihcbiAgICB0b3BpYzogc3RyaW5nLFxuICAgIGlucHV0OiBUb3BpY1B1Ymxpc2hJbnB1dDxUQm9keT4sXG4gICk6IFByb21pc2U8VG9waWNNZXNzYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKCFpbnB1dC50eXBlLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2UgdHlwZSBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICBpZiAoXG4gICAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUoaW5wdXQubWV0YWRhdGEgPz8ge30pIHx8XG4gICAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUoaW5wdXQuYm9keSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIG1ldGFkYXRhIGFuZCBib2R5IG11c3QgYmUgSlNPTiBzZXJpYWxpemFibGUgd2l0aG91dCBjb2VyY2lvblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpO1xuICAgIGNvbnN0IGF1dG9tYXRpYyA9IGF3YWl0IHRoaXMucmVzb2x2ZU1ldGFkYXRhKCk7XG4gICAgY29uc3QgbWVzc2FnZTogVG9waWNNZXNzYWdlPFRCb2R5PiA9IHtcbiAgICAgIGlkOiBoYXNoLmlkKCksXG4gICAgICB0b3BpYyxcbiAgICAgIHR5cGU6IGlucHV0LnR5cGUsXG4gICAgICBtZXRhZGF0YTogeyAuLi5hdXRvbWF0aWMsIC4uLmlucHV0Lm1ldGFkYXRhIH0sXG4gICAgICBib2R5OiBpbnB1dC5ib2R5LFxuICAgICAgcHVibGlzaGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIGxldCBlbmNvZGVkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTWVzc2FnZSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlOiAke2Vycm9yLmVycm9yTWVzc2FnZShjYXVzZSl9YCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlKGVuY29kZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlLCBtZXRhZGF0YSwgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZVwiKTtcbiAgICB9XG4gICAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKGVuY29kZWQsIFwidXRmOFwiKSA+IE1BWF9OT1RJRllfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3N0Z3JlcyBub3RpZmljYXRpb24gZXhjZWVkcyAke01BWF9OT1RJRllfQllURVN9IGJ5dGVzYCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucG9vbC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbdGhpcy5jaGFubmVsTmFtZSwgZW5jb2RlZF0pO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGZ1bmN0aW9uIHRoYXQgdW5zdWJzY3JpYmVzLlxuICAgKlxuICAgKiBDb25uZWN0cyBvbiBmaXJzdCB1c2UuIFNldmVyYWwgbGlzdGVuZXJzIG1heSBzaGFyZSBhIHRvcGljOyBlYWNoIGlzIGNhbGxlZFxuICAgKiBvbmNlIHBlciBtZXNzYWdlLiBPbmx5IG1lc3NhZ2VzIHB1Ymxpc2hlZCBBRlRFUiB0aGlzIHJlc29sdmVzIGFycml2ZSwgc29cbiAgICogc3Vic2NyaWJlIGJlZm9yZSB0cmlnZ2VyaW5nIHdoYXRldmVyIHlvdSBleHBlY3QgdG8gb2JzZXJ2ZS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHJlbW92ZXMganVzdCB0aGlzIGxpc3RlbmVyIGFuZCBpcyBzYWZlIHRvIGNhbGwgdHdpY2UuXG4gICAqIFRoZSBjb25uZWN0aW9uIHN0YXlzIG9wZW4gb25jZSB0aGUgbGFzdCBsaXN0ZW5lciBsZWF2ZXMgLSB7QGxpbmsgY2xvc2V9XG4gICAqIHJlbGVhc2VzIGl0IC0gc28gYSBidXMgdGhhdCBzdWJzY3JpYmVzIGFuZCB1bnN1YnNjcmliZXMgcGVyIHJlcXVlc3QgZG9lcyBub3RcbiAgICogY2h1cm4gY29ubmVjdGlvbnMuXG4gICAqL1xuICBhc3luYyBsaXN0ZW48VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBsaXN0ZW5lcjogVG9waWNMaXN0ZW5lcjxUQm9keT4sXG4gICk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmdldCh0b3BpYykgPz8gbmV3IFNldDxUb3BpY0xpc3RlbmVyPigpO1xuICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIgYXMgVG9waWNMaXN0ZW5lcik7XG4gICAgdGhpcy5saXN0ZW5lcnMuc2V0KHRvcGljLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgICAgaWYgKGxpc3RlbmVycy5zaXplID09PSAwKSB0aGlzLmxpc3RlbmVycy5kZWxldGUodG9waWMpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGF1dG9tYXRpYyBoYWxmIG9mIGEgbWVzc2FnZSdzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBQcmVjZWRlbmNlLCB3ZWFrZXN0IGZpcnN0OiBtYWNoaW5lL3Byb2Nlc3MgY29udGV4dCwgdGhlbiBBcHBLaXQgc2VuZGVyXG4gICAqIGlkZW50aXR5LCB0aGVuIHRoaXMgYnVzJ3MgY29uZmlndXJlZCBtZXRhZGF0YS4gVGhlIGNhbGxlcidzIHBlci1tZXNzYWdlXG4gICAqIG1ldGFkYXRhIGlzIGxheWVyZWQgb3ZlciB0aGUgcmVzdWx0IGluIHtAbGluayBicm9hZGNhc3R9LCBzbyB0aGUgbW9zdCBzcGVjaWZpY1xuICAgKiBzb3VyY2UgYWx3YXlzIHdpbnMgYW5kIG5vdGhpbmcgaGVyZSBjYW4gb3ZlcndyaXRlIGFuIGV4cGxpY2l0IGtleS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZU1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICAgIGNvbnN0IHNlbmRlciA9IGF3YWl0IHNlbmRlck1ldGFkYXRhKCk7XG4gICAgY29uc3QgY29uZmlndXJlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdGhpcy5tZXRhZGF0YSgpIDogKHRoaXMubWV0YWRhdGEgPz8ge30pO1xuICAgIHJldHVybiB7IC4uLm1hY2hpbmVNZXRhZGF0YSgpLCAuLi5zZW5kZXIsIC4uLmNvbmZpZ3VyZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgc3RvcCBkZWxpdmVyaW5nIG1lc3NhZ2VzLiBJZGVtcG90ZW50LlxuICAgKlxuICAgKiBDYW5jZWxzIGFueSBwZW5kaW5nIHJlY29ubmVjdCwgZHJvcHMgYWxsIGxpc3RlbmVycywgdGhlbiBgVU5MSVNURU5gcyBhbmRcbiAgICogcmV0dXJucyB0aGUgY2xpZW50IHRvIHRoZSBwb29sLiBBIGZhaWxlZCBgVU5MSVNURU5gIGlzIHJlcG9ydGVkIHRvIHRoZSBwb29sIGFzXG4gICAqIGEgcmVsZWFzZSBlcnJvciBzbyB0aGUgY29ubmVjdGlvbiBpcyBESVNDQVJERUQgcmF0aGVyIHRoYW4gaGFuZGVkIHRvIHRoZSBuZXh0XG4gICAqIGNhbGxlciBzdGlsbCBzdWJzY3JpYmVkIHRvIHRoZSBjaGFubmVsLiBEb2VzIG5vdCB0aHJvdzsgdGhlIGJ1cyBzdGF5cyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5yZWNvbm5lY3RBYm9ydC5hYm9ydChuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGF3YWl0IHRoaXMucmVjb25uZWN0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgIGxldCByZWxlYXNlRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFVOTElTVEVOICR7cXVvdGVJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICByZWxlYXNlRXJyb3IgPSBlcnJvci50b0Vycm9yKGNhdXNlKTtcbiAgICB9XG4gICAgY2xpZW50LnJlbGVhc2UocmVsZWFzZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBvdXQgb25lIGNsaWVudCwgYXR0YWNoIHRoZSBoYW5kbGVycywgYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBUaGUgaGFuZGxlcnMgYXJlIGF0dGFjaGVkIEJFRk9SRSB0aGUgYExJU1RFTmAgcm91bmQgdHJpcCBzbyBhIG5vdGlmaWNhdGlvbiBvclxuICAgKiBlcnJvciBhcnJpdmluZyBtaWQtc2V0dXAgaXMgbm90IG1pc3NlZC4gQW55IGZhaWx1cmUgLSBpbmNsdWRpbmcgdGhlIGJ1cyBiZWluZ1xuICAgKiBjbG9zZWQgd2hpbGUgdGhlIGNvbm5lY3Qgd2FzIGluIGZsaWdodCAtIGRldGFjaGVzIHRoZSBoYW5kbGVycyBhbmQgcmVsZWFzZXNcbiAgICogdGhlIGNsaWVudCBhcyBlcnJvcmVkLCBzbyBhIGhhbGYtY29uZmlndXJlZCBjb25uZWN0aW9uIG5ldmVyIHJldHVybnMgdG8gdGhlXG4gICAqIHBvb2wuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5vbihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBMSVNURU4gJHtxdW90ZUlkZW50aWZpZXIodGhpcy5jaGFubmVsTmFtZSl9YCk7XG4gICAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgY2xpZW50LnJlbGVhc2UoZXJyb3IudG9FcnJvcihjYXVzZSkpO1xuICAgICAgdGhyb3cgY2F1c2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIG9uZSBpbmJvdW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgdG9waWMncyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIElnbm9yZXMgb3RoZXIgY2hhbm5lbHMgYW5kIHVuZGVjb2RhYmxlIHBheWxvYWRzIC0gdGhlIGNoYW5uZWwgaXMgc2hhcmVkLCBzb1xuICAgKiBib3RoIGFyZSBvcmRpbmFyeSB0cmFmZmljLiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgY29uY3VycmVudGx5IGFuZCB0aGVpclxuICAgKiByZWplY3Rpb25zIGdvIHRvIGBvbkVycm9yYCwga2VlcGluZyBvbmUgc2xvdyBvciBicm9rZW4gc3Vic2NyaWJlciBmcm9tXG4gICAqIHN0YWxsaW5nIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5jaGFubmVsICE9PSB0aGlzLmNoYW5uZWxOYW1lKSByZXR1cm47XG4gICAgY29uc3QgbWVzc2FnZSA9IGRlY29kZShub3RpZmljYXRpb24ucGF5bG9hZCk7XG4gICAgaWYgKCFtZXNzYWdlKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycy5nZXQobWVzc2FnZS50b3BpYykgPz8gW10pIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZShsaXN0ZW5lcihtZXNzYWdlKSkuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gZHlpbmcsIHdoaWNoIGBwZ2AgcmVwb3J0cyBhcyBhbiBgZXJyb3JgXG4gICAqIGV2ZW50IHJhdGhlciB0aGFuIGEgcmVqZWN0ZWQgcXVlcnkuXG4gICAqXG4gICAqIFRoZSBjbGllbnQgaXMgdW51c2FibGUgYXQgdGhpcyBwb2ludCwgc28gaXQgaXMgZGV0YWNoZWQgYW5kIHJlbGVhc2VkIGFzXG4gICAqIGVycm9yZWQgKHdoaWNoIGRpc2NhcmRzIGl0KSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gUmVjb25uZWN0aW9uIG9ubHkgc3RhcnRzXG4gICAqIHdoZW4gdGhlcmUgaXMgc3RpbGwgc29tZW9uZSB0byBkZWxpdmVyIHRvLCBzbyBhbiBpZGxlIG9yIGNsb3NpbmcgYnVzIGRvZXMgbm90XG4gICAqIGhvbGQgYSBjb25uZWN0aW9uIG9wZW4gY2hhc2luZyBhIGNoYW5uZWwgbm9ib2R5IHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDbGllbnRFcnJvciA9IChjYXVzZTogRXJyb3IpOiB2b2lkID0+IHtcbiAgICB0aGlzLm9uRXJyb3IoY2F1c2UpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBjbGllbnQucmVsZWFzZShjYXVzZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VkIHx8IHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29ubmVjdGluZyA/Pz0gdGhpcy5yZWNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZS1lc3RhYmxpc2ggdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHdpdGggYm91bmRlZCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKlxuICAgKiBUaGUgZmlyc3QgYXR0ZW1wdCBpcyBpbW1lZGlhdGUsIHNpbmNlIHRoZSBjb21tb24gY2FzZSBpcyBhIHNpbmdsZSBkcm9wcGVkXG4gICAqIGNvbm5lY3Rpb24gdGhhdCByZWNvbm5lY3RzIGF0IG9uY2U7IHN1YnNlcXVlbnQgZGVsYXlzIGRvdWJsZSBmcm9tIDI1MG1zIHVwIHRvXG4gICAqIDVzIGFuZCBzdGF5IHRoZXJlLiBSZXRyaWVzIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBnaXZpbmcgdXAsIGJlY2F1c2UgYSBQb3N0Z3JlcyByZXN0YXJ0XG4gICAqIG9yIGEgcm90YXRlZCBMYWtlYmFzZSBjcmVkZW50aWFsIGlzIGEgcmVjb3ZlcmFibGUgb3V0YWdlIGFuZCBhIHNpbGVudGx5IGRlYWRcbiAgICogbGlzdGVuZXIgaXMgd29yc2UgdGhhbiBhIG5vaXN5IG9uZS4gU3RvcHMgd2hlbiB0aGUgYnVzIGNsb3NlcyBvciB0aGUgbGFzdFxuICAgKiBsaXN0ZW5lciBsZWF2ZXMsIGFuZCByZXBvcnRzIGV2ZXJ5IGZhaWxlZCBhdHRlbXB0IHRocm91Z2ggYG9uRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGRlbGF5ID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuY2xvc2VkICYmIHRoaXMubGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYXN5bmNVdGlsLnNsZWVwKGRlbGF5LCB0aGlzLnJlY29ubmVjdEFib3J0LnNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkVycm9yKGNhdXNlKTtcbiAgICAgICAgZGVsYXkgPSBkZWxheSA9PT0gMCA/IE1JTl9SRUNPTk5FQ1RfREVMQVlfTVMgOiBNYXRoLm1pbihkZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
500
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RvcGljLWJ1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXL0Ysb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBQzlDOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5QixxRkFBcUY7QUFDckYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsMEVBQTBFO0FBQzFFLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9COzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQWtCckM7Ozs7R0FJRztBQUNILElBQUksWUFBMkQsQ0FBQztBQTZHaEU7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQXFEO0lBQzVFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQXdDLEVBQUU7UUFDNUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsZUFBZTtJQUN0QixPQUFPLGVBQWUsQ0FBQztR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U0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxPQUFPO2dCQUNULENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixPQUFPO1lBQ1QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPO2dCQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQzdGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb3BpYyBmYW4tb3V0IG92ZXIgUG9zdGdyZVNRTCBgTElTVEVOYC9gTk9USUZZYCwgZm9yIHRlbGxpbmcgZXZlcnkgcnVubmluZ1xuICogaW5zdGFuY2Ugb2YgYW4gYXBwIHRoYXQgc29tZXRoaW5nIGhhcHBlbmVkLlxuICpcbiAqIFRoZSBzaWJsaW5nIGBhZHZpc29yeS1sb2NrYCBtb2R1bGUgaXMgYWJvdXQgbWFraW5nIHN1cmUgb25seSBPTkUgY29ubmVjdGlvblxuICogZG9lcyBhIHRoaW5nOyB0aGlzIG9uZSBpcyB0aGUgb3Bwb3NpdGUgLSBFVkVSWSBsaXN0ZW5pbmcgc2Vzc2lvbiBnZXRzIGV2ZXJ5XG4gKiBub3RpZmljYXRpb24uIFRoYXQgbWFrZXMgaXQgdGhlIHJpZ2h0IHByaW1pdGl2ZSBmb3IgbGl2ZSBVSSB1cGRhdGVzXG4gKiAoYW4gU1NFIHN0cmVhbSBwZXIgYnJvd3NlciB0YWIsIGEgY2FjaGUgaW52YWxpZGF0aW9uLCBhIHByZXNlbmNlIHBpbmcpIGFuZCB0aGVcbiAqIHdyb25nIG9uZSBmb3Igd29yayBkaXN0cmlidXRpb246IHRoZXJlIGFyZSBubyBjb21wZXRpbmcgY29uc3VtZXJzLCBubyBhY2tzLCBhbmRcbiAqIG5vIHJlcGxheS5cbiAqXG4gKiBEZWxpdmVyeSBpcyBiZXN0LWVmZm9ydCBhbmQgbGl2ZS4gYE5PVElGWWAgcmVhY2hlcyBzZXNzaW9ucyB0aGF0IGFyZSBsaXN0ZW5pbmdcbiAqIGF0IHRoZSBtb21lbnQgaXQgY29tbWl0cywgc28gYSBsaXN0ZW5lciB0aGF0IGNvbm5lY3RzIGEgc2Vjb25kIGxhdGVyIG5ldmVyIHNlZXNcbiAqIGl0LCBhbmQgYSBsaXN0ZW5lciB3aG9zZSBjb25uZWN0aW9uIGRyb3BzIG1pc3NlcyBldmVyeXRoaW5nIHVudGlsIHRoZSBidXNcbiAqIHJlY29ubmVjdHMuIFVzZSBhIHRhYmxlIG9yIGEgcXVldWUgd2hlbiBhIHN1YnNjcmliZXIgbmVlZHMgZHVyYWJpbGl0eS5cbiAqXG4gKiBPTkUgQ0hBTk5FTCwgTUFOWSBUT1BJQ1MuIEV2ZXJ5IGJ1cyBpbnN0YW5jZSBsaXN0ZW5zIG9uIGEgc2luZ2xlIFBvc3RncmVzXG4gKiBjaGFubmVsIChgY2hhbm5lbGAsIGRlZmF1bHQgYGRieF90b29sc190b3BpY19idXNgKSBhbmQgZmlsdGVycyBieSB0aGVcbiAqIGVudmVsb3BlJ3MgYHRvcGljYCBpbi1wcm9jZXNzLCBzbyBhZGRpbmcgYSB0b3BpYyBjb3N0cyBubyBjb25uZWN0aW9uIGFuZCBub1xuICogYExJU1RFTmAuIFRoZSB0cmFkZW9mZiBpcyB0aGF0IGV2ZXJ5IGxpc3RlbmluZyBzZXNzaW9uIGRlY29kZXMgZXZlcnkgbWVzc2FnZSBvblxuICogdGhlIGNoYW5uZWw7IGdpdmUgYSBnZW51aW5lbHkgaGlnaC12b2x1bWUsIHVucmVsYXRlZCBzdHJlYW0gaXRzIG93biBgY2hhbm5lbGBcbiAqIHJhdGhlciB0aGFuIGEgdG9waWMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGhvc3RuYW1lIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGFzeW5jIGFzIGFzeW5jVXRpbCwgZXJyb3IsIGhhc2gsIGpzb24sIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgTm90aWZpY2F0aW9uLCBQb29sQ2xpZW50IH0gZnJvbSBcInBnXCI7XG5cbmltcG9ydCB0eXBlIHsgUGdQb29sTGlrZSwgUGdRdWVyeWFibGUgfSBmcm9tIFwiLi9hZHZpc29yeS1sb2NrLnRzXCI7XG5cbi8qKlxuICogYEBkYngtdG9vbHMvc2hhcmVkLWNvcmVgIG93bnMgdGhlIEpTT04tcm91bmQtdHJpcCBydWxlOyB0aGlzIGFsaWFzIGp1c3Qga2VlcHMgdGhlXG4gKiBnZW5lcmljIHNpZ25hdHVyZXMgYmVsb3cgcmVhZGFibGUuIENvbnN1bWVycyBpbXBvcnQgdGhlIHR5cGUgZnJvbSBzaGFyZWQtY29yZS5cbiAqL1xudHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9IG9iamVjdC5TZXJpYWxpemFibGVWYWx1ZTtcblxuLyoqIENoYW5uZWwgcGFydHMgdXNlZCB3aGVuIGEgY2FsbGVyIG5hbWVzIG5vIGNoYW5uZWwgb2YgaXRzIG93bi4gKi9cbmNvbnN0IERFRkFVTFRfQ0hBTk5FTCA9IFwiZGJ4X3Rvb2xzX3RvcGljX2J1c1wiO1xuLyoqXG4gKiBgTkFNRURBVEFMRU4gLSAxYC4gUG9zdGdyZXMgVFJVTkNBVEVTIGEgbG9uZ2VyIGNoYW5uZWwgbmFtZSByYXRoZXIgdGhhblxuICogcmVqZWN0aW5nIGl0LCB3aGljaCB3b3VsZCBzcGxpdCBwdWJsaXNoZXJzIGFuZCBsaXN0ZW5lcnMgb250byBkaWZmZXJlbnRcbiAqIGNoYW5uZWxzIHdoaWxlIGV2ZXJ5IGNhbGwgbG9va2VkIGxpa2UgaXQgc3VjY2VlZGVkLlxuICovXG5jb25zdCBNQVhfQ0hBTk5FTF9MRU5HVEggPSA2Mztcbi8qKiBCYXNlLTMyIGNoYXJzIG9mIHRoZSBjaGFubmVsJ3MgaWRlbnRpdHkgc3VmZml4LiBNYXggNyAtIHRoZSBkaWdlc3QgaXMgMzIgYml0cy4gKi9cbmNvbnN0IENIQU5ORUxfSEFTSF9MRU5HVEggPSA2O1xuLyoqIEJvZHkgdXNlZCB3aGVuIHRoZSBwYXJ0cyB0b2tlbml6ZSB0byBub3RoaW5nLCBvciBsZWFkIHdpdGggYSBkaWdpdC4gKi9cbmNvbnN0IENIQU5ORUxfRkFMTEJBQ0sgPSBcImJ1c1wiO1xuLyoqXG4gKiBFbmNvZGVkLWVudmVsb3BlIGNlaWxpbmcuIFBvc3RncmVTUUwgY2FwcyBhIGBOT1RJRllgIHBheWxvYWQgYXQgODAwMCBieXRlcyBhbmRcbiAqIGZhaWxzIHRoZSBzdGF0ZW1lbnQgcGFzdCB0aGF0LCBzbyB0aGUgYnVzIHJlamVjdHMgdGhlIG1lc3NhZ2UgZmlyc3Qgd2l0aCBhIHNpemVcbiAqIGl0IGNhbiBuYW1lLiBUaGUgbWFyZ2luIGJlbG93IDgwMDAgY292ZXJzIHRoZSBzZXJ2ZXIncyBvd24gYWNjb3VudGluZy5cbiAqL1xuY29uc3QgTUFYX05PVElGWV9CWVRFUyA9IDdfOTAwO1xuY29uc3QgTUlOX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MDtcbmNvbnN0IE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMgPSA1XzAwMDtcblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIEFwcEtpdCdzIHBlci1yZXF1ZXN0IGV4ZWN1dGlvbiBjb250ZXh0IHRoZSBidXMgcmVhZHMgZm9yIHNlbmRlclxuICogaWRlbnRpdHkuIEZpZWxkcyBhcmUgYHVua25vd25gIGJlY2F1c2UgdGhpcyBpcyBhIHN0cnVjdHVyYWwgdmlldyBvZiBhbiBPUFRJT05BTFxuICogcGVlcjogdGhlIHZhbHVlcyBhcmUgdHJpbW1lZCBhbmQgdmFsaWRhdGVkIHJhdGhlciB0aGFuIHRydXN0ZWQuXG4gKi9cbnR5cGUgQXBwS2l0RXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgdXNlckVtYWlsPzogdW5rbm93bjtcbiAgdXNlcklkPzogdW5rbm93bjtcbiAgdXNlck5hbWU/OiB1bmtub3duO1xufTtcblxuLyoqIFN0cnVjdHVyYWwgdmlldyBvZiBgQGRhdGFicmlja3MvYXBwa2l0YCwgaW1wb3J0ZWQgbGF6aWx5IGFuZCBuZXZlciByZXF1aXJlZC4gKi9cbnR5cGUgQXBwS2l0TW9kdWxlID0ge1xuICBnZXRFeGVjdXRpb25Db250ZXh0KCk6IEFwcEtpdEV4ZWN1dGlvbkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIENhY2hlZCByZXN1bHQgb2YgdGhlIG9uZSBvcHRpb25hbC1wZWVyIGltcG9ydCwgcmVzb2x2ZWQgdG8gYHVuZGVmaW5lZGAgd2hlblxuICogQXBwS2l0IGlzIG5vdCBpbnN0YWxsZWQuIE1lbW9pemVkIHNvIGEgYnVzIGluIGEgcGxhaW4gUG9zdGdyZXMgcHJvY2VzcyBwYXlzIGZvclxuICogdGhlIGZhaWxlZCByZXNvbHV0aW9uIG9uY2UgaW5zdGVhZCBvZiBwZXIgYnJvYWRjYXN0LlxuICovXG5sZXQgYXBwS2l0TW9kdWxlOiBQcm9taXNlPEFwcEtpdE1vZHVsZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRmxhdC1rZXllZCBjb250ZXh0IHRyYXZlbGxpbmcgYWxvbmdzaWRlIGEgbWVzc2FnZSBib2R5OiB3aG8gc2VudCBpdCwgZnJvbVxuICogd2hlcmUsIGluIHdoaWNoIGRlcGxveW1lbnQuIFZhbHVlcyBtYXkgbmVzdCwgYnV0IHRoZSBrZXlzIGFyZSB0aGUgYWRkcmVzc2FibGVcbiAqIHBhcnQgLSBhIGxpc3RlbmVyIGZpbHRlcmluZyBvciBsYWJlbGxpbmcgbWVzc2FnZXMgcmVhZHMgYG1ldGFkYXRhLnVzZXJgLCBub3QgYVxuICogcGF0aCBpbnRvIHRoZSBib2R5LlxuICovXG5leHBvcnQgdHlwZSBUb3BpY01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWU+O1xuXG4vKipcbiAqIFRoZSB3aXJlIGVudmVsb3BlIGV2ZXJ5IHN1YnNjcmliZXIgcmVjZWl2ZXMsIGFuZCB3aGF0IHtAbGlua1xuICogUG9zdGdyZXNUb3BpY0J1cy5icm9hZGNhc3R9IHJldHVybnMgdG8gdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBgaWRgLCBgdG9waWNgLCBhbmQgYHB1Ymxpc2hlZEF0YCBhcmUgYXNzaWduZWQgYnkgdGhlIGJ1czsgYHR5cGVgLCBgbWV0YWRhdGFgLFxuICogYW5kIGBib2R5YCBjb21lIGZyb20gdGhlIGNhbGxlciAod2l0aCBhdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgdW5kZXJcbiAqIGBtZXRhZGF0YWApLiBUaGUgc2hhcGUgaXMgc3RhYmxlIGVub3VnaCB0byBoYW5kIHN0cmFpZ2h0IHRvIGFuIFNTRSBgZGF0YTpgXG4gKiBmcmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BpY01lc3NhZ2U8VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZSA9IFNlcmlhbGl6YWJsZVZhbHVlPiB7XG4gIC8qKlxuICAgKiBQZXItbWVzc2FnZSBpZGVudGl0eSBnZW5lcmF0ZWQgYnkgdGhlIHB1Ymxpc2hlciwgdW5pcXVlIGFjcm9zcyBpbnN0YW5jZXMuXG4gICAqIFN1aXRhYmxlIGZvciBkZWR1cGUgd2hlbiBhIGNsaWVudCByZWNvbm5lY3RzIGFuZCBmb3IgYW4gU1NFIGBpZDpgIGZpZWxkLiBOb3RcbiAgICogb3JkZXJlZCwgYW5kIG5vdCBhIGRhdGFiYXNlIGtleS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdG9waWMgdGhpcyB3YXMgYnJvYWRjYXN0IG9uOyBsaXN0ZW5lcnMgb24gb3RoZXIgdG9waWNzIG5ldmVyIHNlZSBpdC4gKi9cbiAgdG9waWM6IHN0cmluZztcbiAgLyoqIENhbGxlci1jaG9zZW4gZXZlbnQgbmFtZSwgZS5nLiBgb3JkZXIudXBkYXRlZGAuIE5ldmVyIGVtcHR5LiAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBBdXRvbWF0aWMgY29udGV4dCBtZXJnZWQgd2l0aCBjYWxsZXIgbWV0YWRhdGEuIFNlZSB7QGxpbmsgVG9waWNNZXRhZGF0YX0uICovXG4gIG1ldGFkYXRhOiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIGNhbGxlcidzIHBheWxvYWQsIHVuY2hhbmdlZC4gKi9cbiAgYm9keTogVEJvZHk7XG4gIC8qKlxuICAgKiBJU08tODYwMSBwdWJsaXNoIHRpbWUgZnJvbSB0aGUgUFVCTElTSElORyBwcm9jZXNzJ3MgY2xvY2ssIG5vdCB0aGUgZGF0YWJhc2Uncy5cbiAgICogRmluZSBmb3IgZGlzcGxheTsgZG8gbm90IG9yZGVyIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IGluc3RhbmNlcyBieSBpdC5cbiAgICovXG4gIHB1Ymxpc2hlZEF0OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IGEgY2FsbGVyIHN1cHBsaWVzIHRvIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzLmJyb2FkY2FzdH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcGljUHVibGlzaElucHV0PFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4ge1xuICAvKiogRXZlbnQgbmFtZSwgZS5nLiBgY2hhdC5tZXNzYWdlYC4gTXVzdCBiZSBub24tYmxhbmsuICovXG4gIHR5cGU6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnRleHQgdG8gYXR0YWNoLiBXaW5zIG92ZXIgYW55IGF1dG9tYXRpYyBrZXkgb2YgdGhlIHNhbWUgbmFtZSwgc28gYSBjYWxsZXJcbiAgICogY2FuIG92ZXJyaWRlIGEgbWFjaGluZSBkZWZhdWx0IChgcHJvamVjdGApIG9yIGFkZCBpdHMgb3duIChgdHJhY2VJZGApLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhO1xuICAvKiogVGhlIHBheWxvYWQuIE11c3Qgc2F0aXNmeSBgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgLiAqL1xuICBib2R5OiBUQm9keTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVyIGNhbGxiYWNrLiBJbnZva2VkIG9uY2UgcGVyIG1hdGNoaW5nIG1lc3NhZ2Ugb24gdGhlIG5vdGlmaWNhdGlvblxuICogY29ubmVjdGlvbidzIGNhbGxiYWNrLCBzbyBpdCBzaG91bGQgbm90IGJsb2NrOiBhIHJldHVybmVkIHByb21pc2UgaXMgYXdhaXRlZFxuICogb25seSB0byByb3V0ZSBhIHJlamVjdGlvbiB0byBgb25FcnJvcmAsIGFuZCBsaXN0ZW5lcnMgZm9yIG9uZSBtZXNzYWdlIHJ1blxuICogY29uY3VycmVudGx5IHJhdGhlciB0aGFuIGluIHJlZ2lzdHJhdGlvbiBvcmRlci5cbiAqXG4gKiBgVEJvZHlgIGlzIHVuY2hlY2tlZCBhdCBydW50aW1lLiBUaGUgYnVzIGd1YXJhbnRlZXMgdGhlIGJvZHkgaXMgc2VyaWFsaXphYmxlLFxuICogbm90IHRoYXQgaXQgbWF0Y2hlcyB0aGUgdHlwZSBwYXJhbWV0ZXIsIHNvIHZhbGlkYXRlIGFueXRoaW5nIGEgbGlzdGVuZXJcbiAqIGJyYW5jaGVzIG9uLlxuICovXG5leHBvcnQgdHlwZSBUb3BpY0xpc3RlbmVyPFRCb2R5IGV4dGVuZHMgU2VyaWFsaXphYmxlVmFsdWUgPSBTZXJpYWxpemFibGVWYWx1ZT4gPSAoXG4gIG1lc3NhZ2U6IFRvcGljTWVzc2FnZTxUQm9keT4sXG4pID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPjtcblxuLyoqXG4gKiBSZXNvbHZlcyBtZXRhZGF0YSBhdCBwdWJsaXNoIHRpbWUgaW5zdGVhZCBvZiBjb25zdHJ1Y3Rpb24gdGltZSwgZm9yIGNvbnRleHQgYVxuICogcHJvY2VzcyBsZWFybnMgbGF0ZSBvciBhc3luY2hyb25vdXNseSAtIGFuIGluc3RhbmNlIGlkIGZyb20gYSBjb250cm9sIHBsYW5lLCBhXG4gKiBkaXNjb3ZlcmVkIGFkZHJlc3MgYSBjYWxsZXIgY2hvb3NlcyB0byBhdHRhY2guIENhbGxlZCBvbiBldmVyeSBicm9hZGNhc3QsIHNvXG4gKiBtZW1vaXplIGFueXRoaW5nIGV4cGVuc2l2ZTsgYSByZWplY3Rpb24gZmFpbHMgdGhlIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9waWNNZXRhZGF0YVByb3ZpZGVyID0gKCkgPT4gVG9waWNNZXRhZGF0YSB8IFByb21pc2VMaWtlPFRvcGljTWV0YWRhdGE+O1xuXG4vKiogQ29uc3RydWN0aW9uIG9wdGlvbnMgZm9yIHtAbGluayBQb3N0Z3Jlc1RvcGljQnVzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNUb3BpY0J1c09wdGlvbnMge1xuICAvKipcbiAgICogV2hhdCBpZGVudGlmaWVzIHRoaXMgY2hhbm5lbCAtIGFueXRoaW5nLCBub3QganVzdCBhbiBpZGVudGlmaWVyOiBhIG5hbWUsIGFuXG4gICAqIGlkLCBhIGBbZW52LCBmZWF0dXJlXWAgcGFpciwgYSBjb25maWcgb2JqZWN0LiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBpbnRvIGFcbiAgICogbGVnYWwgUG9zdGdyZXMgY2hhbm5lbCBuYW1lIHdpdGggYSBzaG9ydCBoYXNoIG9mIHRoZSBvcmlnaW5hbHMgYXBwZW5kZWQsIHNvXG4gICAqIHRoZSBkZXJpdmF0aW9uIGlzIGRldGVybWluaXN0aWMgYW5kIG5vIGNhbGwgc2l0ZSBoYXMgdG8gc2FuaXRpemUuIFNlZVxuICAgKiB7QGxpbmsgUG9zdGdyZXNUb3BpY0J1cy5jaGFubmVsTmFtZX0gZm9yIHRoZSByZXNvbHZlZCBuYW1lLlxuICAgKlxuICAgKiBPbmUgdmFsdWUgb3IgbWFueTogYW4gYXJyYXkgaXMgcmVhZCBhcyBtdWx0aXBsZSBwYXJ0c1xuICAgKiAoe0BsaW5rIG9iamVjdC5PbmVPck1hbnl9KSwgYW55dGhpbmcgZWxzZSBhcyBhIHNpbmdsZSBwYXJ0LiBTb1xuICAgKiBgW1wiYmlsbGluZ1wiLCBcInByb2RcIl1gIGFuZCBgXCJiaWxsaW5nX3Byb2RcImAgYXJlIGRpZmZlcmVudCBjaGFubmVscywgc2luY2UgdGhlXG4gICAqIGhhc2ggc2VlcyBkaWZmZXJlbnQgc3RydWN0dXJlLlxuICAgKlxuICAgKiBFdmVyeSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3MgbXVzdCBwYXNzIEVRVUlWQUxFTlQgcGFydHMsIHNpbmNlIGEgZGlmZmVyZW50XG4gICAqIHNwZWxsaW5nIGhhc2hlcyB0byBhIGRpZmZlcmVudCBjaGFubmVsLiBEZWZhdWx0cyB0byBhIHNoYXJlZFxuICAgKiBgZGJ4X3Rvb2xzX3RvcGljX2J1c2AgY2hhbm5lbC5cbiAgICovXG4gIGNoYW5uZWw/OiB1bmtub3duO1xuICAvKipcbiAgICogRXh0cmEgY29udGV4dCBhZGRlZCB0byBldmVyeSBtZXNzYWdlIHRoaXMgYnVzIHB1Ymxpc2hlcywgZWl0aGVyIGEgZml4ZWRcbiAgICogcmVjb3JkIG9yIGEge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gY2FsbGVkIHBlciBicm9hZGNhc3QuIE92ZXJyaWRlc1xuICAgKiBhdXRvbWF0aWMgbWFjaGluZSBrZXlzOyBwZXItY2FsbCBgbWV0YWRhdGFgIG92ZXJyaWRlcyB0aGlzLlxuICAgKi9cbiAgbWV0YWRhdGE/OiBUb3BpY01ldGFkYXRhIHwgVG9waWNNZXRhZGF0YVByb3ZpZGVyO1xuICAvKipcbiAgICogU2luayBmb3IgZmFpbHVyZXMgdGhhdCBoYXZlIG5vIGNhbGxlciB0byB0aHJvdyB0bzogYSBsaXN0ZW5lciB0aGF0IHJlamVjdGVkLFxuICAgKiBhIGRyb3BwZWQgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24sIGEgZmFpbGVkIHJlY29ubmVjdCBhdHRlbXB0LiBEZWZhdWx0cyB0b1xuICAgKiBzd2FsbG93aW5nIHRoZW0sIHNvIHdpcmUgdGhpcyB0byBhIGxvZ2dlciBpbiBhbnl0aGluZyBsb25nLXJ1bm5pbmcuXG4gICAqL1xuICBvbkVycm9yPzogKGNhdXNlOiB1bmtub3duKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIERyb3Aga2V5cyB3aG9zZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYCwgc28gYW4gdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbGVhdmVzXG4gKiB0aGUga2V5IEFCU0VOVCByYXRoZXIgdGhhbiBwcmVzZW50LWFuZC1udWxsLiBBYnNlbmNlIGlzIHdoYXQgbGV0cyBjYWxsZXJcbiAqIG1ldGFkYXRhIGFuZCBsYXRlciBtZXJnZSBsYXllcnMgc3VwcGx5IHRoZSBrZXkgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lZE1ldGFkYXRhKHZhbHVlczogUmVjb3JkPHN0cmluZywgU2VyaWFsaXphYmxlVmFsdWUgfCB1bmRlZmluZWQ+KTogVG9waWNNZXRhZGF0YSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgW3N0cmluZywgU2VyaWFsaXphYmxlVmFsdWVdID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPT0gdW5kZWZpbmVkO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXZlcnkgbWVzc2FnZSBnZXRzIGZvciBmcmVlOiB3aGljaCBwcm9qZWN0LCBob3N0LCBhbmQgZGVwbG95bWVudFxuICogcHVibGlzaGVkIGl0LlxuICpcbiAqIFJlYWQgZnJlc2ggcGVyIGJyb2FkY2FzdCByYXRoZXIgdGhhbiBjYWNoZWQsIGJlY2F1c2UgYSBsb25nLWxpdmVkIHByb2Nlc3MgY2FuXG4gKiBiZSByZS1wYXJlbnRlZCAoYSBkZXBsb3ltZW50IGlkIGFwcGVhcmluZyBhZnRlciBib290KS4gS2V5cyB0aGF0IHJlc29sdmUgdG9cbiAqIG5vdGhpbmcgYXJlIG9taXR0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBpbmNsdWRlZDogcHVibGljL2NsaWVudCBJUCwgcHJvY2VzcyBpZCwgQ1BVIGFyY2hpdGVjdHVyZSxcbiAqIHJ1bnRpbWUgbmFtZSwgYW5kIHJ1bnRpbWUgdmVyc2lvbi4gSVBzIGFuZCBwaWRzIGFyZSBub2lzeSwgb2Z0ZW4gc2Vuc2l0aXZlLFxuICogYW5kIGJ1cm4gYE5PVElGWWAgcGF5bG9hZCBidWRnZXQ7IGFyY2hpdGVjdHVyZS9ydW50aW1lIGFyZSBjb25zdGFudCBwZXJcbiAqIGRlcGxveW1lbnQgYW5kIHBheSB0aGUgc2FtZSBjb3N0LiBBIHByb2Nlc3MgdGhhdCB3YW50cyBhbnkgb2YgdGhlbSBwYXNzZXMgYVxuICoge0BsaW5rIFRvcGljTWV0YWRhdGFQcm92aWRlcn0gb3IgcGVyLW1lc3NhZ2UgYG1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWFjaGluZU1ldGFkYXRhKCk6IFRvcGljTWV0YWRhdGEge1xuICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICBwcm9qZWN0OlxuICAgICAgc3RyaW5nLmZpcnN0Tm9uRW1wdHkoW1xuICAgICAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0FQUF9OQU1FLFxuICAgICAgICBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0JVTkRMRV9OQU1FLFxuICAgICAgICBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUsXG4gICAgICAgIHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX25hbWUsXG4gICAgICBdKSA/PyB1bmRlZmluZWQsXG4gICAgaG9zdG5hbWU6IGhvc3RuYW1lKCksXG4gICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgZW52aXJvbm1lbnQ6IHN0cmluZy50cmltVG9OdWxsKHByb2Nlc3MuZW52Lk5PREVfRU5WKSA/PyB1bmRlZmluZWQsXG4gICAgYXBwTmFtZTogc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfTkFNRSkgPz8gdW5kZWZpbmVkLFxuICAgIGRlcGxveW1lbnRJZDogc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19BUFBfREVQTE9ZTUVOVF9JRCkgPz8gdW5kZWZpbmVkLFxuICAgIGRhdGFicmlja3NIb3N0OiBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QpID8/IHVuZGVmaW5lZCxcbiAgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgb2YgdGhlIHNpZ25lZC1pbiB1c2VyIG9uIHdob3NlIGJlaGFsZiB0aGlzIGJyb2FkY2FzdCBoYXBwZW5zLCB3aGVuIHRoZVxuICogcHJvY2VzcyBjYW4gdGVsbC5cbiAqXG4gKiBgQGRhdGFicmlja3MvYXBwa2l0YCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyB0aGUgaW1wb3J0IGlzIGxhenkgYW5kIGEgbWlzc2luZ1xuICogbW9kdWxlIGlzIG5vdCBhbiBlcnJvciAtIHRoaXMgaXMgYSBwbGFpbiBQb3N0Z3JlcyBwYWNrYWdlIHRoYXQgYWRkcyBzZW5kZXJcbiAqIGlkZW50aXR5IHdoZW4gaXQgaGFwcGVucyB0byBydW4gaW5zaWRlIGFuIEFwcEtpdCBhcHAuIE91dHNpZGUgYW4gYWN0aXZlXG4gKiBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCBBcHBLaXQgdGhyb3dzLCB3aGljaCBtZWFucyBcIm5vIHVzZXIgaGVyZVwiLCBzbyB0aGVcbiAqIHJlc3VsdCBpcyBlbXB0eSBtZXRhZGF0YSByYXRoZXIgdGhhbiBhIGZhaWxlZCBicm9hZGNhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRlck1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICBhcHBLaXRNb2R1bGUgPz89IGltcG9ydChcIkBkYXRhYnJpY2tzL2FwcGtpdFwiKVxuICAgIC50aGVuKChtb2R1bGUpID0+IG1vZHVsZSBhcyBBcHBLaXRNb2R1bGUpXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcGtpdCA9IGF3YWl0IGFwcEtpdE1vZHVsZTtcbiAgaWYgKCFhcHBraXQpIHJldHVybiB7fTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXBwa2l0LmdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICByZXR1cm4gZGVmaW5lZE1ldGFkYXRhKHtcbiAgICAgIHNlbmRlcklkOiBzdHJpbmcudHJpbVRvTnVsbChjb250ZXh0LnVzZXJJZCkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyTmFtZTogc3RyaW5nLnRyaW1Ub051bGwoY29udGV4dC51c2VyTmFtZSkgPz8gdW5kZWZpbmVkLFxuICAgICAgc2VuZGVyRW1haWw6IHN0cmluZy50cmltVG9OdWxsKGNvbnRleHQudXNlckVtYWlsKSA/PyB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIERlcml2ZSBhIGxlZ2FsIFBvc3RncmVzIGNoYW5uZWwgbmFtZSBmcm9tIHdoYXRldmVyIGEgY2FsbGVyIHVzZWQgdG8gaWRlbnRpZnlcbiAqIHRoZSBjaGFubmVsLlxuICpcbiAqIENhbGxlcnMgdGhpbmsgaW4gdGVybXMgb2Ygd2hhdCB0aGUgY2hhbm5lbCBJUyAtIGFuIGFwcCBuYW1lLCBhIHRlbmFudCBpZCwgYVxuICogYFtlbnYsIGZlYXR1cmVdYCBwYWlyLCBhIGNvbmZpZyBvYmplY3QgLSBhbmQgbm9uZSBvZiB0aG9zZSBhcmUgaWRlbnRpZmllcnMuXG4gKiBSZWplY3RpbmcgdGhlbSBwdXNoZWQgdGhlIHNhbml0aXppbmcgb250byBldmVyeSBjYWxsIHNpdGUsIHdoaWNoIGlzIGhvdyB0d29cbiAqIHNlcnZpY2VzIGVuZCB1cCBkaXNhZ3JlZWluZyBhYm91dCB3aGV0aGVyIHRoZSBjaGFubmVsIGlzIGBteS1hcHBgLCBgbXlfYXBwYCxcbiAqIG9yIGBteUFwcGAgYW5kIHNpbGVudGx5IG5ldmVyIGhlYXIgZWFjaCBvdGhlci5cbiAqXG4gKiBUaGUgcGFydHMgYXJlIHRva2VuaXplZCBhbmQgam9pbmVkIGludG8gYW4gaWRlbnRpZmllciwgdGhlbiBhIHNob3J0IGhhc2ggb2YgdGhlXG4gKiBPUklHSU5BTCBwYXJ0cyBpcyBhcHBlbmRlZC4gVGhlIGhhc2ggaXMgd2hhdCBtYWtlcyB0aGUgbWFwcGluZyB0cnVzdHdvcnRoeTpcbiAqIHRva2VuaXppbmcgYWxvbmUgaXMgbG9zc3ksIHNvIGBteS1hcHBgIGFuZCBgbXlfYXBwYCBhbmQgYG15QXBwYCB3b3VsZCBjb2xsYXBzZVxuICogb250byBvbmUgY2hhbm5lbCwgYW5kIGEgbmFtZSBsb25nIGVub3VnaCB0byBoaXQgYE5BTUVEQVRBTEVOYCB3b3VsZCBjb2xsaWRlXG4gKiB3aXRoIGFueXRoaW5nIHNoYXJpbmcgaXRzIGxlYWRpbmcgdG9rZW5zLiBXaXRoIHRoZSBzdWZmaXgsIHRoZSByZWFkYWJsZSBwYXJ0XG4gKiBzdGF5cyByZWFkYWJsZSBhbmQgZGlzdGluY3QgaW5wdXRzIHN0YXkgZGlzdGluY3QuXG4gKlxuICogRGV0ZXJtaW5pc3RpYyBhY3Jvc3MgcHJvY2Vzc2VzIGFuZCBydW5zLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgLSB0d29cbiAqIHNlcnZpY2VzIGdpdmVuIHRoZSBzYW1lIHBhcnRzIG11c3QgbGFuZCBvbiB0aGUgc2FtZSBjaGFubmVsIHdpdGhvdXRcbiAqIGNvb3JkaW5hdGluZy4gSGFzaCBpbnB1dHMgYXJlIHN0cnVjdHVyZS1hd2FyZSwgc28gYFtcImFcIiwgXCJiXCJdYCBhbmQgYFtcImFfYlwiXWBcbiAqIGRpZmZlciwgYW5kIG9iamVjdCBrZXkgb3JkZXIgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFubmVsTmFtZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gb2JqZWN0LnRvT25lT3JNYW55KHZhbHVlKTtcbiAgLy8gSGFzaCB0aGUgQ0FOT05JQ0FMIGZvcm0sIHRoZSBzYW1lIHJ1bGUgYGFkdmlzb3J5TG9ja0lkYCB1c2VzLCBzbyBzdHJ1Y3R1cmUgYW5kXG4gIC8vIHR5cGVzIGRlY2lkZSBpZGVudGl0eTogYFtcImFcIixcImJcIl1gIGRpZmZlcnMgZnJvbSBgW1wiYWJcIl1gLCBgMWAgZnJvbSBgXCIxXCJgLCBhbmRcbiAgLy8gb2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdCBtYXR0ZXIuIEhhc2hpbmcgdGhlIHJhdyBwYXJ0cyB3b3VsZCBpbnN0ZWFkIGxlYW4gb25cbiAgLy8gdGhlIGhhc2ggbW9kdWxlJ3MgY2Fub25pY2FsaXplciwgd2hpY2ggZm9sZHMgZXZlcnkgYERhdGVgIG9udG8gb25lIHRva2VuLlxuICBjb25zdCBzdWZmaXggPSBoYXNoLmZudkhhc2hXaXRoT3B0aW9ucyhcbiAgICB7IGxlbmd0aDogQ0hBTk5FTF9IQVNIX0xFTkdUSCB9LFxuICAgIHBhcnRzLm1hcCgocGFydCkgPT4gb2JqZWN0LnRvU3RhYmxlS2V5KHBhcnQpKS5qb2luKFwiXFx1MDAwMFwiKSxcbiAgKTtcbiAgLy8gT25seSBwYXJ0cyB0aGF0IHN0cmluZ2lmeSB0byBzb21ldGhpbmcgYSByZWFkZXIgcmVjb2duaXplcyBjb250cmlidXRlIHRvIHRoZVxuICAvLyByZWFkYWJsZSBoYWxmLiBBbiBvYmplY3Qgd291bGQgdG9rZW5pemUgZnJvbSBgU3RyaW5nKHZhbHVlKWAgYXNcbiAgLy8gYG9iamVjdF9vYmplY3RgLCB3aGljaCBpcyBub2lzZSAtIGl0IHN0aWxsIHNoYXBlcyB0aGUgaGFzaCwgc28gaWRlbnRpdHkgaXNcbiAgLy8gdW5hZmZlY3RlZC5cbiAgY29uc3QgbGFiZWxsZWQgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpID0+IHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHBhcnQ7XG4gICAgcmV0dXJuIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlID09PSBcImJpZ2ludFwiO1xuICB9KTtcbiAgLy8gVHJ1bmNhdGUgcmF0aGVyIHRoYW4gY2FwIHRocm91Z2ggdGhlIHRva2VuaXplcjogYHRyaW1gIHdvdWxkIERST1AgYSBzaW5nbGVcbiAgLy8gdG9rZW4gbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldCwgdHVybmluZyBvbmUgbG9uZyBuYW1lIGludG8gdGhlIGJhcmUgZmFsbGJhY2sgYW5kXG4gIC8vIG1ha2luZyBldmVyeSBsb25nIG5hbWUgbG9vayBhbGlrZS4gVGhlIGhhc2ggc3RpbGwgc2VwYXJhdGVzIHRoZW0sIGJ1dCB0aGVcbiAgLy8gY2hhbm5lbCBpcyB1bnJlYWRhYmxlIGluIGEgbG9nLlxuICBjb25zdCBib2R5ID0gc3RyaW5nXG4gICAgLnRvSWRlbnRpZmllcldpdGhPcHRpb25zKHsgZGVsaW1pdGVyOiBcIl9cIiB9LCAuLi5sYWJlbGxlZClcbiAgICAuc2xpY2UoMCwgTUFYX0NIQU5ORUxfTEVOR1RIIC0gc3VmZml4Lmxlbmd0aCAtIDEpXG4gICAgLnJlcGxhY2UoL18rJC8sIFwiXCIpO1xuICAvLyBBbiBpZGVudGlmaWVyIGNhbm5vdCBzdGFydCB3aXRoIGEgZGlnaXQgYW5kIHRoZSBoYXNoIGFscGhhYmV0IGlzXG4gIC8vIGRpZ2l0LWxlYWRpbmcsIHNvIGEgbnVtZXJpYyBvciBlbXB0eSBib2R5IG5lZWRzIGEgbGV0dGVyIGluIGZyb250LlxuICBjb25zdCBwcmVmaXggPSAvXltBLVphLXpfXS8udGVzdChib2R5KSA/IGJvZHkgOiBgJHtDSEFOTkVMX0ZBTExCQUNLfV8ke2JvZHl9YDtcbiAgcmV0dXJuIGAke3ByZWZpeH1fJHtzdWZmaXh9YC5yZXBsYWNlKC9fKy9nLCBcIl9cIik7XG59XG5cbi8qKiBRdW90ZSBhIHZhbGlkYXRlZCBjaGFubmVsIGZvciBgTElTVEVOYC9gVU5MSVNURU5gLCB3aGljaCB0YWtlIG5vIHBhcmFtZXRlcnMuICovXG5mdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgXCIke3ZhbHVlLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImA7XG59XG5cbi8qKlxuICogUGFyc2UgYSBgTk9USUZZYCBwYXlsb2FkIGludG8gYW4gZW52ZWxvcGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHRoYXQgaXMgbm90IG9uZS5cbiAqXG4gKiBUaGUgY2hhbm5lbCBpcyBzaGFyZWQgYW5kIGFueSBQb3N0Z3JlcyBzZXNzaW9uIGNhbiBgcGdfbm90aWZ5YCBvbiBpdCwgc28gYW5cbiAqIHVucmVjb2duaXplZCBwYXlsb2FkIGlzIGV4cGVjdGVkIGlucHV0LCBub3QgYW4gZXhjZXB0aW9uLiBQdWJsaXNoZXJzIHJ1biB0aGlzXG4gKiBvdmVyIHRoZWlyIG93biBlbmNvZGVkIG1lc3NhZ2UgdG9vLCB3aGljaCBpcyBob3cgYSBib2R5IHRoYXQgc3RyaW5naWZpZXMgYnV0XG4gKiBkb2VzIG5vdCByb3VuZC10cmlwIGlzIGNhdWdodCBiZWZvcmUgaXQgc2hpcHMuXG4gKi9cbmZ1bmN0aW9uIGRlY29kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVG9waWNNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVjb3JkID0ganNvbi5wYXJzZVJlY29yZCh2YWx1ZSk7XG4gIGlmIChcbiAgICAhcmVjb3JkIHx8XG4gICAgdHlwZW9mIHJlY29yZC5pZCAhPT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiByZWNvcmQudG9waWMgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnR5cGUgIT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgcmVjb3JkLnB1Ymxpc2hlZEF0ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgIXJlY29yZC5tZXRhZGF0YSB8fFxuICAgIHR5cGVvZiByZWNvcmQubWV0YWRhdGEgIT09IFwib2JqZWN0XCIgfHxcbiAgICBBcnJheS5pc0FycmF5KHJlY29yZC5tZXRhZGF0YSkgfHxcbiAgICAhKFwiYm9keVwiIGluIHJlY29yZCkgfHxcbiAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUocmVjb3JkLm1ldGFkYXRhKSB8fFxuICAgICFvYmplY3QuaXNTZXJpYWxpemFibGVWYWx1ZShyZWNvcmQuYm9keSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkOiByZWNvcmQuaWQsXG4gICAgdG9waWM6IHJlY29yZC50b3BpYyxcbiAgICB0eXBlOiByZWNvcmQudHlwZSxcbiAgICBtZXRhZGF0YTogcmVjb3JkLm1ldGFkYXRhIGFzIFRvcGljTWV0YWRhdGEsXG4gICAgYm9keTogcmVjb3JkLmJvZHkgYXMgU2VyaWFsaXphYmxlVmFsdWUsXG4gICAgcHVibGlzaGVkQXQ6IHJlY29yZC5wdWJsaXNoZWRBdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBCcm9hZGNhc3RzIHN0cnVjdHVyZWQgbWVzc2FnZXMgYnkgdG9waWMgYW5kIGRlbGl2ZXJzIHRoZW0gdG8gZXZlcnkgcHJvY2Vzc1xuICogbGlzdGVuaW5nIG9uIHRoZSBzYW1lIGNoYW5uZWwuXG4gKlxuICogQ09OTkVDVElPTiBTSEFQRS4gUHVibGlzaGluZyBib3Jyb3dzIGEgcG9vbGVkIGNvbm5lY3Rpb24gcGVyIGNhbGwsIGxpa2UgYW55XG4gKiBvdGhlciBxdWVyeS4gTGlzdGVuaW5nIGNhbm5vdDogYExJU1RFTmAgaXMgc2Vzc2lvbiBzdGF0ZSwgc28gdGhlIGJ1cyBob2xkcyBPTkVcbiAqIGRlZGljYXRlZCBjbGllbnQgb3V0IG9mIHRoZSBwb29sIGZvciBhcyBsb25nIGFzIGl0IGhhcyBzdWJzY3JpYmVycywgbm8gbWF0dGVyXG4gKiBob3cgbWFueSB0b3BpY3Mgb3IgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLiBTaXplIHRoZSBwb29sIHdpdGggdGhhdCBvbmVcbiAqIGxvbmctbGl2ZWQgY2hlY2tvdXQgaW4gbWluZC5cbiAqXG4gKiBMSUZFQ1lDTEUuIENvbnN0cnVjdGlvbiBpcyBpbmVydCAtIG5vdGhpbmcgY29ubmVjdHMgdW50aWwgdGhlIGZpcnN0XG4gKiB7QGxpbmsgbGlzdGVufSAob3IgYW4gZXhwbGljaXQge0BsaW5rIHN0YXJ0fSkuIHtAbGluayBjbG9zZX0gaXMgcmVxdWlyZWQgdG8gZ2l2ZVxuICogdGhlIGNvbm5lY3Rpb24gYmFjazsgYSBjbG9zZWQgYnVzIHN0YXlzIGNsb3NlZCBhbmQgdGhyb3dzIG9uIGZ1cnRoZXIgdXNlIHJhdGhlclxuICogdGhhbiBzaWxlbnRseSByZWNvbm5lY3RpbmcuIFJlZ2lzdGVyIGl0IHdpdGggdGhlIGhvc3QncyBzaHV0ZG93biBob29rLlxuICpcbiAqIEZBSUxVUkUgSEFORExJTkcuIEEgbG9zdCBub3RpZmljYXRpb24gY29ubmVjdGlvbiByZWNvbm5lY3RzIG9uIGl0cyBvd24gd2l0aFxuICogYm91bmRlZCBiYWNrb2ZmIHdoaWxlIHN1YnNjcmliZXJzIHJlbWFpbiwgcmVwb3J0aW5nIGVhY2ggZmFpbGVkIGF0dGVtcHQgdGhyb3VnaFxuICogYG9uRXJyb3JgLiBNZXNzYWdlcyBwdWJsaXNoZWQgZHVyaW5nIHRoZSBnYXAgYXJlIGxvc3QgLSBgTk9USUZZYCBoYXMgbm8gcmVwbGF5LlxuICogQSB0aHJvd2luZyBvciByZWplY3RpbmcgbGlzdGVuZXIgbmV2ZXIgYWZmZWN0cyB0aGUgcHVibGlzaGVyIG9yIHRoZSBvdGhlclxuICogbGlzdGVuZXJzOyBpdHMgZmFpbHVyZSBnb2VzIHRvIGBvbkVycm9yYC5cbiAqXG4gKiBOb3Qgc2FmZSB0byBzaGFyZSBvbmUgaW5zdGFuY2UgYWNyb3NzIHVucmVsYXRlZCBjaGFubmVscyAtIGNvbnN0cnVjdCBvbmUgYnVzXG4gKiBwZXIgY2hhbm5lbC4gVGhlIGNoYW5uZWwgaXRzZWxmIGlzIERFUklWRUQgZnJvbSB0aGUgYGNoYW5uZWxgIG9wdGlvbiByYXRoZXJcbiAqIHRoYW4gdGFrZW4gbGl0ZXJhbGx5OyBzZWUge0BsaW5rIFBvc3RncmVzVG9waWNCdXNPcHRpb25zLmNoYW5uZWx9IGFuZFxuICoge0BsaW5rIFBvc3RncmVzVG9waWNCdXMuY2hhbm5lbE5hbWV9LlxuICovXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNUb3BpY0J1cyB7XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgUG9zdGdyZXMgY2hhbm5lbCB0aGlzIGJ1cyBsaXN0ZW5zIGFuZCBwdWJsaXNoZXMgb24sIGRlcml2ZWQgZnJvbVxuICAgKiB0aGUgYGNoYW5uZWxgIG9wdGlvbi4gUmVhZCBpdCB0byBjb25maXJtIHR3byBwcm9jZXNzZXMgYWdyZWUsIG9yIHRvIGxvZyB3aGF0IGFcbiAgICogc2V0IG9mIHBhcnRzIGFjdHVhbGx5IHJlc29sdmVkIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YTogVG9waWNNZXRhZGF0YSB8IFRvcGljTWV0YWRhdGFQcm92aWRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkVycm9yOiAoY2F1c2U6IHVua25vd24pID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxUb3BpY0xpc3RlbmVyPj4oKTtcbiAgcHJpdmF0ZSBjbGllbnQ6IFBvb2xDbGllbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhcnRpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVjb25uZWN0aW5nOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29ubmVjdEFib3J0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9vbDogUGdQb29sTGlrZSAmIFBnUXVlcnlhYmxlLFxuICAgIG9wdGlvbnM6IFBvc3RncmVzVG9waWNCdXNPcHRpb25zID0ge30sXG4gICkge1xuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZShcbiAgICAgIG9wdGlvbnMuY2hhbm5lbCA9PT0gdW5kZWZpbmVkID8gREVGQVVMVF9DSEFOTkVMIDogb3B0aW9ucy5jaGFubmVsLFxuICAgICk7XG4gICAgdGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG4gICAgdGhpcy5vbkVycm9yID0gb3B0aW9ucy5vbkVycm9yID8/ICgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGRlZGljYXRlZCBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgYExJU1RFTmAuXG4gICAqXG4gICAqIElkZW1wb3RlbnQsIGFuZCBzYWZlIHRvIGNhbGwgY29uY3VycmVudGx5IC0gb3ZlcmxhcHBpbmcgY2FsbHMgYXdhaXQgdGhlIHNhbWVcbiAgICogaW4tZmxpZ2h0IGNvbm5lY3QuIHtAbGluayBsaXN0ZW59IGNhbGxzIHRoaXMsIHNvIGl0IGlzIG9ubHkgbmVlZGVkIHRvIHN1cmZhY2VcbiAgICogYSBjb25uZWN0aW9uIHByb2JsZW0gYXQgc3RhcnR1cCByYXRoZXIgdGhhbiBvbiBmaXJzdCBzdWJzY3JpYmUuIFRocm93cyBpZiB0aGVcbiAgICogYnVzIGlzIGNsb3NlZCwgb3IgaWYgdGhlIHBvb2wgY2Fubm90IGhhbmQgb3V0IGEgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsaWVudCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdGdyZXMgdG9waWMgYnVzIGlzIGNsb3NlZFwiKTtcbiAgICB0aGlzLnN0YXJ0aW5nID8/PSB0aGlzLmNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5zdGFydGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEgbWVzc2FnZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGVudmVsb3BlIHRoYXQgd2FzIHNlbnQuXG4gICAqXG4gICAqIFJlc29sdmVzIG9uY2UgUG9zdGdyZXMgaGFzIGFjY2VwdGVkIHRoZSBgTk9USUZZYCwgd2hpY2ggc2F5cyBub3RoaW5nIGFib3V0XG4gICAqIGFueW9uZSByZWNlaXZpbmcgaXQ6IHNlc3Npb25zIG5vdCBsaXN0ZW5pbmcgYXQgdGhhdCBtb21lbnQgbWlzcyBpdC4gUHVibGlzaGluZ1xuICAgKiBuZWVkcyBubyB7QGxpbmsgc3RhcnR9IGFuZCBubyBzdWJzY3JpYmVycy5cbiAgICpcbiAgICogVmFsaWRhdGlvbiBpcyBkZWxpYmVyYXRlbHkgZnJvbnQtbG9hZGVkLCBzaW5jZSBhIG1lc3NhZ2UgdGhhdCBmYWlscyBvbiB0aGVcbiAgICogd2lyZSBpcyBmYXIgaGFyZGVyIHRvIGRpYWdub3NlIHRoYW4gb25lIHJlamVjdGVkIGF0IHRoZSBjYWxsOiBgVHlwZUVycm9yYCBmb3IgYVxuICAgKiBibGFuayB0b3BpYyBvciB0eXBlLCBvciBhIGJvZHkvbWV0YWRhdGEgdGhhdCB3b3VsZCBub3Qgcm91bmQtdHJpcCB0aHJvdWdoIEpTT05cbiAgICogdW5jaGFuZ2VkIChgb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWVgKTsgYFJhbmdlRXJyb3JgIHdoZW4gdGhlIGVuY29kZWRcbiAgICogZW52ZWxvcGUgZXhjZWVkcyB0aGUgYE5PVElGWWAgcGF5bG9hZCBsaW1pdCwgd2hpY2ggdGhlIGF1dG9tYXRpYyBtZXRhZGF0YVxuICAgKiBjb3VudHMgYWdhaW5zdCAtIHNlbmQgYSByZWZlcmVuY2UgYW5kIGxldCB0aGUgcmVjZWl2ZXIgZmV0Y2ggdGhlIHBheWxvYWQuXG4gICAqIFRocm93cyBpZiB0aGUgYnVzIGlzIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGJyb2FkY2FzdDxUQm9keSBleHRlbmRzIFNlcmlhbGl6YWJsZVZhbHVlPihcbiAgICB0b3BpYzogc3RyaW5nLFxuICAgIGlucHV0OiBUb3BpY1B1Ymxpc2hJbnB1dDxUQm9keT4sXG4gICk6IFByb21pc2U8VG9waWNNZXNzYWdlPFRCb2R5Pj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgaWYgKCFpbnB1dC50eXBlLnRyaW0oKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk1lc3NhZ2UgdHlwZSBtdXN0IG5vdCBiZSBlbXB0eVwiKTtcbiAgICBpZiAoXG4gICAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUoaW5wdXQubWV0YWRhdGEgPz8ge30pIHx8XG4gICAgICAhb2JqZWN0LmlzU2VyaWFsaXphYmxlVmFsdWUoaW5wdXQuYm9keSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNZXNzYWdlIG1ldGFkYXRhIGFuZCBib2R5IG11c3QgYmUgSlNPTiBzZXJpYWxpemFibGUgd2l0aG91dCBjb2VyY2lvblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aHJvdyBuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpO1xuICAgIGNvbnN0IGF1dG9tYXRpYyA9IGF3YWl0IHRoaXMucmVzb2x2ZU1ldGFkYXRhKCk7XG4gICAgY29uc3QgbWVzc2FnZTogVG9waWNNZXNzYWdlPFRCb2R5PiA9IHtcbiAgICAgIGlkOiBoYXNoLmlkKCksXG4gICAgICB0b3BpYyxcbiAgICAgIHR5cGU6IGlucHV0LnR5cGUsXG4gICAgICBtZXRhZGF0YTogeyAuLi5hdXRvbWF0aWMsIC4uLmlucHV0Lm1ldGFkYXRhIH0sXG4gICAgICBib2R5OiBpbnB1dC5ib2R5LFxuICAgICAgcHVibGlzaGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9O1xuICAgIGxldCBlbmNvZGVkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTWVzc2FnZSBtdXN0IGJlIEpTT04gc2VyaWFsaXphYmxlOiAke2Vycm9yLmVycm9yTWVzc2FnZShjYXVzZSl9YCk7XG4gICAgfVxuICAgIGlmICghZGVjb2RlKGVuY29kZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWVzc2FnZSB0eXBlLCBtZXRhZGF0YSwgYW5kIGJvZHkgbXVzdCBiZSBKU09OIHNlcmlhbGl6YWJsZVwiKTtcbiAgICB9XG4gICAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKGVuY29kZWQsIFwidXRmOFwiKSA+IE1BWF9OT1RJRllfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3N0Z3JlcyBub3RpZmljYXRpb24gZXhjZWVkcyAke01BWF9OT1RJRllfQllURVN9IGJ5dGVzYCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucG9vbC5xdWVyeShcIlNFTEVDVCBwZ19ub3RpZnkoJDEsICQyKVwiLCBbdGhpcy5jaGFubmVsTmFtZSwgZW5jb2RlZF0pO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBgdG9waWNgLCByZXR1cm5pbmcgdGhlIGZ1bmN0aW9uIHRoYXQgdW5zdWJzY3JpYmVzLlxuICAgKlxuICAgKiBDb25uZWN0cyBvbiBmaXJzdCB1c2UuIFNldmVyYWwgbGlzdGVuZXJzIG1heSBzaGFyZSBhIHRvcGljOyBlYWNoIGlzIGNhbGxlZFxuICAgKiBvbmNlIHBlciBtZXNzYWdlLiBPbmx5IG1lc3NhZ2VzIHB1Ymxpc2hlZCBBRlRFUiB0aGlzIHJlc29sdmVzIGFycml2ZSwgc29cbiAgICogc3Vic2NyaWJlIGJlZm9yZSB0cmlnZ2VyaW5nIHdoYXRldmVyIHlvdSBleHBlY3QgdG8gb2JzZXJ2ZS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHJlbW92ZXMganVzdCB0aGlzIGxpc3RlbmVyIGFuZCBpcyBzYWZlIHRvIGNhbGwgdHdpY2UuXG4gICAqIFRoZSBjb25uZWN0aW9uIHN0YXlzIG9wZW4gb25jZSB0aGUgbGFzdCBsaXN0ZW5lciBsZWF2ZXMgLSB7QGxpbmsgY2xvc2V9XG4gICAqIHJlbGVhc2VzIGl0IC0gc28gYSBidXMgdGhhdCBzdWJzY3JpYmVzIGFuZCB1bnN1YnNjcmliZXMgcGVyIHJlcXVlc3QgZG9lcyBub3RcbiAgICogY2h1cm4gY29ubmVjdGlvbnMuXG4gICAqL1xuICBhc3luYyBsaXN0ZW48VEJvZHkgZXh0ZW5kcyBTZXJpYWxpemFibGVWYWx1ZT4oXG4gICAgdG9waWM6IHN0cmluZyxcbiAgICBsaXN0ZW5lcjogVG9waWNMaXN0ZW5lcjxUQm9keT4sXG4gICk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICAgIGlmICghdG9waWMudHJpbSgpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVG9waWMgbXVzdCBub3QgYmUgZW1wdHlcIik7XG4gICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmdldCh0b3BpYykgPz8gbmV3IFNldDxUb3BpY0xpc3RlbmVyPigpO1xuICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIgYXMgVG9waWNMaXN0ZW5lcik7XG4gICAgdGhpcy5saXN0ZW5lcnMuc2V0KHRvcGljLCBsaXN0ZW5lcnMpO1xuICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyIGFzIFRvcGljTGlzdGVuZXIpO1xuICAgICAgaWYgKGxpc3RlbmVycy5zaXplID09PSAwKSB0aGlzLmxpc3RlbmVycy5kZWxldGUodG9waWMpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGF1dG9tYXRpYyBoYWxmIG9mIGEgbWVzc2FnZSdzIG1ldGFkYXRhLlxuICAgKlxuICAgKiBQcmVjZWRlbmNlLCB3ZWFrZXN0IGZpcnN0OiBtYWNoaW5lL3Byb2Nlc3MgY29udGV4dCwgdGhlbiBBcHBLaXQgc2VuZGVyXG4gICAqIGlkZW50aXR5LCB0aGVuIHRoaXMgYnVzJ3MgY29uZmlndXJlZCBtZXRhZGF0YS4gVGhlIGNhbGxlcidzIHBlci1tZXNzYWdlXG4gICAqIG1ldGFkYXRhIGlzIGxheWVyZWQgb3ZlciB0aGUgcmVzdWx0IGluIHtAbGluayBicm9hZGNhc3R9LCBzbyB0aGUgbW9zdCBzcGVjaWZpY1xuICAgKiBzb3VyY2UgYWx3YXlzIHdpbnMgYW5kIG5vdGhpbmcgaGVyZSBjYW4gb3ZlcndyaXRlIGFuIGV4cGxpY2l0IGtleS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZU1ldGFkYXRhKCk6IFByb21pc2U8VG9waWNNZXRhZGF0YT4ge1xuICAgIGNvbnN0IHNlbmRlciA9IGF3YWl0IHNlbmRlck1ldGFkYXRhKCk7XG4gICAgY29uc3QgY29uZmlndXJlZCA9XG4gICAgICB0eXBlb2YgdGhpcy5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdGhpcy5tZXRhZGF0YSgpIDogKHRoaXMubWV0YWRhdGEgPz8ge30pO1xuICAgIHJldHVybiB7IC4uLm1hY2hpbmVNZXRhZGF0YSgpLCAuLi5zZW5kZXIsIC4uLmNvbmZpZ3VyZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbiBhbmQgc3RvcCBkZWxpdmVyaW5nIG1lc3NhZ2VzLiBJZGVtcG90ZW50LlxuICAgKlxuICAgKiBDYW5jZWxzIGFueSBwZW5kaW5nIHJlY29ubmVjdCwgZHJvcHMgYWxsIGxpc3RlbmVycywgdGhlbiBgVU5MSVNURU5gcyBhbmRcbiAgICogcmV0dXJucyB0aGUgY2xpZW50IHRvIHRoZSBwb29sLiBBIGZhaWxlZCBgVU5MSVNURU5gIGlzIHJlcG9ydGVkIHRvIHRoZSBwb29sIGFzXG4gICAqIGEgcmVsZWFzZSBlcnJvciBzbyB0aGUgY29ubmVjdGlvbiBpcyBESVNDQVJERUQgcmF0aGVyIHRoYW4gaGFuZGVkIHRvIHRoZSBuZXh0XG4gICAqIGNhbGxlciBzdGlsbCBzdWJzY3JpYmVkIHRvIHRoZSBjaGFubmVsLiBEb2VzIG5vdCB0aHJvdzsgdGhlIGJ1cyBzdGF5cyBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5yZWNvbm5lY3RBYm9ydC5hYm9ydChuZXcgRXJyb3IoXCJQb3N0Z3JlcyB0b3BpYyBidXMgaXMgY2xvc2VkXCIpKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGF3YWl0IHRoaXMucmVjb25uZWN0aW5nPy5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIHRoaXMuY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybjtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJub3RpZmljYXRpb25cIiwgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24pO1xuICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgIGxldCByZWxlYXNlRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFVOTElTVEVOICR7cXVvdGVJZGVudGlmaWVyKHRoaXMuY2hhbm5lbE5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICByZWxlYXNlRXJyb3IgPSBlcnJvci50b0Vycm9yKGNhdXNlKTtcbiAgICB9XG4gICAgY2xpZW50LnJlbGVhc2UocmVsZWFzZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBvdXQgb25lIGNsaWVudCwgYXR0YWNoIHRoZSBoYW5kbGVycywgYW5kIGBMSVNURU5gLlxuICAgKlxuICAgKiBUaGUgaGFuZGxlcnMgYXJlIGF0dGFjaGVkIEJFRk9SRSB0aGUgYExJU1RFTmAgcm91bmQgdHJpcCBzbyBhIG5vdGlmaWNhdGlvbiBvclxuICAgKiBlcnJvciBhcnJpdmluZyBtaWQtc2V0dXAgaXMgbm90IG1pc3NlZC4gQW55IGZhaWx1cmUgLSBpbmNsdWRpbmcgdGhlIGJ1cyBiZWluZ1xuICAgKiBjbG9zZWQgd2hpbGUgdGhlIGNvbm5lY3Qgd2FzIGluIGZsaWdodCAtIGRldGFjaGVzIHRoZSBoYW5kbGVycyBhbmQgcmVsZWFzZXNcbiAgICogdGhlIGNsaWVudCBhcyBlcnJvcmVkLCBzbyBhIGhhbGYtY29uZmlndXJlZCBjb25uZWN0aW9uIG5ldmVyIHJldHVybnMgdG8gdGhlXG4gICAqIHBvb2wuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5wb29sLmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgY2xpZW50Lm9uKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5vbihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KGBMSVNURU4gJHtxdW90ZUlkZW50aWZpZXIodGhpcy5jaGFubmVsTmFtZSl9YCk7XG4gICAgICBpZiAodGhpcy5jbG9zZWQpIHRocm93IG5ldyBFcnJvcihcIlBvc3RncmVzIHRvcGljIGJ1cyBpcyBjbG9zZWRcIik7XG4gICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMuaGFuZGxlQ2xpZW50RXJyb3IpO1xuICAgICAgY2xpZW50LnJlbGVhc2UoZXJyb3IudG9FcnJvcihjYXVzZSkpO1xuICAgICAgdGhyb3cgY2F1c2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIG9uZSBpbmJvdW5kIG5vdGlmaWNhdGlvbiB0byB0aGUgdG9waWMncyBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIElnbm9yZXMgb3RoZXIgY2hhbm5lbHMgYW5kIHVuZGVjb2RhYmxlIHBheWxvYWRzIC0gdGhlIGNoYW5uZWwgaXMgc2hhcmVkLCBzb1xuICAgKiBib3RoIGFyZSBvcmRpbmFyeSB0cmFmZmljLiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgY29uY3VycmVudGx5IGFuZCB0aGVpclxuICAgKiByZWplY3Rpb25zIGdvIHRvIGBvbkVycm9yYCwga2VlcGluZyBvbmUgc2xvdyBvciBicm9rZW4gc3Vic2NyaWJlciBmcm9tXG4gICAqIHN0YWxsaW5nIHRoZSBub3RpZmljYXRpb24gY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5jaGFubmVsICE9PSB0aGlzLmNoYW5uZWxOYW1lKSByZXR1cm47XG4gICAgY29uc3QgbWVzc2FnZSA9IGRlY29kZShub3RpZmljYXRpb24ucGF5bG9hZCk7XG4gICAgaWYgKCFtZXNzYWdlKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycy5nZXQobWVzc2FnZS50b3BpYykgPz8gW10pIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZShsaXN0ZW5lcihtZXNzYWdlKSkuY2F0Y2godGhpcy5vbkVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgbm90aWZpY2F0aW9uIGNvbm5lY3Rpb24gZHlpbmcsIHdoaWNoIGBwZ2AgcmVwb3J0cyBhcyBhbiBgZXJyb3JgXG4gICAqIGV2ZW50IHJhdGhlciB0aGFuIGEgcmVqZWN0ZWQgcXVlcnkuXG4gICAqXG4gICAqIFRoZSBjbGllbnQgaXMgdW51c2FibGUgYXQgdGhpcyBwb2ludCwgc28gaXQgaXMgZGV0YWNoZWQgYW5kIHJlbGVhc2VkIGFzXG4gICAqIGVycm9yZWQgKHdoaWNoIGRpc2NhcmRzIGl0KSBiZWZvcmUgYW55dGhpbmcgZWxzZS4gUmVjb25uZWN0aW9uIG9ubHkgc3RhcnRzXG4gICAqIHdoZW4gdGhlcmUgaXMgc3RpbGwgc29tZW9uZSB0byBkZWxpdmVyIHRvLCBzbyBhbiBpZGxlIG9yIGNsb3NpbmcgYnVzIGRvZXMgbm90XG4gICAqIGhvbGQgYSBjb25uZWN0aW9uIG9wZW4gY2hhc2luZyBhIGNoYW5uZWwgbm9ib2R5IHJlYWRzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVDbGllbnRFcnJvciA9IChjYXVzZTogRXJyb3IpOiB2b2lkID0+IHtcbiAgICB0aGlzLm9uRXJyb3IoY2F1c2UpO1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50O1xuICAgIGlmICghY2xpZW50KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnQgPSB1bmRlZmluZWQ7XG4gICAgY2xpZW50LnJlbW92ZUxpc3RlbmVyKFwibm90aWZpY2F0aW9uXCIsIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKTtcbiAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLmhhbmRsZUNsaWVudEVycm9yKTtcbiAgICBjbGllbnQucmVsZWFzZShjYXVzZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VkIHx8IHRoaXMubGlzdGVuZXJzLnNpemUgPT09IDApIHJldHVybjtcbiAgICB0aGlzLnJlY29ubmVjdGluZyA/Pz0gdGhpcy5yZWNvbm5lY3QoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0aW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZS1lc3RhYmxpc2ggdGhlIG5vdGlmaWNhdGlvbiBjb25uZWN0aW9uIHdpdGggYm91bmRlZCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKlxuICAgKiBUaGUgZmlyc3QgYXR0ZW1wdCBpcyBpbW1lZGlhdGUsIHNpbmNlIHRoZSBjb21tb24gY2FzZSBpcyBhIHNpbmdsZSBkcm9wcGVkXG4gICAqIGNvbm5lY3Rpb24gdGhhdCByZWNvbm5lY3RzIGF0IG9uY2U7IHN1YnNlcXVlbnQgZGVsYXlzIGRvdWJsZSBmcm9tIDI1MG1zIHVwIHRvXG4gICAqIDVzIGFuZCBzdGF5IHRoZXJlLiBSZXRyaWVzIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBnaXZpbmcgdXAsIGJlY2F1c2UgYSBQb3N0Z3JlcyByZXN0YXJ0XG4gICAqIG9yIGEgcm90YXRlZCBMYWtlYmFzZSBjcmVkZW50aWFsIGlzIGEgcmVjb3ZlcmFibGUgb3V0YWdlIGFuZCBhIHNpbGVudGx5IGRlYWRcbiAgICogbGlzdGVuZXIgaXMgd29yc2UgdGhhbiBhIG5vaXN5IG9uZS4gU3RvcHMgd2hlbiB0aGUgYnVzIGNsb3NlcyBvciB0aGUgbGFzdFxuICAgKiBsaXN0ZW5lciBsZWF2ZXMsIGFuZCByZXBvcnRzIGV2ZXJ5IGZhaWxlZCBhdHRlbXB0IHRocm91Z2ggYG9uRXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGRlbGF5ID0gMDtcbiAgICB3aGlsZSAoIXRoaXMuY2xvc2VkICYmIHRoaXMubGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYXN5bmNVdGlsLnNsZWVwKGRlbGF5LCB0aGlzLnJlY29ubmVjdEFib3J0LnNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5vbkVycm9yKGNhdXNlKTtcbiAgICAgICAgZGVsYXkgPSBkZWxheSA9PT0gMCA/IE1JTl9SRUNPTk5FQ1RfREVMQVlfTVMgOiBNYXRoLm1pbihkZWxheSAqIDIsIE1BWF9SRUNPTk5FQ1RfREVMQVlfTVMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "repository": {
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/reggie-db/dbx-tools.git",
6
- "directory": "packages/node/postgres"
6
+ "directory": "packages/js/node/postgres"
7
7
  },
8
8
  "scripts": {
9
9
  "build": "projen build",
@@ -28,7 +28,7 @@
28
28
  "@databricks/appkit": "^0.43.0"
29
29
  },
30
30
  "dependencies": {
31
- "@dbx-tools/shared-core": "0.6.73",
31
+ "@dbx-tools/shared-core": "0.6.75",
32
32
  "pg": "^8.22.0"
33
33
  },
34
34
  "main": "./lib/index.js",
@@ -45,7 +45,7 @@
45
45
  "./package.json": "./package.json"
46
46
  }
47
47
  },
48
- "version": "0.6.73",
48
+ "version": "0.6.75",
49
49
  "types": "./lib/index.d.ts",
50
50
  "type": "module",
51
51
  "exports": {
package/src/topic-bus.ts CHANGED
@@ -282,7 +282,8 @@ async function senderMetadata(): Promise<TopicMetadata> {
282
282
  * coordinating. Hash inputs are structure-aware, so `["a", "b"]` and `["a_b"]`
283
283
  * differ, and object key order does not.
284
284
  */
285
- function channelName(parts: object.OneOrMany<unknown>): string {
285
+ export function channelName(value: unknown): string {
286
+ const parts = object.toOneOrMany(value);
286
287
  // Hash the CANONICAL form, the same rule `advisoryLockId` uses, so structure and
287
288
  // types decide identity: `["a","b"]` differs from `["ab"]`, `1` from `"1"`, and
288
289
  // object key order does not matter. Hashing the raw parts would instead lean on
@@ -402,7 +403,7 @@ export class PostgresTopicBus {
402
403
  options: PostgresTopicBusOptions = {},
403
404
  ) {
404
405
  this.channelName = channelName(
405
- object.toOneOrMany(options.channel === undefined ? DEFAULT_CHANNEL : options.channel),
406
+ options.channel === undefined ? DEFAULT_CHANNEL : options.channel,
406
407
  );
407
408
  this.metadata = options.metadata;
408
409
  this.onError = options.onError ?? (() => undefined);