@decohere/create 0.0.1-dev.37 → 0.0.1-dev.38

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.
@@ -60,6 +60,10 @@ class DockerCompose {
60
60
  if (svc.container_name) lines.push(` container_name: ${svc.container_name}`);
61
61
  if (svc.command) lines.push(` command: ${svc.command}`);
62
62
  if (svc.restart) lines.push(` restart: ${svc.restart}`);
63
+ if (svc.profiles && svc.profiles.length > 0) {
64
+ lines.push(" profiles:");
65
+ for (const p of svc.profiles)lines.push(` - ${p}`);
66
+ }
63
67
  if (svc.env_file && svc.env_file.length > 0) {
64
68
  lines.push(" env_file:");
65
69
  for (const f of svc.env_file)lines.push(` - ${f}`);
@@ -131,4 +135,4 @@ class DockerCompose {
131
135
  }
132
136
  }
133
137
 
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbXBvc2UubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29ya1JlZiA9XG5cdHwgc3RyaW5nXG5cdHwge1xuXHRcdFx0LyoqIE5ldHdvcmsga2V5IHVuZGVyIGBuZXR3b3JrczpgIG9uIHRoaXMgc2VydmljZSAqL1xuXHRcdFx0W25ldHdvcmtLZXk6IHN0cmluZ106IHsgYWxpYXNlcz86IHN0cmluZ1tdIH07XG5cdCAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlSGVhbHRoY2hlY2sge1xuXHR0ZXN0OiBzdHJpbmdbXTtcblx0aW50ZXJ2YWw/OiBzdHJpbmc7XG5cdHRpbWVvdXQ/OiBzdHJpbmc7XG5cdHJldHJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZVNlcnZpY2Uge1xuXHRidWlsZD86IHN0cmluZztcblx0aW1hZ2U/OiBzdHJpbmc7XG5cdGNvbnRhaW5lcl9uYW1lPzogc3RyaW5nO1xuXHRlbnZfZmlsZT86IHN0cmluZ1tdO1xuXHRlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHBvcnRzPzogc3RyaW5nW107XG5cdHZvbHVtZXM/OiBzdHJpbmdbXTtcblx0Y29tbWFuZD86IHN0cmluZztcblx0cmVzdGFydD86IHN0cmluZztcblx0ZGVwZW5kc19vbj86IHN0cmluZ1tdO1xuXHQvKiogQXR0YWNoIHRvIGNvbXBvc2UgbmV0d29ya3MgKHN0cmluZyBuYW1lIG9yIG1hcCB3aXRoIGFsaWFzZXMpLiAqL1xuXHRuZXR3b3Jrcz86IENvbXBvc2VOZXR3b3JrUmVmW107XG5cdGhlYWx0aGNoZWNrPzogQ29tcG9zZUhlYWx0aGNoZWNrO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29yayA9IHtcblx0LyoqIEZpeGVkIERvY2tlciBuZXR3b3JrIG5hbWUgKHNoYXJlYWJsZSBhY3Jvc3MgY29tcG9zZSBwcm9qZWN0cykuICovXG5cdG5hbWU6IHN0cmluZztcblx0ZXh0ZXJuYWw/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBMaXZlIGJ1aWxkZXIgZm9yIGBkb2NrZXItY29tcG9zZS55bWxgLlxuICpcbiAqIEZlYXR1cmVzIGNhbGwgYGFkZFNlcnZpY2VgIC8gYGFkZFZvbHVtZWAgLyBgYWRkTmV0d29ya2AgaW4gdGhlaXIgc2NhZmZvbGQgcGhhc2VzLlxuICovXG5leHBvcnQgY2xhc3MgRG9ja2VyQ29tcG9zZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5ET0NLRVJfQ09NUE9TRTtcblx0cHJpdmF0ZSBfcHJvamVjdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSByZWFkb25seSBfc2VydmljZXM6IE1hcDxzdHJpbmcsIENvbXBvc2VTZXJ2aWNlPiA9IG5ldyBNYXAoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfdm9sdW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX25ldHdvcmtzOiBNYXA8c3RyaW5nLCBDb21wb3NlTmV0d29yaz4gPSBuZXcgTWFwKCk7XG5cblx0LyoqIENvbXBvc2UgcHJvamVjdCBuYW1lIChgbmFtZTpgIHRvcC1sZXZlbCkg4oCUIGlzb2xhdGVzIGNvbnRhaW5lcnMvdm9sdW1lcy4gKi9cblx0cHVibGljIHNldFByb2plY3ROYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3Byb2plY3ROYW1lID0gbmFtZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGRTZXJ2aWNlKG5hbWU6IHN0cmluZywgY29uZmlnOiBDb21wb3NlU2VydmljZSk6IHRoaXMge1xuXHRcdHRoaXMuX3NlcnZpY2VzLnNldChuYW1lLCBjb25maWcpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCkge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMuZ2V0Q29udGVudCgpLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG5cblx0cHVibGljIGFkZFZvbHVtZShuYW1lOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl92b2x1bWVzLmFkZChuYW1lKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBhZGROZXR3b3JrKGtleTogc3RyaW5nLCBuZXR3b3JrOiBDb21wb3NlTmV0d29yayk6IHRoaXMge1xuXHRcdHRoaXMuX25ldHdvcmtzLnNldChrZXksIG5ldHdvcmspO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFwcGVuZCBhbiBlbnZfZmlsZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHNlcnZpY2UuICovXG5cdHB1YmxpYyBhZGRFbnZGaWxlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB0aGlzIHtcblx0XHRjb25zdCBzdmMgPSB0aGlzLl9zZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpO1xuXHRcdGlmIChzdmMpIHN2Yy5lbnZfZmlsZSA9IFsuLi4oc3ZjLmVudl9maWxlID8/IFtdKSwgZmlsZVBhdGhdO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGdldENvbnRlbnQoKTogc3RyaW5nIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblx0XHRpZiAodGhpcy5fcHJvamVjdE5hbWUpIHtcblx0XHRcdGxpbmVzLnB1c2goYG5hbWU6ICR7dGhpcy5fcHJvamVjdE5hbWV9YCwgXCJcIik7XG5cdFx0fVxuXHRcdGxpbmVzLnB1c2goXCJzZXJ2aWNlczpcIik7XG5cblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBzdmNdIG9mIHRoaXMuX3NlcnZpY2VzKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGAgICR7bmFtZX06YCk7XG5cdFx0XHRpZiAoc3ZjLmJ1aWxkKSBsaW5lcy5wdXNoKGAgICAgYnVpbGQ6ICR7c3ZjLmJ1aWxkfWApO1xuXHRcdFx0aWYgKHN2Yy5pbWFnZSkgbGluZXMucHVzaChgICAgIGltYWdlOiAke3N2Yy5pbWFnZX1gKTtcblx0XHRcdGlmIChzdmMuY29udGFpbmVyX25hbWUpIGxpbmVzLnB1c2goYCAgICBjb250YWluZXJfbmFtZTogJHtzdmMuY29udGFpbmVyX25hbWV9YCk7XG5cdFx0XHRpZiAoc3ZjLmNvbW1hbmQpIGxpbmVzLnB1c2goYCAgICBjb21tYW5kOiAke3N2Yy5jb21tYW5kfWApO1xuXHRcdFx0aWYgKHN2Yy5yZXN0YXJ0KSBsaW5lcy5wdXNoKGAgICAgcmVzdGFydDogJHtzdmMucmVzdGFydH1gKTtcblxuXHRcdFx0aWYgKHN2Yy5lbnZfZmlsZSAmJiBzdmMuZW52X2ZpbGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIGVudl9maWxlOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmIG9mIHN2Yy5lbnZfZmlsZSkgbGluZXMucHVzaChgICAgICAgLSAke2Z9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZW52aXJvbm1lbnQgJiYgT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZW52aXJvbm1lbnQ6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdmMuZW52aXJvbm1lbnQpKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgICAgICAgJHtrfTogJHt2fWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMucG9ydHMgJiYgc3ZjLnBvcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICBwb3J0czpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgcCBvZiBzdmMucG9ydHMpIGxpbmVzLnB1c2goYCAgICAgIC0gXCIke3B9XCJgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy52b2x1bWVzICYmIHN2Yy52b2x1bWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICB2b2x1bWVzOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHN2Yy52b2x1bWVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7dn1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5uZXR3b3JrcyAmJiBzdmMubmV0d29ya3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCBvbmx5U3RyaW5ncyA9IHN2Yy5uZXR3b3Jrcy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09IFwic3RyaW5nXCIpO1xuXHRcdFx0XHRpZiAob25seVN0cmluZ3MpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIG5ldHdvcmtzOlwiKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG4gb2Ygc3ZjLm5ldHdvcmtzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7biBhcyBzdHJpbmd9YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChcIiAgICBuZXR3b3JrczpcIik7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBuIG9mIHN2Yy5uZXR3b3Jrcykge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goYCAgICAgICR7bn06YCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuZXRLZXksIGNmZ10gb2YgT2JqZWN0LmVudHJpZXMobikpIHtcblx0XHRcdFx0XHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICAke25ldEtleX06YCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNmZy5hbGlhc2VzICYmIGNmZy5hbGlhc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgICAgIGFsaWFzZXM6XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhIG9mIGNmZy5hbGlhc2VzKSBsaW5lcy5wdXNoKGAgICAgICAgICAgLSAke2F9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZGVwZW5kc19vbiAmJiBzdmMuZGVwZW5kc19vbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZGVwZW5kc19vbjpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZCBvZiBzdmMuZGVwZW5kc19vbikgbGluZXMucHVzaChgICAgICAgLSAke2R9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuaGVhbHRoY2hlY2spIHtcblx0XHRcdFx0Y29uc3QgaGMgPSBzdmMuaGVhbHRoY2hlY2s7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgaGVhbHRoY2hlY2s6XCIpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICB0ZXN0OiAke0pTT04uc3RyaW5naWZ5KGhjLnRlc3QpfWApO1xuXHRcdFx0XHRpZiAoaGMuaW50ZXJ2YWwpIGxpbmVzLnB1c2goYCAgICAgIGludGVydmFsOiAke2hjLmludGVydmFsfWApO1xuXHRcdFx0XHRpZiAoaGMudGltZW91dCkgbGluZXMucHVzaChgICAgICAgdGltZW91dDogJHtoYy50aW1lb3V0fWApO1xuXHRcdFx0XHRpZiAoaGMucmV0cmllcyAhPSBudWxsKSBsaW5lcy5wdXNoKGAgICAgICByZXRyaWVzOiAke2hjLnJldHJpZXN9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX25ldHdvcmtzLnNpemUgPiAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXHRcdFx0bGluZXMucHVzaChcIm5ldHdvcmtzOlwiKTtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgbmV0XSBvZiB0aGlzLl9uZXR3b3Jrcykge1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICR7a2V5fTpgKTtcblx0XHRcdFx0bGluZXMucHVzaChgICAgIG5hbWU6ICR7bmV0Lm5hbWV9YCk7XG5cdFx0XHRcdGlmIChuZXQuZXh0ZXJuYWwpIGxpbmVzLnB1c2goXCIgICAgZXh0ZXJuYWw6IHRydWVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3ZvbHVtZXMuc2l6ZSA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdFx0XHRsaW5lcy5wdXNoKFwidm9sdW1lczpcIik7XG5cdFx0XHRmb3IgKGNvbnN0IHYgb2YgdGhpcy5fdm9sdW1lcykgbGluZXMucHVzaChgICAke3Z9OmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJEb2NrZXJDb21wb3NlIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkRPQ0tFUl9DT01QT1NFIiwiX3Byb2plY3ROYW1lIiwiX3NlcnZpY2VzIiwiTWFwIiwiX3ZvbHVtZXMiLCJTZXQiLCJfbmV0d29ya3MiLCJzZXRQcm9qZWN0TmFtZSIsIm5hbWUiLCJhZGRTZXJ2aWNlIiwiY29uZmlnIiwic2V0IiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiYWRkVm9sdW1lIiwiYWRkIiwiYWRkTmV0d29yayIsIm5ldHdvcmsiLCJhZGRFbnZGaWxlIiwic2VydmljZU5hbWUiLCJzdmMiLCJnZXQiLCJlbnZfZmlsZSIsImxpbmVzIiwicHVzaCIsImJ1aWxkIiwiaW1hZ2UiLCJjb250YWluZXJfbmFtZSIsImNvbW1hbmQiLCJyZXN0YXJ0IiwibGVuZ3RoIiwiZiIsImVudmlyb25tZW50IiwiT2JqZWN0Iiwia2V5cyIsImsiLCJ2IiwiZW50cmllcyIsInBvcnRzIiwicCIsInZvbHVtZXMiLCJuZXR3b3JrcyIsIm9ubHlTdHJpbmdzIiwiZXZlcnkiLCJuIiwibmV0S2V5IiwiY2ZnIiwiYWxpYXNlcyIsImEiLCJkZXBlbmRzX29uIiwiZCIsImhlYWx0aGNoZWNrIiwiaGMiLCJKU09OIiwic3RyaW5naWZ5IiwidGVzdCIsImludGVydmFsIiwidGltZW91dCIsInJldHJpZXMiLCJzaXplIiwibmV0IiwiZXh0ZXJuYWwiLCJqb2luIl0sIm1hcHBpbmdzIjoiOzs7OytCQTRDYUE7OztlQUFBQTs7O3VCQTVDb0I7QUE0QzFCLE1BQU1BO0lBQ0lDLE1BQU1DLHVCQUFnQixDQUFDQyxjQUFjLENBQUM7SUFDOUNDLGFBQWlDO0lBQ3hCQyxZQUF5QyxJQUFJQyxNQUFNO0lBQ25EQyxXQUF3QixJQUFJQyxNQUFNO0lBQ2xDQyxZQUF5QyxJQUFJSCxNQUFNO0lBRXBFLDRFQUE0RSxHQUM1RSxBQUFPSSxlQUFlQyxJQUFZLEVBQVE7UUFDekMsSUFBSSxDQUFDUCxZQUFZLEdBQUdPO1FBQ3BCLE9BQU8sSUFBSTtJQUNaO0lBRU9DLFdBQVdELElBQVksRUFBRUUsTUFBc0IsRUFBUTtRQUM3RCxJQUFJLENBQUNSLFNBQVMsQ0FBQ1MsR0FBRyxDQUFDSCxNQUFNRTtRQUN6QixPQUFPLElBQUk7SUFDWjtJQUVPRSxRQUFRO1FBQ2QsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTLElBQUksQ0FBQ0MsVUFBVTtZQUN6QjtTQUNBO0lBQ0Y7SUFFT0MsVUFBVVIsSUFBWSxFQUFRO1FBQ3BDLElBQUksQ0FBQ0osUUFBUSxDQUFDYSxHQUFHLENBQUNUO1FBQ2xCLE9BQU8sSUFBSTtJQUNaO0lBRU9VLFdBQVdwQixHQUFXLEVBQUVxQixPQUF1QixFQUFRO1FBQzdELElBQUksQ0FBQ2IsU0FBUyxD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
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvbW9kZWxzL2NvbXBvc2UubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwgfSBmcm9tIFwiLi9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb21wb3NlTmV0d29ya1JlZiA9XG5cdHwgc3RyaW5nXG5cdHwge1xuXHRcdFx0LyoqIE5ldHdvcmsga2V5IHVuZGVyIGBuZXR3b3JrczpgIG9uIHRoaXMgc2VydmljZSAqL1xuXHRcdFx0W25ldHdvcmtLZXk6IHN0cmluZ106IHsgYWxpYXNlcz86IHN0cmluZ1tdIH07XG5cdCAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlSGVhbHRoY2hlY2sge1xuXHR0ZXN0OiBzdHJpbmdbXTtcblx0aW50ZXJ2YWw/OiBzdHJpbmc7XG5cdHRpbWVvdXQ/OiBzdHJpbmc7XG5cdHJldHJpZXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZVNlcnZpY2Uge1xuXHRidWlsZD86IHN0cmluZztcblx0aW1hZ2U/OiBzdHJpbmc7XG5cdGNvbnRhaW5lcl9uYW1lPzogc3RyaW5nO1xuXHRlbnZfZmlsZT86IHN0cmluZ1tdO1xuXHRlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHBvcnRzPzogc3RyaW5nW107XG5cdHZvbHVtZXM/OiBzdHJpbmdbXTtcblx0Y29tbWFuZD86IHN0cmluZztcblx0cmVzdGFydD86IHN0cmluZztcblx0ZGVwZW5kc19vbj86IHN0cmluZ1tdO1xuXHQvKiogQ29tcG9zZSBwcm9maWxlcyAoc2VydmljZSBvbmx5IHN0YXJ0cyB3aGVuIHByb2ZpbGUgaXMgZW5hYmxlZCkuICovXG5cdHByb2ZpbGVzPzogc3RyaW5nW107XG5cdC8qKiBBdHRhY2ggdG8gY29tcG9zZSBuZXR3b3JrcyAoc3RyaW5nIG5hbWUgb3IgbWFwIHdpdGggYWxpYXNlcykuICovXG5cdG5ldHdvcmtzPzogQ29tcG9zZU5ldHdvcmtSZWZbXTtcblx0aGVhbHRoY2hlY2s/OiBDb21wb3NlSGVhbHRoY2hlY2s7XG59XG5cbmV4cG9ydCB0eXBlIENvbXBvc2VOZXR3b3JrID0ge1xuXHQvKiogRml4ZWQgRG9ja2VyIG5ldHdvcmsgbmFtZSAoc2hhcmVhYmxlIGFjcm9zcyBjb21wb3NlIHByb2plY3RzKS4gKi9cblx0bmFtZTogc3RyaW5nO1xuXHRleHRlcm5hbD86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIExpdmUgYnVpbGRlciBmb3IgYGRvY2tlci1jb21wb3NlLnltbGAuXG4gKlxuICogRmVhdHVyZXMgY2FsbCBgYWRkU2VydmljZWAgLyBgYWRkVm9sdW1lYCAvIGBhZGROZXR3b3JrYCBpbiB0aGVpciBzY2FmZm9sZCBwaGFzZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NrZXJDb21wb3NlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFO1xuXHRwcml2YXRlIF9wcm9qZWN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogTWFwPHN0cmluZywgQ29tcG9zZVNlcnZpY2U+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF92b2x1bWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfbmV0d29ya3M6IE1hcDxzdHJpbmcsIENvbXBvc2VOZXR3b3JrPiA9IG5ldyBNYXAoKTtcblxuXHQvKiogQ29tcG9zZSBwcm9qZWN0IG5hbWUgKGBuYW1lOmAgdG9wLWxldmVsKSDigJQgaXNvbGF0ZXMgY29udGFpbmVycy92b2x1bWVzLiAqL1xuXHRwdWJsaWMgc2V0UHJvamVjdE5hbWUobmFtZTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fcHJvamVjdE5hbWUgPSBuYW1lO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZFNlcnZpY2UobmFtZTogc3RyaW5nLCBjb25maWc6IENvbXBvc2VTZXJ2aWNlKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMuc2V0KG5hbWUsIGNvbmZpZyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWxcIixcblx0XHRcdFx0Y29udGVudDogdGhpcy5nZXRDb250ZW50KCksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cblxuXHRwdWJsaWMgYWRkVm9sdW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3ZvbHVtZXMuYWRkKG5hbWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZE5ldHdvcmsoa2V5OiBzdHJpbmcsIG5ldHdvcms6IENvbXBvc2VOZXR3b3JrKTogdGhpcyB7XG5cdFx0dGhpcy5fbmV0d29ya3Muc2V0KGtleSwgbmV0d29yayk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQXBwZW5kIGFuIGVudl9maWxlIHBhdGggdG8gYW4gZXhpc3Rpbmcgc2VydmljZS4gKi9cblx0cHVibGljIGFkZEVudkZpbGUoc2VydmljZU5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGNvbnN0IHN2YyA9IHRoaXMuX3NlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7XG5cdFx0aWYgKHN2Yykgc3ZjLmVudl9maWxlID0gWy4uLihzdmMuZW52X2ZpbGUgPz8gW10pLCBmaWxlUGF0aF07XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29udGVudCgpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGlmICh0aGlzLl9wcm9qZWN0TmFtZSkge1xuXHRcdFx0bGluZXMucHVzaChgbmFtZTogJHt0aGlzLl9wcm9qZWN0TmFtZX1gLCBcIlwiKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcInNlcnZpY2VzOlwiKTtcblxuXHRcdGZvciAoY29uc3QgW25hbWUsIHN2Y10gb2YgdGhpcy5fc2VydmljZXMpIHtcblx0XHRcdGxpbmVzLnB1c2goYCAgJHtuYW1lfTpgKTtcblx0XHRcdGlmIChzdmMuYnVpbGQpIGxpbmVzLnB1c2goYCAgICBidWlsZDogJHtzdmMuYnVpbGR9YCk7XG5cdFx0XHRpZiAoc3ZjLmltYWdlKSBsaW5lcy5wdXNoKGAgICAgaW1hZ2U6ICR7c3ZjLmltYWdlfWApO1xuXHRcdFx0aWYgKHN2Yy5jb250YWluZXJfbmFtZSkgbGluZXMucHVzaChgICAgIGNvbnRhaW5lcl9uYW1lOiAke3N2Yy5jb250YWluZXJfbmFtZX1gKTtcblx0XHRcdGlmIChzdmMuY29tbWFuZCkgbGluZXMucHVzaChgICAgIGNvbW1hbmQ6ICR7c3ZjLmNvbW1hbmR9YCk7XG5cdFx0XHRpZiAoc3ZjLnJlc3RhcnQpIGxpbmVzLnB1c2goYCAgICByZXN0YXJ0OiAke3N2Yy5yZXN0YXJ0fWApO1xuXG5cdFx0XHRpZiAoc3ZjLnByb2ZpbGVzICYmIHN2Yy5wcm9maWxlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgcHJvZmlsZXM6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHAgb2Ygc3ZjLnByb2ZpbGVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7cH1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5lbnZfZmlsZSAmJiBzdmMuZW52X2ZpbGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIGVudl9maWxlOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmIG9mIHN2Yy5lbnZfZmlsZSkgbGluZXMucHVzaChgICAgICAgLSAke2Z9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZW52aXJvbm1lbnQgJiYgT2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZW52aXJvbm1lbnQ6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzdmMuZW52aXJvbm1lbnQpKSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChgICAgICAgJHtrfTogJHt2fWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMucG9ydHMgJiYgc3ZjLnBvcnRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICBwb3J0czpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgcCBvZiBzdmMucG9ydHMpIGxpbmVzLnB1c2goYCAgICAgIC0gXCIke3B9XCJgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy52b2x1bWVzICYmIHN2Yy52b2x1bWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICB2b2x1bWVzOlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCB2IG9mIHN2Yy52b2x1bWVzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7dn1gKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHN2Yy5uZXR3b3JrcyAmJiBzdmMubmV0d29ya3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjb25zdCBvbmx5U3RyaW5ncyA9IHN2Yy5uZXR3b3Jrcy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09IFwic3RyaW5nXCIpO1xuXHRcdFx0XHRpZiAob25seVN0cmluZ3MpIHtcblx0XHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIG5ldHdvcmtzOlwiKTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IG4gb2Ygc3ZjLm5ldHdvcmtzKSBsaW5lcy5wdXNoKGAgICAgICAtICR7biBhcyBzdHJpbmd9YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGluZXMucHVzaChcIiAgICBuZXR3b3JrczpcIik7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBuIG9mIHN2Yy5uZXR3b3Jrcykge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goYCAgICAgICR7bn06YCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuZXRLZXksIGNmZ10gb2YgT2JqZWN0LmVudHJpZXMobikpIHtcblx0XHRcdFx0XHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICAke25ldEtleX06YCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNmZy5hbGlhc2VzICYmIGNmZy5hbGlhc2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgICAgIGFsaWFzZXM6XCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhIG9mIGNmZy5hbGlhc2VzKSBsaW5lcy5wdXNoKGAgICAgICAgICAgLSAke2F9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZGVwZW5kc19vbiAmJiBzdmMuZGVwZW5kc19vbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZGVwZW5kc19vbjpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZCBvZiBzdmMuZGVwZW5kc19vbikgbGluZXMucHVzaChgICAgICAgLSAke2R9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuaGVhbHRoY2hlY2spIHtcblx0XHRcdFx0Y29uc3QgaGMgPSBzdmMuaGVhbHRoY2hlY2s7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgaGVhbHRoY2hlY2s6XCIpO1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICAgICB0ZXN0OiAke0pTT04uc3RyaW5naWZ5KGhjLnRlc3QpfWApO1xuXHRcdFx0XHRpZiAoaGMuaW50ZXJ2YWwpIGxpbmVzLnB1c2goYCAgICAgIGludGVydmFsOiAke2hjLmludGVydmFsfWApO1xuXHRcdFx0XHRpZiAoaGMudGltZW91dCkgbGluZXMucHVzaChgICAgICAgdGltZW91dDogJHtoYy50aW1lb3V0fWApO1xuXHRcdFx0XHRpZiAoaGMucmV0cmllcyAhPSBudWxsKSBsaW5lcy5wdXNoKGAgICAgICByZXRyaWVzOiAke2hjLnJldHJpZXN9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX25ldHdvcmtzLnNpemUgPiAwKSB7XG5cdFx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXHRcdFx0bGluZXMucHVzaChcIm5ldHdvcmtzOlwiKTtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgbmV0XSBvZiB0aGlzLl9uZXR3b3Jrcykge1xuXHRcdFx0XHRsaW5lcy5wdXNoKGAgICR7a2V5fTpgKTtcblx0XHRcdFx0bGluZXMucHVzaChgICAgIG5hbWU6ICR7bmV0Lm5hbWV9YCk7XG5cdFx0XHRcdGlmIChuZXQuZXh0ZXJuYWwpIGxpbmVzLnB1c2goXCIgICAgZXh0ZXJuYWw6IHRydWVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3ZvbHVtZXMuc2l6ZSA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdFx0XHRsaW5lcy5wdXNoKFwidm9sdW1lczpcIik7XG5cdFx0XHRmb3IgKGNvbnN0IHYgb2YgdGhpcy5fdm9sdW1lcykgbGluZXMucHVzaChgICAke3Z9OmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJEb2NrZXJDb21wb3NlIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkRPQ0tFUl9DT01QT1NFIiwiX3Byb2plY3ROYW1lIiwiX3NlcnZpY2VzIiwiTWFwIiwiX3ZvbHVtZXMiLCJTZXQiLCJfbmV0d29ya3MiLCJzZXRQcm9qZWN0TmFtZSIsIm5hbWUiLCJhZGRTZXJ2aWNlIiwiY29uZmlnIiwic2V0IiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJnZXRDb250ZW50IiwiYWRkVm9sdW1lIiwiYWRkIiwiYWRkTmV0d29yayIsIm5ldHdvcmsiLCJhZGRFbnZGaWxlIiwic2VydmljZU5hbWUiLCJzdmMiLCJnZXQiLCJlbnZfZmlsZSIsImxpbmVzIiwicHVzaCIsImJ1aWxkIiwiaW1hZ2UiLCJjb250YWluZXJfbmFtZSIsImNvbW1hbmQiLCJyZXN0YXJ0IiwicHJvZmlsZXMiLCJsZW5ndGgiLCJwIiwiZiIsImVudmlyb25tZW50IiwiT2JqZWN0Iiwia2V5cyIsImsiLCJ2IiwiZW50cmllcyIsInBvcnRzIiwidm9sdW1lcyIsIm5ldHdvcmtzIiwib25seVN0cmluZ3MiLCJldmVyeSIsIm4iLCJuZXRLZXkiLCJjZmciLCJhbGlhc2VzIiwiYSIsImRlcGVuZHNfb24iLCJkIiwiaGVhbHRoY2hlY2siLCJoYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsInNpemUiLCJuZXQiLCJleHRlcm5hbCIsImpvaW4iXSwibWFwcGluZ3MiOiI7Ozs7K0JBOENhQTs7O2VBQUFBOzs7dUJBOUNvQjtBQThDMUIsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLGNBQWMsQ0FBQztJQUM5Q0MsYUFBaUM7SUFDeEJDLFlBQXlDLElBQUlDLE1BQU07SUFDbkRDLFdBQXdCLElBQUlDLE1BQU07SUFDbENDLFlBQXlDLElBQUlILE1BQU07SUFFcEUsNEVBQTRFLEdBQzVFLEFBQU9JLGVBQWVDLElBQVksRUFBUTtRQUN6QyxJQUFJLENBQUNQLFlBQVksR0FBR087UUFDcEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsV0FBV0QsSUFBWSxFQUFFRSxNQUFzQixFQUFRO1FBQzdELElB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
@@ -25,8 +25,23 @@ const _createapi = require("../create-api.js");
25
25
  return undefined;
26
26
  }
27
27
  }
28
- // Base config uses env-var references for production; the dev config section
29
- // written below overrides only the concrete values needed locally.
28
+ function randomPassword() {
29
+ return (0, _nodecrypto.randomBytes)(16).toString("hex");
30
+ }
31
+ /** Safe Postgres identifier fragment from the project name. */ function toSqlIdentFragment(name) {
32
+ const cleaned = name.replace(/[^A-Za-z0-9_]/g, "_").replace(/^([^A-Za-z_])/, "p_$1");
33
+ return cleaned.length > 0 ? cleaned.slice(0, 40) : "app";
34
+ }
35
+ function passwordOrExisting(workspace, key, fallbackExistingKeys = []) {
36
+ const existing = readExistingEnvValue(workspace, key);
37
+ if (existing) return existing;
38
+ for (const alt of fallbackExistingKeys){
39
+ const v = readExistingEnvValue(workspace, alt);
40
+ if (v) return v;
41
+ }
42
+ return randomPassword();
43
+ }
44
+ // Production base: runtime app role only — no bootstrap, no admin/migrate secrets required.
30
45
  const DATABASE_BASE_CONFIG_YAML = `database:
31
46
  dataSources:
32
47
  - name: default
@@ -38,15 +53,43 @@ const DATABASE_BASE_CONFIG_YAML = `database:
38
53
  password: \${DB_PASSWORD}
39
54
  synchronize: false
40
55
  seed: false
41
- adminUser: \${DB_ADMIN_USER}
42
- adminPassword: \${DB_ADMIN_PASSWORD}
56
+ bootstrap: false
43
57
  `;
44
- // Dev config only overrides what differs from base — credentials come from .env via env-var references.
45
- // Host comes from DB_HOST in .env (postgres on the compose network; 127.0.0.1 from the host).
58
+ // Dev: enable bootstrap + migrate role; synchronize uses app DDL (dev-only exception).
46
59
  const DATABASE_DEV_CONFIG_YAML = `database:
47
60
  dataSources:
48
61
  - synchronize: true
49
62
  seed: true
63
+ bootstrap: true
64
+ adminUser: \${DB_ADMIN_USER}
65
+ adminPassword: \${DB_ADMIN_PASSWORD}
66
+ migrateUsername: \${DB_MIGRATE_USER}
67
+ migratePassword: \${DB_MIGRATE_PASSWORD}
68
+ `;
69
+ /** Runs once on first Postgres volume init — creates restricted bootstrap role (not superuser). */ const POSTGRES_INIT_BOOTSTRAP_SH = `#!/bin/bash
70
+ set -euo pipefail
71
+ # Container superuser (POSTGRES_USER) creates a restricted provisioner role.
72
+ # App/migrate roles are created later by codex-typeorm prepareDatabase (dev bootstrap).
73
+ : "\${DB_ADMIN_USER:?DB_ADMIN_USER is required}"
74
+ : "\${DB_ADMIN_PASSWORD:?DB_ADMIN_PASSWORD is required}"
75
+
76
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \\
77
+ \t--set=bootstrap_user="$DB_ADMIN_USER" \\
78
+ \t--set=bootstrap_password="$DB_ADMIN_PASSWORD" <<'EOSQL'
79
+ SELECT format(
80
+ \t'CREATE ROLE %I LOGIN PASSWORD %L CREATEDB CREATEROLE NOSUPERUSER NOBYPASSRLS',
81
+ \t:'bootstrap_user',
82
+ \t:'bootstrap_password'
83
+ )
84
+ WHERE NOT EXISTS (
85
+ \tSELECT 1 FROM pg_catalog.pg_roles WHERE rolname = :'bootstrap_user'
86
+ )\\gexec
87
+
88
+ GRANT ALL ON SCHEMA public TO :"bootstrap_user";
89
+ EOSQL
90
+
91
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \\
92
+ \t-c "GRANT ALL PRIVILEGES ON DATABASE \\"$POSTGRES_DB\\" TO \\"$DB_ADMIN_USER\\""
50
93
  `;
51
94
  const SAMPLE_ENTITY_TS = `import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
52
95
  import type { Entity as IEntity } from "@decohere/codex";
@@ -90,13 +133,19 @@ async function getOptions(_workspace, cliOptions) {
90
133
  function scaffold(workspace, options) {
91
134
  if (options.databaseProvider !== "postgres/typeorm") return;
92
135
  const name = workspace.name;
93
- // Prefer an existing POSTGRES_PASSWORD so re-scaffold does not rotate credentials
94
- // out from under an already-initialized Docker volume (Postgres only applies
95
- // POSTGRES_PASSWORD on first data-dir init).
96
- const existingPassword = readExistingEnvValue(workspace, "POSTGRES_PASSWORD");
97
- const password = existingPassword || (0, _nodecrypto.randomBytes)(16).toString("hex");
98
- const db = `${name}_dev`;
99
- const user = "postgres";
136
+ const ident = toSqlIdentFragment(name);
137
+ const db = `${ident}_dev`;
138
+ // Container init superuser — never reused as the API runtime role.
139
+ const postgresSuperuser = "postgres";
140
+ const postgresPassword = passwordOrExisting(workspace, "POSTGRES_PASSWORD");
141
+ const bootstrapUser = "decohere_bootstrap";
142
+ const bootstrapPassword = passwordOrExisting(workspace, "DB_ADMIN_PASSWORD", [
143
+ "POSTGRES_PASSWORD"
144
+ ]);
145
+ const appUser = `${ident}_app`;
146
+ const appPassword = passwordOrExisting(workspace, "DB_PASSWORD");
147
+ const migrateUser = `${ident}_migrate`;
148
+ const migratePassword = passwordOrExisting(workspace, "DB_MIGRATE_PASSWORD");
100
149
  const devContainer = workspace.getModel(_const.WELL_KNOWN_FILES.DEVCONTAINER_JSON);
101
150
  const compose = workspace.getModel(_const.WELL_KNOWN_FILES.DOCKER_COMPOSE);
102
151
  const networkKey = name;
@@ -107,12 +156,14 @@ function scaffold(workspace, options) {
107
156
  image: "postgres:16",
108
157
  container_name: `samples-${name}-postgres`,
109
158
  restart: "unless-stopped",
159
+ // Loopback-only: avoid exposing Postgres on LAN/public interfaces.
110
160
  // Host 5433 avoids clashing with a local/other Postgres on 5432.
111
161
  ports: [
112
- "5433:5432"
162
+ "127.0.0.1:5433:5432"
113
163
  ],
114
164
  volumes: [
115
- `${volumeName}:/var/lib/postgresql/data`
165
+ `${volumeName}:/var/lib/postgresql/data`,
166
+ "../.devcontainer/postgres-init:/docker-entrypoint-initdb.d:ro"
116
167
  ],
117
168
  networks: [
118
169
  {
@@ -126,22 +177,34 @@ function scaffold(workspace, options) {
126
177
  healthcheck: {
127
178
  test: [
128
179
  "CMD-SHELL",
129
- `pg_isready -U ${user} -d ${db}`
180
+ `pg_isready -U ${postgresSuperuser} -d ${db}`
130
181
  ],
131
182
  interval: "2s",
132
183
  timeout: "5s",
133
184
  retries: 15
134
185
  }
135
186
  }).addEnvFile("postgres", "../.env").addVolume(volumeName);
187
+ // Optional DB UI — enable with: docker compose --profile tools up -d
136
188
  compose?.addService("adminer", {
137
189
  image: "adminer",
190
+ profiles: [
191
+ "tools"
192
+ ],
138
193
  ports: [
139
- "8081:8080"
194
+ "127.0.0.1:8081:8080"
140
195
  ],
141
196
  networks: [
142
197
  networkKey
143
198
  ]
144
199
  });
200
+ workspace.addFile({
201
+ files: ()=>[
202
+ {
203
+ filePath: ".devcontainer/postgres-init/01-create-bootstrap-role.sh",
204
+ content: POSTGRES_INIT_BOOTSTRAP_SH
205
+ }
206
+ ]
207
+ });
145
208
  // Add SQLTools extension for DB browsing in VS Code
146
209
  devContainer?.addExtension("mtxr.sqltools");
147
210
  // Wire up main.ts
@@ -173,11 +236,11 @@ function scaffold(workspace, options) {
173
236
  });
174
237
  // .env at workspace root — postgres reads it via env_file above; devcontainer gets it here
175
238
  compose?.addEnvFile("devcontainer", "../.env");
176
- workspace.getModel(_const.WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", user).addEntry("POSTGRES_PASSWORD", password).addEntry("DB_HOST", "postgres").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", user).addEntry("DB_PASSWORD", password).addEntry("DB_ADMIN_USER", user).addEntry("DB_ADMIN_PASSWORD", password);
239
+ workspace.getModel(_const.WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", postgresSuperuser).addEntry("POSTGRES_PASSWORD", postgresPassword).addEntry("DB_HOST", "postgres").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", appUser).addEntry("DB_PASSWORD", appPassword).addEntry("DB_ADMIN_USER", bootstrapUser).addEntry("DB_ADMIN_PASSWORD", bootstrapPassword).addEntry("DB_MIGRATE_USER", migrateUser).addEntry("DB_MIGRATE_PASSWORD", migratePassword);
177
240
  }
178
241
  const DatabaseFeature = {
179
242
  getOptions,
180
243
  scaffold
181
244
  };
182
245
 
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgV0VCQVBJX1BST0pFQ1RfRElSIH0gZnJvbSBcIi4uL2NyZWF0ZS1hcGkuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL21haW4tc291cmNlLWZpbGUubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcHRpb25zID0ge1xuXHRkYXRhYmFzZVByb3ZpZGVyPzogXCJub25lXCIgfCBcInBvc3RncmVzL3R5cGVvcm1cIjtcbn07XG5cbi8qKiBSZWFkIGEgc2luZ2xlIEtFWT0gZnJvbSBhbiBleGlzdGluZyB0YXJnZXQgYC5lbnZgIChpZiBhbnkpLiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8vIEJhc2UgY29uZmlnIHVzZXMgZW52LXZhciByZWZlcmVuY2VzIGZvciBwcm9kdWN0aW9uOyB0aGUgZGV2IGNvbmZpZyBzZWN0aW9uXG4vLyB3cml0dGVuIGJlbG93IG92ZXJyaWRlcyBvbmx5IHRoZSBjb25jcmV0ZSB2YWx1ZXMgbmVlZGVkIGxvY2FsbHkuXG5jb25zdCBEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuYDtcblxuLy8gRGV2IGNvbmZpZyBvbmx5IG92ZXJyaWRlcyB3aGF0IGRpZmZlcnMgZnJvbSBiYXNlIOKAlCBjcmVkZW50aWFscyBjb21lIGZyb20gLmVudiB2aWEgZW52LXZhciByZWZlcmVuY2VzLlxuLy8gSG9zdCBjb21lcyBmcm9tIERCX0hPU1QgaW4gLmVudiAocG9zdGdyZXMgb24gdGhlIGNvbXBvc2UgbmV0d29yazsgMTI3LjAuMC4xIGZyb20gdGhlIGhvc3QpLlxuY29uc3QgREFUQUJBU0VfREVWX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICBzZWVkOiB0cnVlXG5gO1xuXG5jb25zdCBTQU1QTEVfRU5USVRZX1RTID0gYGltcG9ydCB7IENvbHVtbiwgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IGFzIElFbnRpdHkgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eSBpbXBsZW1lbnRzIElFbnRpdHkge1xuXFx0QFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuXFx0cHVibGljIGlkITogbnVtYmVyO1xuXG5cXHRAQ29sdW1uKClcblxcdHB1YmxpYyBuYW1lITogc3RyaW5nO1xufVxuYDtcblxuY29uc3QgU0FNUExFX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgU2FtcGxlRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxTYW1wbGVFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBTYW1wbGVFbnRpdHkpO1xuXFx0fVxufVxuYDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8RGF0YWJhc2VPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbeyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QgfSwgeyBsYWJlbDogXCJwb3N0Z3Jlcy90eXBlb3JtXCIgYXMgY29uc3QgfV07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcIlxcbiAgRGF0YWJhc2U6IFwiLCBjaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cdHJldHVybiB7IGRhdGFiYXNlUHJvdmlkZXI6IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIiB9O1xufVxuXG5mdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBEYXRhYmFzZU9wdGlvbnMpOiB2b2lkIHtcblx0aWYgKG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCIpIHJldHVybjtcblxuXHRjb25zdCBuYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdC8vIFByZWZlciBhbiBleGlzdGluZyBQT1NUR1JFU19QQVNTV09SRCBzbyByZS1zY2FmZm9sZCBkb2VzIG5vdCByb3RhdGUgY3JlZGVudGlhbHNcblx0Ly8gb3V0IGZyb20gdW5kZXIgYW4gYWxyZWFkeS1pbml0aWFsaXplZCBEb2NrZXIgdm9sdW1lIChQb3N0Z3JlcyBvbmx5IGFwcGxpZXNcblx0Ly8gUE9TVEdSRVNfUEFTU1dPUkQgb24gZmlyc3QgZGF0YS1kaXIgaW5pdCkuXG5cdGNvbnN0IGV4aXN0aW5nUGFzc3dvcmQgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIFwiUE9TVEdSRVNfUEFTU1dPUkRcIik7XG5cdGNvbnN0IHBhc3N3b3JkID0gZXhpc3RpbmdQYXNzd29yZCB8fCByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG5cdGNvbnN0IGRiID0gYCR7bmFtZX1fZGV2YDtcblx0Y29uc3QgdXNlciA9IFwicG9zdGdyZXNcIjtcblxuXHRjb25zdCBkZXZDb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RGV2Q29udGFpbmVyPihXRUxMX0tOT1dOX0ZJTEVTLkRFVkNPTlRBSU5FUl9KU09OKTtcblx0Y29uc3QgY29tcG9zZSA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEb2NrZXJDb21wb3NlPihXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFKTtcblxuXHRjb25zdCBuZXR3b3JrS2V5ID0gbmFtZTtcblx0Y29uc3Qgdm9sdW1lTmFtZSA9IGAke25hbWV9LXBvc3RncmVzLWRhdGFgO1xuXG5cdC8vIElzb2xhdGVkIGNvbXBvc2UgcHJvamVjdCBuZXR3b3JrICsgdm9sdW1lIChub3QgYXJrJ3Mgc2hhcmVkIFBvc3RncmVzKS5cblx0Ly8gQWxpYXMgYHBvc3RncmVzYCBzbyBvdGhlciBzdGFja3Mgb24gdGhlIHNhbWUgbmFtZWQgbmV0d29yayBjYW4gdXNlIERCX0hPU1Q9cG9zdGdyZXMuXG5cdGNvbXBvc2Vcblx0XHQ/LmFkZFNlcnZpY2UoXCJwb3N0Z3Jlc1wiLCB7XG5cdFx0XHRpbWFnZTogXCJwb3N0Z3JlczoxNlwiLFxuXHRcdFx0Y29udGFpbmVyX25hbWU6IGBzYW1wbGVzLSR7bmFtZX0tcG9zdGdyZXNgLFxuXHRcdFx0cmVzdGFydDogXCJ1bmxlc3Mtc3RvcHBlZFwiLFxuXHRcdFx0Ly8gSG9zdCA1NDMzIGF2b2lkcyBjbGFzaGluZyB3aXRoIGEgbG9jYWwvb3RoZXIgUG9zdGdyZXMgb24gNTQzMi5cblx0XHRcdHBvcnRzOiBbXCI1NDMzOjU0MzJcIl0sXG5cdFx0XHR2b2x1bWVzOiBbYCR7dm9sdW1lTmFtZX06L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhYF0sXG5cdFx0XHRuZXR3b3JrczogW3sgW25ldHdvcmtLZXldOiB7IGFsaWFzZXM6IFtcInBvc3RncmVzXCJdIH0gfV0sXG5cdFx0XHRoZWFsdGhjaGVjazoge1xuXHRcdFx0XHR0ZXN0OiBbXCJDTUQtU0hFTExcIiwgYHBnX2lzcmVhZHkgLVUgJHt1c2VyfSAtZCAke2RifWBdLFxuXHRcdFx0XHRpbnRlcnZhbDogXCIyc1wiLFxuXHRcdFx0XHR0aW1lb3V0OiBcIjVzXCIsXG5cdFx0XHRcdHJldHJpZXM6IDE1LFxuXHRcdFx0fSxcblx0XHR9KVxuXHRcdC5hZGRFbnZGaWxlKFwicG9zdGdyZXNcIiwgXCIuLi8uZW52XCIpXG5cdFx0LmFkZFZvbHVtZSh2b2x1bWVOYW1lKTtcblxuXHRjb21wb3NlPy5hZGRTZXJ2aWNlKFwiYWRtaW5lclwiLCB7XG5cdFx0aW1hZ2U6IFwiYWRtaW5lclwiLFxuXHRcdHBvcnRzOiBbXCI4MDgxOjgwODBcIl0sXG5cdFx0bmV0d29ya3M6IFtuZXR3b3JrS2V5XSxcblx0fSk7XG5cblx0Ly8gQWRkIFNRTFRvb2xzIGV4dGVuc2lvbiBmb3IgREIgYnJvd3NpbmcgaW4gVlMgQ29kZVxuXHRkZXZDb250YWluZXI/LmFkZEV4dGVuc2lvbihcIm10eHIuc3FsdG9vbHNcIik7XG5cblx0Ly8gV2lyZSB1cCBtYWluLnRzXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdD8uYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIpXG5cdFx0LmFkZEVudGl0eSh7IGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIiB9KVxuXHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRpbXBvcnRQYXRoOiBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSk7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJ0eXBlb3JtXCIsIFwiXjAuMy4yOFwiKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZFNjcmlwdChcImRiOnVwXCIsIFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgdXAgLWQgcG9zdGdyZXNcIilcblx0XHQuYWRkU2NyaXB0KFwiZGI6ZG93blwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIGRvd25cIilcblx0XHQuYWRkU2NyaXB0KFxuXHRcdFx0XCJkYjpyZXNldFwiLFxuXHRcdFx0XCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duIC12ICYmIGRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIsXG5cdFx0KTtcblxuXHQvLyBBZGQgY29kZXggZGVwcyB0byBhcGkgcGFja2FnZS5qc29uXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleFwiLCBDUkVBVEVfVkVSU0lPTilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKTtcblxuXHQvLyBBcHBlbmQgZGF0YWJhc2UgY29uZmlnIHNlY3Rpb25zXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MKTtcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwpO1xuXG5cdC8vIFJlZ2lzdGVyIGVudGl0eSBhbmQgcmVwb3NpdG9yeSBzb3VyY2UgZmlsZXMgaW4gdGhlIGFwaSBwcm9qZWN0XG5cdHdvcmtzcGFjZS5nZXRQcm9qZWN0KFdFQkFQSV9QUk9KRUNUX0RJUik/LmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9lbnRpdGllcy9zYW1wbGUuZW50aXR5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9FTlRJVFlfVFMsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9SRVBPU0lUT1JZX1RTLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHQvLyAuZW52IGF0IHdvcmtzcGFjZSByb290IOKAlCBwb3N0Z3JlcyByZWFkcyBpdCB2aWEgZW52X2ZpbGUgYWJvdmU7IGRldmNvbnRhaW5lciBnZXRzIGl0IGhlcmVcblx0Y29tcG9zZT8uYWRkRW52RmlsZShcImRldmNvbnRhaW5lclwiLCBcIi4uLy5lbnZcIik7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpXG5cdFx0Py5hZGRFbnRyeShcIlBPU1RHUkVTX0RCXCIsIGRiKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJQT1NUR1JFU19QQVNTV09SRFwiLCBwYXNzd29yZClcblx0XHQuYWRkRW50cnkoXCJEQl9IT1NUXCIsIFwicG9zdGdyZXNcIilcblx0XHQuYWRkRW50cnkoXCJEQl9QT1JUXCIsIFwiNTQzMlwiKVxuXHRcdC5hZGRFbnRyeShcIkRCX05BTUVcIiwgZGIpXG5cdFx0LmFkZEVudHJ5KFwiREJfVVNFUlwiLCB1c2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX1BBU1NXT1JEXCIsIHBhc3N3b3JkKVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9QQVNTV09SRFwiLCBwYXNzd29yZCk7XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhYmFzZUZlYXR1cmU6IEZlYXR1cmU8RGF0YWJhc2VPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJEYXRhYmFzZUZlYXR1cmUiLCJyZWFkRXhpc3RpbmdFbnZWYWx1ZSIsIndvcmtzcGFjZSIsImtleSIsInJhdyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJ0YXJnZXREaXIiLCJsaW5lIiwic3BsaXQiLCJmaW5kIiwibCIsInN0YXJ0c1dpdGgiLCJ2YWx1ZSIsInNsaWNlIiwibGVuZ3RoIiwidHJpbSIsInVuZGVmaW5lZCIsIkRBVEFCQVNFX0JBU0VfQ09ORklHX1lBTUwiLCJEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwiLCJTQU1QTEVfRU5USVRZX1RTIiwiU0FNUExFX1JFUE9TSVRPUllfVFMiLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJkYXRhYmFzZVByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwic2VsZWN0ZWQiLCJwaWNrIiwiYyIsInNjYWZmb2xkIiwib3B0aW9ucyIsIm5hbWUiLCJleGlzdGluZ1Bhc3N3b3JkIiwicGFzc3dvcmQiLCJyYW5kb21CeXRlcyIsInRvU3RyaW5nIiwiZGIiLCJ1c2VyIiwiZGV2Q29udGFpbmVyIiwiZ2V0TW9kZWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiREVWQ09OVEFJTkVSX0pTT04iLCJjb21wb3NlIiwiRE9DS0VSX0NPTVBPU0UiLCJuZXR3b3JrS2V5Iiwidm9sdW1lTmFtZSIsImFkZFNlcnZpY2UiLCJpbWFnZSIsImNvbnRhaW5lcl9uYW1lIiwicmVzdGFydCIsInBvcnRzIiwidm9sdW1lcyIsIm5ldHdvcmtzIiwiYWxpYXNlcyIsImhlYWx0aGNoZWNrIiwidGVzdCIsImludGVydmFsIiwidGltZW91dCIsInJldHJpZXMiLCJhZGRFbnZGaWxlIiwiYWRkVm9sdW1lIiwiYWRkRXh0ZW5zaW9uIiwiTUFJTl9UUyIsImFkZFNpZGVFZmZlY3RJbXBvcnQiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsIlBBQ0tBR0VfSlNPTiIsImFkZERlcGVuZGVuY3kiLCJDUkVBVEVfVkVSU0lPTiIsImFkZFNjcmlwdCIsIkFQSV9QQUNLQUdFX0pTT04iLCJDT05GSUdfWUFNTCIsImFkZFNlY3Rpb24iLCJDT05GSUdfREVWX1lBTUwiLCJnZXRQcm9qZWN0IiwiV0VCQVBJX1BST0pFQ1RfRElSIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFrTmFBOzs7ZUFBQUE7Ozs0QkFsTmU7d0JBQ0M7MEJBQ1I7d0JBQ0E7dUJBR1k7eUJBTUY7MkJBQ0k7QUFRbkMsZ0VBQWdFLEdBQ2hFLFNBQVNDLHFCQUFxQkMsU0FBNEIsRUFBRUMsR0FBVztJQUN0RSxJQUFJO1FBQ0gsTUFBTUMsTUFBTUMsSUFBQUEsb0JBQVksRUFBQ0MsSUFBQUEsY0FBSSxFQUFDSixVQUFVSyxTQUFTLEVBQUUsU0FBUztRQUM1RCxNQUFNQyxPQUFPSixJQUFJSyxLQUFLLENBQUMsTUFBTUMsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVDLFVBQVUsQ0FBQyxHQUFHVCxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNVSxRQUFRTCxNQUFNTSxNQUFNWCxJQUFJWSxNQUFNLEdBQUcsR0FBR0M7UUFDMUMsT0FBT0gsU0FBU0k7SUFDakIsRUFBRSxPQUFNO1FBQ1AsT0FBT0E7SUFDUjtBQUNEO0FBRUEsNkVBQTZF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
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgV0VCQVBJX1BST0pFQ1RfRElSIH0gZnJvbSBcIi4uL2NyZWF0ZS1hcGkuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL21haW4tc291cmNlLWZpbGUubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcHRpb25zID0ge1xuXHRkYXRhYmFzZVByb3ZpZGVyPzogXCJub25lXCIgfCBcInBvc3RncmVzL3R5cGVvcm1cIjtcbn07XG5cbi8qKiBSZWFkIGEgc2luZ2xlIEtFWT0gZnJvbSBhbiBleGlzdGluZyB0YXJnZXQgYC5lbnZgIChpZiBhbnkpLiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJhbmRvbVBhc3N3b3JkKCk6IHN0cmluZyB7XG5cdHJldHVybiByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG59XG5cbi8qKiBTYWZlIFBvc3RncmVzIGlkZW50aWZpZXIgZnJhZ21lbnQgZnJvbSB0aGUgcHJvamVjdCBuYW1lLiAqL1xuZnVuY3Rpb24gdG9TcWxJZGVudEZyYWdtZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGNsZWFuZWQgPSBuYW1lLnJlcGxhY2UoL1teQS1aYS16MC05X10vZywgXCJfXCIpLnJlcGxhY2UoL14oW15BLVphLXpfXSkvLCBcInBfJDFcIik7XG5cdHJldHVybiBjbGVhbmVkLmxlbmd0aCA+IDAgPyBjbGVhbmVkLnNsaWNlKDAsIDQwKSA6IFwiYXBwXCI7XG59XG5cbmZ1bmN0aW9uIHBhc3N3b3JkT3JFeGlzdGluZyhcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0a2V5OiBzdHJpbmcsXG5cdGZhbGxiYWNrRXhpc3RpbmdLZXlzOiBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3QgZXhpc3RpbmcgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIGtleSk7XG5cdGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXHRmb3IgKGNvbnN0IGFsdCBvZiBmYWxsYmFja0V4aXN0aW5nS2V5cykge1xuXHRcdGNvbnN0IHYgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIGFsdCk7XG5cdFx0aWYgKHYpIHJldHVybiB2O1xuXHR9XG5cdHJldHVybiByYW5kb21QYXNzd29yZCgpO1xufVxuXG4vLyBQcm9kdWN0aW9uIGJhc2U6IHJ1bnRpbWUgYXBwIHJvbGUgb25seSDigJQgbm8gYm9vdHN0cmFwLCBubyBhZG1pbi9taWdyYXRlIHNlY3JldHMgcmVxdWlyZWQuXG5jb25zdCBEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBib290c3RyYXA6IGZhbHNlXG5gO1xuXG4vLyBEZXY6IGVuYWJsZSBib290c3RyYXAgKyBtaWdyYXRlIHJvbGU7IHN5bmNocm9uaXplIHVzZXMgYXBwIERETCAoZGV2LW9ubHkgZXhjZXB0aW9uKS5cbmNvbnN0IERBVEFCQVNFX0RFVl9DT05GSUdfWUFNTCA9IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBzeW5jaHJvbml6ZTogdHJ1ZVxuICAgICAgc2VlZDogdHJ1ZVxuICAgICAgYm9vdHN0cmFwOiB0cnVlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuICAgICAgbWlncmF0ZVVzZXJuYW1lOiBcXCR7REJfTUlHUkFURV9VU0VSfVxuICAgICAgbWlncmF0ZVBhc3N3b3JkOiBcXCR7REJfTUlHUkFURV9QQVNTV09SRH1cbmA7XG5cbi8qKiBSdW5zIG9uY2Ugb24gZmlyc3QgUG9zdGdyZXMgdm9sdW1lIGluaXQg4oCUIGNyZWF0ZXMgcmVzdHJpY3RlZCBib290c3RyYXAgcm9sZSAobm90IHN1cGVydXNlcikuICovXG5jb25zdCBQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCA9IGAjIS9iaW4vYmFzaFxuc2V0IC1ldW8gcGlwZWZhaWxcbiMgQ29udGFpbmVyIHN1cGVydXNlciAoUE9TVEdSRVNfVVNFUikgY3JlYXRlcyBhIHJlc3RyaWN0ZWQgcHJvdmlzaW9uZXIgcm9sZS5cbiMgQXBwL21pZ3JhdGUgcm9sZXMgYXJlIGNyZWF0ZWQgbGF0ZXIgYnkgY29kZXgtdHlwZW9ybSBwcmVwYXJlRGF0YWJhc2UgKGRldiBib290c3RyYXApLlxuOiBcIlxcJHtEQl9BRE1JTl9VU0VSOj9EQl9BRE1JTl9VU0VSIGlzIHJlcXVpcmVkfVwiXG46IFwiXFwke0RCX0FETUlOX1BBU1NXT1JEOj9EQl9BRE1JTl9QQVNTV09SRCBpcyByZXF1aXJlZH1cIlxuXG5wc3FsIC12IE9OX0VSUk9SX1NUT1A9MSAtLXVzZXJuYW1lIFwiJFBPU1RHUkVTX1VTRVJcIiAtLWRibmFtZSBcIiRQT1NUR1JFU19EQlwiIFxcXFxcblxcdC0tc2V0PWJvb3RzdHJhcF91c2VyPVwiJERCX0FETUlOX1VTRVJcIiBcXFxcXG5cXHQtLXNldD1ib290c3RyYXBfcGFzc3dvcmQ9XCIkREJfQURNSU5fUEFTU1dPUkRcIiA8PCdFT1NRTCdcblNFTEVDVCBmb3JtYXQoXG5cXHQnQ1JFQVRFIFJPTEUgJUkgTE9HSU4gUEFTU1dPUkQgJUwgQ1JFQVRFREIgQ1JFQVRFUk9MRSBOT1NVUEVSVVNFUiBOT0JZUEFTU1JMUycsXG5cXHQ6J2Jvb3RzdHJhcF91c2VyJyxcblxcdDonYm9vdHN0cmFwX3Bhc3N3b3JkJ1xuKVxuV0hFUkUgTk9UIEVYSVNUUyAoXG5cXHRTRUxFQ1QgMSBGUk9NIHBnX2NhdGFsb2cucGdfcm9sZXMgV0hFUkUgcm9sbmFtZSA9IDonYm9vdHN0cmFwX3VzZXInXG4pXFxcXGdleGVjXG5cbkdSQU5UIEFMTCBPTiBTQ0hFTUEgcHVibGljIFRPIDpcImJvb3RzdHJhcF91c2VyXCI7XG5FT1NRTFxuXG5wc3FsIC12IE9OX0VSUk9SX1NUT1A9MSAtLXVzZXJuYW1lIFwiJFBPU1RHUkVTX1VTRVJcIiAtLWRibmFtZSBcIiRQT1NUR1JFU19EQlwiIFxcXFxcblxcdC1jIFwiR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gREFUQUJBU0UgXFxcXFwiJFBPU1RHUkVTX0RCXFxcXFwiIFRPIFxcXFxcIiREQl9BRE1JTl9VU0VSXFxcXFwiXCJcbmA7XG5cbmNvbnN0IFNBTVBMRV9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIG5hbWUhOiBzdHJpbmc7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfUkVQT1NJVE9SWV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBpbmplY3RVbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuaW1wb3J0IHsgVHlwZU9ybVJlcG9zaXRvcnksIFR5cGVPcm1Vbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvc2FtcGxlLmVudGl0eS5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5UmVwb3NpdG9yeSBleHRlbmRzIFR5cGVPcm1SZXBvc2l0b3J5PFNhbXBsZUVudGl0eT4ge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKEBpbmplY3RVbml0T2ZXb3JrKCkgdW5pdE9mV29yazogVHlwZU9ybVVuaXRPZldvcmspIHtcblxcdFxcdHN1cGVyKHVuaXRPZldvcmssIFNhbXBsZUVudGl0eSk7XG5cXHR9XG59XG5gO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHRfd29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPERhdGFiYXNlT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFt7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCB9LCB7IGxhYmVsOiBcInBvc3RncmVzL3R5cGVvcm1cIiBhcyBjb25zdCB9XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBEYXRhYmFzZTogXCIsIGNob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblx0cmV0dXJuIHsgZGF0YWJhc2VQcm92aWRlcjogc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiIH07XG59XG5cbmZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IERhdGFiYXNlT3B0aW9ucyk6IHZvaWQge1xuXHRpZiAob3B0aW9ucy5kYXRhYmFzZVByb3ZpZGVyICE9PSBcInBvc3RncmVzL3R5cGVvcm1cIikgcmV0dXJuO1xuXG5cdGNvbnN0IG5hbWUgPSB3b3Jrc3BhY2UubmFtZTtcblx0Y29uc3QgaWRlbnQgPSB0b1NxbElkZW50RnJhZ21lbnQobmFtZSk7XG5cdGNvbnN0IGRiID0gYCR7aWRlbnR9X2RldmA7XG5cdC8vIENvbnRhaW5lciBpbml0IHN1cGVydXNlciDigJQgbmV2ZXIgcmV1c2VkIGFzIHRoZSBBUEkgcnVudGltZSByb2xlLlxuXHRjb25zdCBwb3N0Z3Jlc1N1cGVydXNlciA9IFwicG9zdGdyZXNcIjtcblx0Y29uc3QgcG9zdGdyZXNQYXNzd29yZCA9IHBhc3N3b3JkT3JFeGlzdGluZyh3b3Jrc3BhY2UsIFwiUE9TVEdSRVNfUEFTU1dPUkRcIik7XG5cdGNvbnN0IGJvb3RzdHJhcFVzZXIgPSBcImRlY29oZXJlX2Jvb3RzdHJhcFwiO1xuXHRjb25zdCBib290c3RyYXBQYXNzd29yZCA9IHBhc3N3b3JkT3JFeGlzdGluZyh3b3Jrc3BhY2UsIFwiREJfQURNSU5fUEFTU1dPUkRcIiwgW1xuXHRcdFwiUE9TVEdSRVNfUEFTU1dPUkRcIixcblx0XSk7XG5cdGNvbnN0IGFwcFVzZXIgPSBgJHtpZGVudH1fYXBwYDtcblx0Y29uc3QgYXBwUGFzc3dvcmQgPSBwYXNzd29yZE9yRXhpc3Rpbmcod29ya3NwYWNlLCBcIkRCX1BBU1NXT1JEXCIpO1xuXHRjb25zdCBtaWdyYXRlVXNlciA9IGAke2lkZW50fV9taWdyYXRlYDtcblx0Y29uc3QgbWlncmF0ZVBhc3N3b3JkID0gcGFzc3dvcmRPckV4aXN0aW5nKHdvcmtzcGFjZSwgXCJEQl9NSUdSQVRFX1BBU1NXT1JEXCIpO1xuXG5cdGNvbnN0IGRldkNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEZXZDb250YWluZXI+KFdFTExfS05PV05fRklMRVMuREVWQ09OVEFJTkVSX0pTT04pO1xuXHRjb25zdCBjb21wb3NlID0gd29ya3NwYWNlLmdldE1vZGVsPERvY2tlckNvbXBvc2U+KFdFTExfS05PV05fRklMRVMuRE9DS0VSX0NPTVBPU0UpO1xuXG5cdGNvbnN0IG5ldHdvcmtLZXkgPSBuYW1lO1xuXHRjb25zdCB2b2x1bWVOYW1lID0gYCR7bmFtZX0tcG9zdGdyZXMtZGF0YWA7XG5cblx0Ly8gSXNvbGF0ZWQgY29tcG9zZSBwcm9qZWN0IG5ldHdvcmsgKyB2b2x1bWUgKG5vdCBhcmsncyBzaGFyZWQgUG9zdGdyZXMpLlxuXHQvLyBBbGlhcyBgcG9zdGdyZXNgIHNvIG90aGVyIHN0YWNrcyBvbiB0aGUgc2FtZSBuYW1lZCBuZXR3b3JrIGNhbiB1c2UgREJfSE9TVD1wb3N0Z3Jlcy5cblx0Y29tcG9zZVxuXHRcdD8uYWRkU2VydmljZShcInBvc3RncmVzXCIsIHtcblx0XHRcdGltYWdlOiBcInBvc3RncmVzOjE2XCIsXG5cdFx0XHRjb250YWluZXJfbmFtZTogYHNhbXBsZXMtJHtuYW1lfS1wb3N0Z3Jlc2AsXG5cdFx0XHRyZXN0YXJ0OiBcInVubGVzcy1zdG9wcGVkXCIsXG5cdFx0XHQvLyBMb29wYmFjay1vbmx5OiBhdm9pZCBleHBvc2luZyBQb3N0Z3JlcyBvbiBMQU4vcHVibGljIGludGVyZmFjZXMuXG5cdFx0XHQvLyBIb3N0IDU0MzMgYXZvaWRzIGNsYXNoaW5nIHdpdGggYSBsb2NhbC9vdGhlciBQb3N0Z3JlcyBvbiA1NDMyLlxuXHRcdFx0cG9ydHM6IFtcIjEyNy4wLjAuMTo1NDMzOjU0MzJcIl0sXG5cdFx0XHR2b2x1bWVzOiBbXG5cdFx0XHRcdGAke3ZvbHVtZU5hbWV9Oi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YWAsXG5cdFx0XHRcdFwiLi4vLmRldmNvbnRhaW5lci9wb3N0Z3Jlcy1pbml0Oi9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZDpyb1wiLFxuXHRcdFx0XSxcblx0XHRcdG5ldHdvcmtzOiBbeyBbbmV0d29ya0tleV06IHsgYWxpYXNlczogW1wicG9zdGdyZXNcIl0gfSB9XSxcblx0XHRcdGhlYWx0aGNoZWNrOiB7XG5cdFx0XHRcdHRlc3Q6IFtcIkNNRC1TSEVMTFwiLCBgcGdfaXNyZWFkeSAtVSAke3Bvc3RncmVzU3VwZXJ1c2VyfSAtZCAke2RifWBdLFxuXHRcdFx0XHRpbnRlcnZhbDogXCIyc1wiLFxuXHRcdFx0XHR0aW1lb3V0OiBcIjVzXCIsXG5cdFx0XHRcdHJldHJpZXM6IDE1LFxuXHRcdFx0fSxcblx0XHR9KVxuXHRcdC5hZGRFbnZGaWxlKFwicG9zdGdyZXNcIiwgXCIuLi8uZW52XCIpXG5cdFx0LmFkZFZvbHVtZSh2b2x1bWVOYW1lKTtcblxuXHQvLyBPcHRpb25hbCBEQiBVSSDigJQgZW5hYmxlIHdpdGg6IGRvY2tlciBjb21wb3NlIC0tcHJvZmlsZSB0b29scyB1cCAtZFxuXHRjb21wb3NlPy5hZGRTZXJ2aWNlKFwiYWRtaW5lclwiLCB7XG5cdFx0aW1hZ2U6IFwiYWRtaW5lclwiLFxuXHRcdHByb2ZpbGVzOiBbXCJ0b29sc1wiXSxcblx0XHRwb3J0czogW1wiMTI3LjAuMC4xOjgwODE6ODA4MFwiXSxcblx0XHRuZXR3b3JrczogW25ldHdvcmtLZXldLFxuXHR9KTtcblxuXHR3b3Jrc3BhY2UuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmRldmNvbnRhaW5lci9wb3N0Z3Jlcy1pbml0LzAxLWNyZWF0ZS1ib290c3RyYXAtcm9sZS5zaFwiLFxuXHRcdFx0XHRjb250ZW50OiBQT1NUR1JFU19JTklUX0JPT1RTVFJBUF9TSCxcblx0XHRcdH0sXG5cdFx0XSxcblx0fSk7XG5cblx0Ly8gQWRkIFNRTFRvb2xzIGV4dGVuc2lvbiBmb3IgREIgYnJvd3NpbmcgaW4gVlMgQ29kZVxuXHRkZXZDb250YWluZXI/LmFkZEV4dGVuc2lvbihcIm10eHIuc3FsdG9vbHNcIik7XG5cblx0Ly8gV2lyZSB1cCBtYWluLnRzXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdD8uYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIpXG5cdFx0LmFkZEVudGl0eSh7IGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIiB9KVxuXHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRpbXBvcnRQYXRoOiBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSk7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJ0eXBlb3JtXCIsIFwiXjAuMy4yOFwiKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZFNjcmlwdChcImRiOnVwXCIsIFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgdXAgLWQgcG9zdGdyZXNcIilcblx0XHQuYWRkU2NyaXB0KFwiZGI6ZG93blwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIGRvd25cIilcblx0XHQuYWRkU2NyaXB0KFxuXHRcdFx0XCJkYjpyZXNldFwiLFxuXHRcdFx0XCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duIC12ICYmIGRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIsXG5cdFx0KTtcblxuXHQvLyBBZGQgY29kZXggZGVwcyB0byBhcGkgcGFja2FnZS5qc29uXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleFwiLCBDUkVBVEVfVkVSU0lPTilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKTtcblxuXHQvLyBBcHBlbmQgZGF0YWJhc2UgY29uZmlnIHNlY3Rpb25zXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MKTtcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwpO1xuXG5cdC8vIFJlZ2lzdGVyIGVudGl0eSBhbmQgcmVwb3NpdG9yeSBzb3VyY2UgZmlsZXMgaW4gdGhlIGFwaSBwcm9qZWN0XG5cdHdvcmtzcGFjZS5nZXRQcm9qZWN0KFdFQkFQSV9QUk9KRUNUX0RJUik/LmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9lbnRpdGllcy9zYW1wbGUuZW50aXR5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9FTlRJVFlfVFMsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9SRVBPU0lUT1JZX1RTLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHQvLyAuZW52IGF0IHdvcmtzcGFjZSByb290IOKAlCBwb3N0Z3JlcyByZWFkcyBpdCB2aWEgZW52X2ZpbGUgYWJvdmU7IGRldmNvbnRhaW5lciBnZXRzIGl0IGhlcmVcblx0Y29tcG9zZT8uYWRkRW52RmlsZShcImRldmNvbnRhaW5lclwiLCBcIi4uLy5lbnZcIik7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpXG5cdFx0Py5hZGRFbnRyeShcIlBPU1RHUkVTX0RCXCIsIGRiKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1VTRVJcIiwgcG9zdGdyZXNTdXBlcnVzZXIpXG5cdFx0LmFkZEVudHJ5KFwiUE9TVEdSRVNfUEFTU1dPUkRcIiwgcG9zdGdyZXNQYXNzd29yZClcblx0XHQuYWRkRW50cnkoXCJEQl9IT1NUXCIsIFwicG9zdGdyZXNcIilcblx0XHQuYWRkRW50cnkoXCJEQl9QT1JUXCIsIFwiNTQzMlwiKVxuXHRcdC5hZGRFbnRyeShcIkRCX05BTUVcIiwgZGIpXG5cdFx0Ly8gUnVudGltZSBhcHAgcm9sZSAobGVhc3QgcHJpdmlsZWdlKSDigJQgdXNlZCBieSBUeXBlT1JNXG5cdFx0LmFkZEVudHJ5KFwiREJfVVNFUlwiLCBhcHBVc2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX1BBU1NXT1JEXCIsIGFwcFBhc3N3b3JkKVxuXHRcdC8vIEJvb3RzdHJhcCBwcm92aXNpb25lciAoQ1JFQVRFREIvQ1JFQVRFUk9MRSwgbm90IHN1cGVydXNlcikg4oCUIGRldiBwcmVwYXJlRGF0YWJhc2Ugb25seVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1VTRVJcIiwgYm9vdHN0cmFwVXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9QQVNTV09SRFwiLCBib290c3RyYXBQYXNzd29yZClcblx0XHQvLyBNaWdyYXRpb24vRERMIHJvbGUg4oCUIENJL2RlcGxveTsgbm90IG1vdW50ZWQgb24gQVBJIHBvZHMgaW4gcHJvZHVjdGlvblxuXHRcdC5hZGRFbnRyeShcIkRCX01JR1JBVEVfVVNFUlwiLCBtaWdyYXRlVXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9NSUdSQVRFX1BBU1NXT1JEXCIsIG1pZ3JhdGVQYXNzd29yZCk7XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhYmFzZUZlYXR1cmU6IEZlYXR1cmU8RGF0YWJhc2VPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJEYXRhYmFzZUZlYXR1cmUiLCJyZWFkRXhpc3RpbmdFbnZWYWx1ZSIsIndvcmtzcGFjZSIsImtleSIsInJhdyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJ0YXJnZXREaXIiLCJsaW5lIiwic3BsaXQiLCJmaW5kIiwibCIsInN0YXJ0c1dpdGgiLCJ2YWx1ZSIsInNsaWNlIiwibGVuZ3RoIiwidHJpbSIsInVuZGVmaW5lZCIsInJhbmRvbVBhc3N3b3JkIiwicmFuZG9tQnl0ZXMiLCJ0b1N0cmluZyIsInRvU3FsSWRlbnRGcmFnbWVudCIsIm5hbWUiLCJjbGVhbmVkIiwicmVwbGFjZSIsInBhc3N3b3JkT3JFeGlzdGluZyIsImZhbGxiYWNrRXhpc3RpbmdLZXlzIiwiZXhpc3RpbmciLCJhbHQiLCJ2IiwiREFUQUJBU0VfQkFTRV9DT05GSUdfWUFNTCIsIkRBVEFCQVNFX0RFVl9DT05GSUdfWUFNTCIsIlBPU1RHUkVTX0lOSVRfQk9PVFNUUkFQX1NIIiwiU0FNUExFX0VOVElUWV9UUyIsIlNBTVBMRV9SRVBPU0lUT1JZX1RTIiwiZ2V0T3B0aW9ucyIsIl93b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwiZGF0YWJhc2VQcm92aWRlciIsImNob2ljZXMiLCJsYWJlbCIsInNlbGVjdGVkIiwicGljayIsImMiLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJpZGVudCIsImRiIiwicG9zdGdyZXNTdXBlcnVzZXIiLCJwb3N0Z3Jlc1Bhc3N3b3JkIiwiYm9vdHN0cmFwVXNlciIsImJvb3RzdHJhcFBhc3N3b3JkIiwiYXBwVXNlciIsImFwcFBhc3N3b3JkIiwibWlncmF0ZVVzZXIiLCJtaWdyYXRlUGFzc3dvcmQiLCJkZXZDb250YWluZXIiLCJnZXRNb2RlbCIsIldFTExfS05PV05fRklMRVMiLCJERVZDT05UQUlORVJfSlNPTiIsImNvbXBvc2UiLCJET0NLRVJfQ09NUE9TRSIsIm5ldHdvcmtLZXkiLCJ2b2x1bWVOYW1lIiwiYWRkU2VydmljZSIsImltYWdlIiwiY29udGFpbmVyX25hbWUiLCJyZXN0YXJ0IiwicG9ydHMiLCJ2b2x1bWVzIiwibmV0d29ya3MiLCJhbGlhc2VzIiwiaGVhbHRoY2hlY2siLCJ0ZXN0IiwiaW50ZXJ2YWwiLCJ0aW1lb3V0IiwicmV0cmllcyIsImFkZEVudkZpbGUiLCJhZGRWb2x1bWUiLCJwcm9maWxlcyIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImFkZEV4dGVuc2lvbiIsIk1BSU5fVFMiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwiYWRkRW50aXR5IiwiY2xhc3NOYW1lIiwiaW1wb3J0UGF0aCIsImFkZFJlcG9zaXRvcnkiLCJQQUNLQUdFX0pTT04iLCJhZGREZXBlbmRlbmN5IiwiQ1JFQVRFX1ZFUlNJT04iLCJhZGRTY3JpcHQiLCJBUElfUEFDS0FHRV9KU09OIiwiQ09ORklHX1lBTUwiLCJhZGRTZWN0aW9uIiwiQ09ORklHX0RFVl9ZQU1MIiwiZ2V0UHJvamVjdCIsIldFQkFQSV9QUk9KRUNUX0RJUiIsIkVOVl9GSUxFIiwiYWRkRW50cnkiXSwibWFwcGluZ3MiOiI7Ozs7K0JBaVNhQTs7O2VBQUFBOzs7NEJBalNlO3dCQUNDOzBCQUNSO3dCQUNBO3VCQUdZO3lCQU1GOzJCQUNJO0FBUW5DLGdFQUFnRSxHQUNoRSxTQUFTQyxxQkFBcUJDLFNBQTRCLEVBQUVDLEdBQVc7SUFDdEUsSUFBSTtRQUNILE1BQU1DLE1BQU1DLElBQUFBLG9CQUFZLEVBQUNDLElBQUFBLGNBQUksRUFBQ0osVUFBVUssU0FBUyxFQUFFLFNBQVM7UUFDNUQsTUFBTUMsT0FBT0osSUFBSUssS0FBSyxDQUFDLE1BQU1DLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxVQUFVLENBQUMsR0FBR1QsSUFBSSxDQUFDLENBQUM7UUFDL0QsTUFBTVUsUUFBUUwsTUFBTU0sTUFBTVgsSUFBSVksTUFBTSxHQUFHLEdBQUdDO1FBQzFDLE9BQU9ILFNBQVNJO0lBQ2pCLEVBQUUsT0FBTTtRQUNQLE9BQU9BO0lBQ1I7QUFDRDtBQUVBLFNBQVNDO0lBQ1IsT0FBT0MsSUFBQUEsdUJBQVcsRUFBQyxJQUFJQyxRQUFRLENBQUM7QUFDakM7QUFFQSw2REFBNkQsR0FDN0QsU0FBU0MsbUJBQW1CQyxJQUFZO0lBQ3ZDLE1BQU1DLFVBQVVELEtBQUtFLE9BQU8sQ0FBQyxrQkFBa0IsS0FBS0EsT0FBTyxDQUFDLGlCQUFpQjtJQUM3RSxPQUFPRCxRQUFRUixNQUFNLEdBQUcsSUFBSVEsUUFBUVQsS0FBSyxDQUFDLEdBQUcsTUFBTTtBQUNwRDtBQUVBLFNBQVNXLG1CQUNSdkIsU0FBNEIsRUFDNUJDLEdBQVcsRUFDWHVCLHVCQUFpQyxFQUFFO0lBRW5DLE1BQU1DLFdBQVcxQixxQkFBcUJDLFdBQVdDO0lBQ2pELElB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