From 398f122593a8bef71c88183c6e59f7dc63c79313 Mon Sep 17 00:00:00 2001
From: Andras Bacsai
Date: Wed, 27 Sep 2023 15:48:19 +0200
Subject: [PATCH] fix: aaaaaaaaaaaaaaaaa
---
app/Http/Controllers/ProjectController.php | 47 +++++-----
app/Http/Livewire/Project/Service/Index.php | 13 ---
.../Shared/EnvironmentVariable/Show.php | 6 ++
app/Models/Service.php | 93 ++++++++++++++++---
app/Models/ServiceApplication.php | 10 ++
bootstrap/helpers/services.php | 8 +-
examples/service-templates.json | 47 +---------
.../livewire/project/service/index.blade.php | 6 +-
.../environment-variable/show.blade.php | 38 ++++++--
9 files changed, 159 insertions(+), 109 deletions(-)
diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php
index f02b240ba..827052ad9 100644
--- a/app/Http/Controllers/ProjectController.php
+++ b/app/Http/Controllers/ProjectController.php
@@ -70,11 +70,10 @@ public function new()
$oneClickServiceName = $type->after('one-click-service-')->value();
$oneClickService = data_get($services, "$oneClickServiceName.compose");
$oneClickDotEnvs = data_get($services, "$oneClickServiceName.envs", null);
- $oneClickConfiguration = data_get($services, "$oneClickServiceName.configuration.proxy", []);
- $oneClickConfiguration = collect($oneClickConfiguration);
if ($oneClickDotEnvs) {
$oneClickDotEnvs = Str::of(base64_decode($oneClickDotEnvs))->split('/\r\n|\r|\n/');
}
+ ray($oneClickDotEnvs);
if ($oneClickService) {
$service = Service::create([
'name' => "$oneClickServiceName-" . Str::random(10),
@@ -84,38 +83,44 @@ public function new()
]);
$service->name = "$oneClickServiceName-" . $service->uuid;
$service->save();
- if ($oneClickDotEnvs && $oneClickDotEnvs->count() > 0) {
+ if ($oneClickDotEnvs->count() > 0) {
$oneClickDotEnvs->each(function ($value) use ($service) {
$key = Str::before($value, '=');
$value = Str::of(Str::after($value, '='));
- if ($value->contains('SERVICE_USER')) {
- $value = Str::of(Str::random(10));
- }
- if ($value->contains('SERVICE_PASSWORD')) {
- $value = Str::of(Str::password(symbols: false));
- }
- if ($value->contains('SERVICE_PASSWORD64')) {
- $value = Str::of(Str::password(length: 64, symbols: false));
- }
- if ($value->contains('SERVICE_BASE64')) {
- $length = Str::of($value)->after('SERVICE_BASE64_')->beforeLast('_')->value();
- if (is_numeric($length)) {
- $length = (int) $length;
- } else {
- $length = 1;
+ $generatedValue = $value;
+ if ($value->contains('SERVICE_')) {
+ $command = $value->after('SERVICE_')->beforeLast('_');
+ switch ($command->value()) {
+ case 'PASSWORD':
+ $generatedValue = Str::password(symbols: false);
+ break;
+ case 'PASSWORD_64':
+ $generatedValue = Str::password(length: 64, symbols: false);
+ break;
+ case 'BASE64_64':
+ $generatedValue = Str::random(64);
+ break;
+ case 'BASE64_128':
+ $generatedValue = Str::random(128);
+ break;
+ case 'BASE64':
+ $generatedValue = Str::random(32);
+ break;
+ case 'USER':
+ $generatedValue = Str::random(16);
+ break;
}
- $value = Str::of(base64_encode(Str::password(length: $length, symbols: false)));
}
EnvironmentVariable::create([
'key' => $key,
- 'value' => $value->value(),
+ 'value' => $generatedValue,
'service_id' => $service->id,
'is_build_time' => false,
'is_preview' => false,
]);
});
}
- $service->parse(isNew: true, configuration: $oneClickConfiguration);
+ $service->parse(isNew: true);
return redirect()->route('project.service', [
'service_uuid' => $service->uuid,
diff --git a/app/Http/Livewire/Project/Service/Index.php b/app/Http/Livewire/Project/Service/Index.php
index 0d44632c7..017c878e7 100644
--- a/app/Http/Livewire/Project/Service/Index.php
+++ b/app/Http/Livewire/Project/Service/Index.php
@@ -53,19 +53,6 @@ public function render()
{
return view('livewire.project.service.index');
}
- // public function save()
- // {
- // try {
- // $this->service->save();
- // $this->service->parse();
- // $this->service->refresh();
- // $this->emit('refreshEnvs');
- // $this->emit('success', 'Service saved successfully.');
- // $this->service->saveComposeConfigs();
- // } catch (\Throwable $e) {
- // return handleError($e, $this);
- // }
- // }
public function submit()
{
try {
diff --git a/app/Http/Livewire/Project/Shared/EnvironmentVariable/Show.php b/app/Http/Livewire/Project/Shared/EnvironmentVariable/Show.php
index ec4205b9e..0ad197f1a 100644
--- a/app/Http/Livewire/Project/Shared/EnvironmentVariable/Show.php
+++ b/app/Http/Livewire/Project/Shared/EnvironmentVariable/Show.php
@@ -5,12 +5,14 @@
use App\Models\EnvironmentVariable as ModelsEnvironmentVariable;
use Livewire\Component;
use Visus\Cuid2\Cuid2;
+use Illuminate\Support\Str;
class Show extends Component
{
public $parameters;
public ModelsEnvironmentVariable $env;
public ?string $modalId = null;
+ public bool $isDisabled = false;
public string $type;
protected $rules = [
@@ -26,6 +28,10 @@ class Show extends Component
public function mount()
{
+ $this->isDisabled = false;
+ if (Str::of($this->env->key)->startsWith('SERVICE_FQDN') || Str::of($this->env->key)->startsWith('SERVICE_URL')) {
+ $this->isDisabled = true;
+ }
$this->modalId = new Cuid2(7);
$this->parameters = get_route_parameters();
}
diff --git a/app/Models/Service.php b/app/Models/Service.php
index 554ab3464..f03ef8a86 100644
--- a/app/Models/Service.php
+++ b/app/Models/Service.php
@@ -141,7 +141,7 @@ private function generateFqdn($serviceVariables, $serviceName, Collection $confi
}
public function parse(bool $isNew = false): Collection
{
- ray()->clearAll();
+ // ray()->clearAll();
if ($this->docker_compose_raw) {
try {
$yaml = Yaml::parse($this->docker_compose_raw);
@@ -155,7 +155,9 @@ public function parse(bool $isNew = false): Collection
$services = data_get($yaml, 'services');
$definedNetwork = $this->uuid;
- $services = collect($services)->map(function ($service, $serviceName) use ($topLevelVolumes, $topLevelNetworks, $definedNetwork, $isNew) {
+ $generatedServiceFQDNS = collect([]);
+
+ $services = collect($services)->map(function ($service, $serviceName) use ($topLevelVolumes, $topLevelNetworks, $definedNetwork, $isNew, $generatedServiceFQDNS) {
$serviceVolumes = collect(data_get($service, 'volumes', []));
$servicePorts = collect(data_get($service, 'ports', []));
$serviceNetworks = collect(data_get($service, 'networks', []));
@@ -207,6 +209,21 @@ public function parse(bool $isNew = false): Collection
])->first();
}
}
+ if (is_null($savedService)) {
+ if ($isDatabase) {
+ $savedService = ServiceDatabase::create([
+ 'name' => $serviceName,
+ 'image' => $image,
+ 'service_id' => $this->id
+ ]);
+ } else {
+ $savedService = ServiceApplication::create([
+ 'name' => $serviceName,
+ 'image' => $image,
+ 'service_id' => $this->id
+ ]);
+ }
+ }
// Collect/create/update networks
if ($serviceNetworks->count() > 0) {
@@ -258,6 +275,7 @@ public function parse(bool $isNew = false): Collection
$type = null;
$source = null;
$target = null;
+ $content = null;
if (is_string($volume)) {
$source = Str::of($volume)->before(':');
$target = Str::of($volume)->after(':')->beforeLast(':');
@@ -270,8 +288,15 @@ public function parse(bool $isNew = false): Collection
$type = data_get_str($volume, 'type');
$source = data_get_str($volume, 'source');
$target = data_get_str($volume, 'target');
+ $content = data_get($volume, 'content');
}
if ($type->value() === 'bind') {
+ if ($source->value() === "/var/run/docker.sock") {
+ continue;
+ }
+ if ($source->value() === '/tmp' || $source->value() === '/tmp/' ) {
+ continue;
+ }
LocalFileVolume::updateOrCreate(
[
'mount_path' => $target,
@@ -281,6 +306,7 @@ public function parse(bool $isNew = false): Collection
[
'fs_path' => $source,
'mount_path' => $target,
+ 'content' => $content,
'resource_id' => $savedService->id,
'resource_type' => get_class($savedService)
]
@@ -305,15 +331,15 @@ public function parse(bool $isNew = false): Collection
}
// Add env_file with at least .env to the service
- $envFile = collect(data_get($service, 'env_file', []));
- if ($envFile->count() > 0) {
- if (!$envFile->contains('.env')) {
- $envFile->push('.env');
- }
- } else {
- $envFile = collect(['.env']);
- }
- data_set($service, 'env_file', $envFile->toArray());
+ // $envFile = collect(data_get($service, 'env_file', []));
+ // if ($envFile->count() > 0) {
+ // if (!$envFile->contains('.env')) {
+ // $envFile->push('.env');
+ // }
+ // } else {
+ // $envFile = collect(['.env']);
+ // }
+ // data_set($service, 'env_file', $envFile->toArray());
// Get variables from the service
@@ -333,9 +359,38 @@ public function parse(bool $isNew = false): Collection
} else {
// SESSION_SECRET: 123
// SESSION_SECRET:
- $key = $variableName;
+ $key = Str::of($variableName);
$value = Str::of($variable);
}
+ if ($key->startsWith('SERVICE_FQDN')) {
+ if (is_null(data_get($savedService, 'fqdn'))) {
+ $sslip = $this->sslip($this->server);
+ $fqdn = "http://$containerName.$sslip";
+ if (substr_count($key->value(),'_') === 2) {
+ $path = $value->value();
+ if ($generatedServiceFQDNS->count() > 0) {
+ $alreadyGenerated = $generatedServiceFQDNS->has($key->value());
+ if ($alreadyGenerated) {
+ $fqdn = $generatedServiceFQDNS->get($key->value());
+ } else {
+ $generatedServiceFQDNS->put($key->value(), $fqdn);
+ }
+ } else {
+ ray($key, $fqdn);
+ $generatedServiceFQDNS->put($key->value(), $fqdn);
+ }
+ $fqdn = "http://$containerName.$sslip$path";
+
+ ray($fqdn);
+ }
+
+ if (!$isDatabase) {
+ $savedService->fqdn = $fqdn;
+ $savedService->save();
+ }
+ }
+ continue;
+ }
if ($value?->startsWith('$')) {
$value = Str::of(replaceVariables($value));
$key = $value;
@@ -415,6 +470,9 @@ public function parse(bool $isNew = false): Collection
$key = $value;
$defaultValue = null;
}
+ if ($foundEnv) {
+ $defaultValue = data_get($foundEnv, 'value');
+ }
EnvironmentVariable::updateOrCreate([
'key' => $key,
'service_id' => $this->id,
@@ -429,7 +487,7 @@ public function parse(bool $isNew = false): Collection
}
// Add labels to the service
- $fqdns = collect(data_get($savedService, 'fqdn'));
+ $fqdns = collect(data_get($savedService, 'fqdns'));
$defaultLabels = defaultLabels($this->id, $containerName, type: 'service', subType: $isDatabase ? 'database' : 'application', subId: $savedService->id);
$serviceLabels = $serviceLabels->merge($defaultLabels);
if (!$isDatabase && $fqdns->count() > 0) {
@@ -443,6 +501,15 @@ public function parse(bool $isNew = false): Collection
data_set($service, 'restart', RESTART_MODE);
data_set($service, 'container_name', $containerName);
data_forget($service, 'volumes.*.content');
+
+ // Remove unnecessary variables from service.environment
+ $withoutServiceEnvs = collect([]);
+ collect(data_get($service, 'environment'))->each(function ($value, $key) use ($withoutServiceEnvs) {
+ if (!Str::of($key)->startsWith('$SERVICE_')) {
+ $withoutServiceEnvs->put($key, $value);
+ }
+ });
+ data_set($service, 'environment', $withoutServiceEnvs->toArray());
return $service;
});
$finalServices = [
diff --git a/app/Models/ServiceApplication.php b/app/Models/ServiceApplication.php
index 125c6e51d..83980d364 100644
--- a/app/Models/ServiceApplication.php
+++ b/app/Models/ServiceApplication.php
@@ -2,6 +2,7 @@
namespace App\Models;
+use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Support\Facades\Cache;
@@ -26,6 +27,15 @@ public function fileStorages()
{
return $this->morphMany(LocalFileVolume::class, 'resource');
}
+ public function fqdns(): Attribute
+ {
+ return Attribute::make(
+ get: fn () => is_null($this->fqdn)
+ ? []
+ : explode(',', $this->fqdn),
+
+ );
+ }
public function saveFileVolumes()
{
saveFileVolumesHelper($this);
diff --git a/bootstrap/helpers/services.php b/bootstrap/helpers/services.php
index 4e6450cab..353e6853b 100644
--- a/bootstrap/helpers/services.php
+++ b/bootstrap/helpers/services.php
@@ -109,19 +109,13 @@ function updateCompose($resource) {
// Update FQDN
$variableName = "SERVICE_FQDN_" . Str::of($resource->name)->upper();
+ ray($variableName);
$generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first();
if ($generatedEnv){
$generatedEnv->value = $resource->fqdn;
$generatedEnv->save();
}
- // // Update URL
- // $variableName = "SERVICE_URL_" . Str::of($resource->name)->upper();
- // $generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first();
- // if ($generatedEnv){
- // $generatedEnv->value = $resource->url;
- // $generatedEnv->save();
- // }
$dockerComposeRaw = Yaml::dump($dockerCompose, 10, 2);
$resource->service->docker_compose_raw = $dockerComposeRaw;
diff --git a/examples/service-templates.json b/examples/service-templates.json
index 858ee4310..a228e6120 100644
--- a/examples/service-templates.json
+++ b/examples/service-templates.json
@@ -5,60 +5,23 @@
},
"uptime-kuma": {
"documentation": "https://github.com/louislam/uptime-kuma",
- "configuration": {
- "proxy": [
- {
- "name": "uptime-kuma",
- "path": "/"
- }
- ]
- },
- "compose": "c2VydmljZXM6CiAgdXB0aW1lLWt1bWE6CiAgICBpbWFnZTogbG91aXNsYW0vdXB0aW1lLWt1bWE6MQogICAgdm9sdW1lczoKICAgICAgLSB1cHRpbWUta3VtYTovYXBwL2RhdGEK"
+ "compose": "c2VydmljZXM6CiAgdXB0aW1lLWt1bWE6CiAgICBpbWFnZTogbG91aXNsYW0vdXB0aW1lLWt1bWE6MQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROCiAgICB2b2x1bWVzOgogICAgICAtIHVwdGltZS1rdW1hOi9hcHAvZGF0YQ=="
},
"appsmith": {
"documentation": "https://docs.appsmith.com/",
- "configuration": {
- "proxy": [
- {
- "name": "appsmith"
- }
- ]
- },
- "envs": "QVBQU01JVEhfTUFJTF9FTkFCTEVEPWZhbHNlCkFQUFNNSVRIX0RJU0FCTEVfVEVMRU1FVFJZPXRydWUKQVBQU01JVEhfRElTQUJMRV9JTlRFUkNPTT10cnVlCkFQUFNNSVRIX1NFTlRSWV9EU049CkFQUFNNSVRIX1NNQVJUX0xPT0tfSUQ9",
- "compose": "c2VydmljZXM6CiAgYXBwc21pdGg6CiAgICBpbWFnZTogaW5kZXguZG9ja2VyLmlvL2FwcHNtaXRoL2FwcHNtaXRoLWNlCiAgICB2b2x1bWVzOgogICAgICAtIHN0YWNrcy1kYXRhOi9hcHBzbWl0aC1zdGFja3M="
+ "compose": "c2VydmljZXM6CiAgYXBwc21pdGg6CiAgICBpbWFnZTogaW5kZXguZG9ja2VyLmlvL2FwcHNtaXRoL2FwcHNtaXRoLWNlCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE4KICAgICAgLSBBUFBTTUlUSF9NQUlMX0VOQUJMRUQ9ZmFsc2UKICAgICAgLSBBUFBTTUlUSF9ESVNBQkxFX1RFTEVNRVRSWT10cnVlCiAgICAgIC0gQVBQU01JVEhfRElTQUJMRV9JTlRFUkNPTT10cnVlCiAgICAgIC0gQVBQU01JVEhfU0VOVFJZX0RTTj0KICAgICAgLSBBUFBTTUlUSF9TTUFSVF9MT09LX0lEPQogICAgdm9sdW1lczoKICAgICAgLSBzdGFja3MtZGF0YTovYXBwc21pdGgtc3RhY2tz"
},
"fider": {
"documentation": "https://fider.io/docs",
- "compose":"c2VydmljZXM6CiAgZmlkZXI6CiAgICBpbWFnZTogZ2V0ZmlkZXIvZmlkZXI6c3RhYmxlCiAgICBlbnZpcm9ubWVudDoKICAgICAgQkFTRV9VUkw6ICRTRVJWSUNFX0ZRRE5fRklERVIKICAgICAgREFUQUJBU0VfVVJMOiBwb3N0Z3JlczovLyRTRVJWSUNFX1VTRVJfTVlTUUw6JFNFUlZJQ0VfUEFTU1dPUkRfTVlTUUxAZGF0YWJhc2U6NTQzMi9maWRlcj9zc2xtb2RlPWRpc2FibGUKICAgICAgSldUX1NFQ1JFVDogJFNFUlZJQ0VfUEFTU1dPUkQ2NF9GSURFUgogICAgICBFTUFJTF9OT1JFUExZOiAke0VNQUlMX05PUkVQTFk6LW5vcmVwbHlAZXhhbXBsZS5jb219CiAgICAgIEVNQUlMX01BSUxHVU5fQVBJOiAkRU1BSUxfTUFJTEdVTl9BUEkKICAgICAgRU1BSUxfTUFJTEdVTl9ET01BSU46ICRFTUFJTF9NQUlMR1VOX0RPTUFJTgogICAgICBFTUFJTF9NQUlMR1VOX1JFR0lPTjogJEVNQUlMX01BSUxHVU5fUkVHSU9OCiAgICAgIEVNQUlMX1NNVFBfSE9TVDogJHtFTUFJTF9TTVRQX0hPU1Q6LXNtdHAubWFpbGd1bi5jb219CiAgICAgIEVNQUlMX1NNVFBfUE9SVDogJHtFTUFJTF9TTVRQX1BPUlQ6LTU4N30KICAgICAgRU1BSUxfU01UUF9VU0VSTkFNRTogJHtFTUFJTF9TTVRQX1VTRVJOQU1FOi1wb3N0bWFzdGVyQG1haWxndW4uY29tfQogICAgICBFTUFJTF9TTVRQX1BBU1NXT1JEOiAkRU1BSUxfU01UUF9QQVNTV09SRAogICAgICBFTUFJTF9TTVRQX0VOQUJMRV9TVEFSVFRMUzogJEVNQUlMX1NNVFBfRU5BQkxFX1NUQVJUVExTCiAgICAgIEVNQUlMX0FXU1NFU19SRUdJT046ICRFTUFJTF9BV1NTRVNfUkVHSU9OCiAgICAgIEVNQUlMX0FXU1NFU19BQ0NFU1NfS0VZX0lEOiAkRU1BSUxfQVdTU0VTX0FDQ0VTU19LRVlfSUQKICAgICAgRU1BSUxfQVdTU0VTX1NFQ1JFVF9BQ0NFU1NfS0VZOiAkRU1BSUxfQVdTU0VTX1NFQ1JFVF9BQ0NFU1NfS0VZCiAgZGF0YWJhc2U6CiAgICBpbWFnZTogcG9zdGdyZXM6MTIKICAgIHZvbHVtZXM6CiAgICAgIC0gcGdfZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEKICAgIGVudmlyb25tZW50OgogICAgICBQT1NUR1JFU19VU0VSOiAkU0VSVklDRV9VU0VSX01ZU1FMCiAgICAgIFBPU1RHUkVTX1BBU1NXT1JEOiAkU0VSVklDRV9QQVNTV09SRF9NWVNRTAogICAgICBQT1NUR1JFU19EQjogJHtQT1NUR1JFU19EQjotZmlkZXJ9Cg=="
+ "compose": "c2VydmljZXM6CiAgZmlkZXI6CiAgICBpbWFnZTogZ2V0ZmlkZXIvZmlkZXI6c3RhYmxlCiAgICBlbnZpcm9ubWVudDoKICAgICAgQkFTRV9VUkw6ICRTRVJWSUNFX0ZRRE5fRklERVIKICAgICAgREFUQUJBU0VfVVJMOiBwb3N0Z3JlczovLyRTRVJWSUNFX1VTRVJfTVlTUUw6JFNFUlZJQ0VfUEFTU1dPUkRfTVlTUUxAZGF0YWJhc2U6NTQzMi9maWRlcj9zc2xtb2RlPWRpc2FibGUKICAgICAgSldUX1NFQ1JFVDogJFNFUlZJQ0VfUEFTU1dPUkRfNjRfRklERVIKICAgICAgRU1BSUxfTk9SRVBMWTogJHtFTUFJTF9OT1JFUExZOi1ub3JlcGx5QGV4YW1wbGUuY29tfQogICAgICBFTUFJTF9NQUlMR1VOX0FQSTogJEVNQUlMX01BSUxHVU5fQVBJCiAgICAgIEVNQUlMX01BSUxHVU5fRE9NQUlOOiAkRU1BSUxfTUFJTEdVTl9ET01BSU4KICAgICAgRU1BSUxfTUFJTEdVTl9SRUdJT046ICRFTUFJTF9NQUlMR1VOX1JFR0lPTgogICAgICBFTUFJTF9TTVRQX0hPU1Q6ICR7RU1BSUxfU01UUF9IT1NUOi1zbXRwLm1haWxndW4uY29tfQogICAgICBFTUFJTF9TTVRQX1BPUlQ6ICR7RU1BSUxfU01UUF9QT1JUOi01ODd9CiAgICAgIEVNQUlMX1NNVFBfVVNFUk5BTUU6ICR7RU1BSUxfU01UUF9VU0VSTkFNRTotcG9zdG1hc3RlckBtYWlsZ3VuLmNvbX0KICAgICAgRU1BSUxfU01UUF9QQVNTV09SRDogJEVNQUlMX1NNVFBfUEFTU1dPUkQKICAgICAgRU1BSUxfU01UUF9FTkFCTEVfU1RBUlRUTFM6ICRFTUFJTF9TTVRQX0VOQUJMRV9TVEFSVFRMUwogICAgICBFTUFJTF9BV1NTRVNfUkVHSU9OOiAkRU1BSUxfQVdTU0VTX1JFR0lPTgogICAgICBFTUFJTF9BV1NTRVNfQUNDRVNTX0tFWV9JRDogJEVNQUlMX0FXU1NFU19BQ0NFU1NfS0VZX0lECiAgICAgIEVNQUlMX0FXU1NFU19TRUNSRVRfQUNDRVNTX0tFWTogJEVNQUlMX0FXU1NFU19TRUNSRVRfQUNDRVNTX0tFWQogIGRhdGFiYXNlOgogICAgaW1hZ2U6IHBvc3RncmVzOjEyCiAgICB2b2x1bWVzOgogICAgICAtIHBnX2RhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhCiAgICBlbnZpcm9ubWVudDoKICAgICAgUE9TVEdSRVNfVVNFUjogJFNFUlZJQ0VfVVNFUl9NWVNRTAogICAgICBQT1NUR1JFU19QQVNTV09SRDogJFNFUlZJQ0VfUEFTU1dPUkRfTVlTUUwKICAgICAgUE9TVEdSRVNfREI6ICR7UE9TVEdSRVNfREI6LWZpZGVyfQo="
},
"ghost": {
"documentation": "https://ghost.org/docs",
- "configuration": {
- "proxy": [
- {
- "name": "ghost",
- "path": "/"
- }
- ]
- },
- "compose": "c2VydmljZXM6CiAgZ2hvc3Q6CiAgICBpbWFnZTogZ2hvc3Q6NQogICAgdm9sdW1lczoKICAgICAgLSBnaG9zdC1jb250ZW50LWRhdGE6L3Zhci9saWIvZ2hvc3QvY29udGVudAogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gdXJsPSRTRVJWSUNFX0ZRRE5fR0hPU1QKICAgICAgLSBkYXRhYmFzZV9fY2xpZW50PW15c3FsCiAgICAgIC0gZGF0YWJhc2VfX2Nvbm5lY3Rpb25fX2hvc3Q9bXlzcWwKICAgICAgLSBkYXRhYmFzZV9fY29ubmVjdGlvbl9fdXNlcj0kU0VSVklDRV9VU0VSX01ZU1FMCiAgICAgIC0gZGF0YWJhc2VfX2Nvbm5lY3Rpb25fX3Bhc3N3b3JkPSRTRVJWSUNFX1BBU1NXT1JEX01ZU1FMCiAgICAgIC0gZGF0YWJhc2VfX2Nvbm5lY3Rpb25fX2RhdGFiYXNlPSR7TVlTUUxfREFUQUJBU0UtZ2hvc3R9CiAgICBkZXBlbmRzX29uOgogICAgICAtIG15c3FsCiAgbXlzcWw6CiAgICBpbWFnZTogbXlzcWw6OC4wCiAgICB2b2x1bWVzOgogICAgICAtIGdob3N0LW15c3FsLWRhdGE6L3Zhci9saWIvbXlzcWwKICAgIGVudmlyb25tZW50OgogICAgICAtIE1ZU1FMX1VTRVI9JHtTRVJWSUNFX1VTRVJfTVlTUUx9CiAgICAgIC0gTVlTUUxfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX01ZU1FMfQogICAgICAtIE1ZU1FMX0RBVEFCQVNFPSR7TVlTUUxfREFUQUJBU0V9CiAgICAgIC0gTVlTUUxfUk9PVF9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfTVlTUUxfUk9PVH0= "
+ "compose": "c2VydmljZXM6CiAgZ2hvc3Q6CiAgICBpbWFnZTogZ2hvc3Q6NQogICAgdm9sdW1lczoKICAgICAgLSBnaG9zdC1jb250ZW50LWRhdGE6L3Zhci9saWIvZ2hvc3QvY29udGVudAogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gdXJsPSRTRVJWSUNFX0ZRRE5fR0hPU1QKICAgICAgLSBkYXRhYmFzZV9fY2xpZW50PW15c3FsCiAgICAgIC0gZGF0YWJhc2VfX2Nvbm5lY3Rpb25fX2hvc3Q9bXlzcWwKICAgICAgLSBkYXRhYmFzZV9fY29ubmVjdGlvbl9fdXNlcj0kU0VSVklDRV9VU0VSX01ZU1FMCiAgICAgIC0gZGF0YWJhc2VfX2Nvbm5lY3Rpb25fX3Bhc3N3b3JkPSRTRVJWSUNFX1BBU1NXT1JEX01ZU1FMCiAgICAgIC0gZGF0YWJhc2VfX2Nvbm5lY3Rpb25fX2RhdGFiYXNlPSR7TVlTUUxfREFUQUJBU0UtZ2hvc3R9CiAgICBkZXBlbmRzX29uOgogICAgICAtIG15c3FsCiAgbXlzcWw6CiAgICBpbWFnZTogbXlzcWw6OC4wCiAgICB2b2x1bWVzOgogICAgICAtIGdob3N0LW15c3FsLWRhdGE6L3Zhci9saWIvbXlzcWwKICAgIGVudmlyb25tZW50OgogICAgICAtIE1ZU1FMX1VTRVI9JHtTRVJWSUNFX1VTRVJfTVlTUUx9CiAgICAgIC0gTVlTUUxfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX01ZU1FMfQogICAgICAtIE1ZU1FMX0RBVEFCQVNFPSR7TVlTUUxfREFUQUJBU0V9CiAgICAgIC0gTVlTUUxfUk9PVF9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfTVlTUUxST09UfQ=="
},
"appwrite": {
"documentation": "https://appwrite.io/docs",
- "configuration": {
- "proxy": [
- {
- "name": "appwrite",
- "path": "/"
- },
- {
- "name": "appwrite-realtime",
- "customFqdn": "appwrite",
- "path": "/v1/realtime"
- }
- ]
- },
"envs": "X0FQUF9FTlY9cHJvZHVjdGlvbgpfQVBQX0xPQ0FMRT1lbgpfQVBQX09QVElPTlNfQUJVU0U9ZW5hYmxlZApfQVBQX09QVElPTlNfRk9SQ0VfSFRUUFM9ZGlzYWJsZWQKX0FQUF9PUEVOU1NMX0tFWV9WMT0KX0FQUF9ET01BSU5fRlVOQ1RJT05TPQpfQVBQX0NPTlNPTEVfV0hJVEVMSVNUX1JPT1Q9ZW5hYmxlZApfQVBQX0NPTlNPTEVfV0hJVEVMSVNUX0VNQUlMUz0KX0FQUF9DT05TT0xFX1dISVRFTElTVF9JUFM9Cl9BUFBfU1lTVEVNX0VNQUlMX05BTUU9QXBwd3JpdGUKX0FQUF9TWVNURU1fRU1BSUxfQUREUkVTUz10ZWFtQGFwcHdyaXRlLmlvCl9BUFBfU1lTVEVNX1JFU1BPTlNFX0ZPUk1BVD0KX0FQUF9TWVNURU1fU0VDVVJJVFlfRU1BSUxfQUREUkVTUz1jZXJ0c0BhcHB3cml0ZS5pbwpfQVBQX1VTQUdFX1NUQVRTPWVuYWJsZWQKX0FQUF9MT0dHSU5HX1BST1ZJREVSPQpfQVBQX0xPR0dJTkdfQ09ORklHPQpfQVBQX1VTQUdFX0FHR1JFR0FUSU9OX0lOVEVSVkFMPTMwCl9BUFBfVVNBR0VfVElNRVNFUklFU19JTlRFUlZBTD0zMApfQVBQX1VTQUdFX0RBVEFCQVNFX0lOVEVSVkFMPTkwMApfQVBQX1dPUktFUl9QRVJfQ09SRT02Cl9BUFBfUkVESVNfSE9TVD1yZWRpcwpfQVBQX1JFRElTX1BPUlQ9NjM3OQpfQVBQX1JFRElTX1VTRVI9Cl9BUFBfUkVESVNfUEFTUz0KX0FQUF9EQl9IT1NUPW1hcmlhZGIKX0FQUF9EQl9QT1JUPTMzMDYKX0FQUF9EQl9TQ0hFTUE9YXBwd3JpdGUKX0FQUF9EQl9VU0VSPSRTRVJWSUNFX1VTRVJfTVlTUUwKX0FQUF9EQl9QQVNTPSRTRVJWSUNFX1BBU1NXT1JEX01ZU1FMCl9BUFBfREJfUk9PVF9QQVNTPSRTRVJWSUNFX1BBU1NXT1JEX1JPT1RNWVNRTApfQVBQX0lORkxVWERCX0hPU1Q9aW5mbHV4ZGIKX0FQUF9JTkZMVVhEQl9QT1JUPTgwODYKX0FQUF9TVEFUU0RfSE9TVD10ZWxlZ3JhZgpfQVBQX1NUQVRTRF9QT1JUPTgxMjUKX0FQUF9TTVRQX0hPU1Q9Cl9BUFBfU01UUF9QT1JUPQpfQVBQX1NNVFBfU0VDVVJFPQpfQVBQX1NNVFBfVVNFUk5BTUU9Cl9BUFBfU01UUF9QQVNTV09SRD0KX0FQUF9TTVNfUFJPVklERVI9Cl9BUFBfU01TX0ZST009Cl9BUFBfU1RPUkFHRV9MSU1JVD0zMDAwMDAwMApfQVBQX1NUT1JBR0VfUFJFVklFV19MSU1JVD0yMDAwMDAwMApfQVBQX1NUT1JBR0VfQU5USVZJUlVTPWRpc2FibGVkCl9BUFBfU1RPUkFHRV9BTlRJVklSVVNfSE9TVD1jbGFtYXYKX0FQUF9TVE9SQUdFX0FOVElWSVJVU19QT1JUPTMzMTAKX0FQUF9TVE9SQUdFX0RFVklDRT1sb2NhbApfQVBQX1NUT1JBR0VfUzNfQUNDRVNTX0tFWT0KX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVD0KX0FQUF9TVE9SQUdFX1MzX1JFR0lPTj11cy1lYXN0LTEKX0FQUF9TVE9SQUdFX1MzX0JVQ0tFVD0KX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19BQ0NFU1NfS0VZPQpfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVD0KX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19SRUdJT049dXMtZWFzdC0xCl9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUPQpfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0FDQ0VTU19LRVk9Cl9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfU0VDUkVUPQpfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1JFR0lPTj11cy13ZXN0LTAwNApfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0JVQ0tFVD0KX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZPQpfQVBQX1NUT1JBR0VfTElOT0RFX1NFQ1JFVD0KX0FQUF9TVE9SQUdFX0xJTk9ERV9SRUdJT049ZXUtY2VudHJhbC0xCl9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUPQpfQVBQX1NUT1JBR0VfV0FTQUJJX0FDQ0VTU19LRVk9Cl9BUFBfU1RPUkFHRV9XQVNBQklfU0VDUkVUPQpfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTj1ldS1jZW50cmFsLTEKX0FQUF9TVE9SQUdFX1dBU0FCSV9CVUNLRVQ9Cl9BUFBfRlVOQ1RJT05TX1NJWkVfTElNSVQ9MzAwMDAwMDAKX0FQUF9GVU5DVElPTlNfVElNRU9VVD05MDAKX0FQUF9GVU5DVElPTlNfQlVJTERfVElNRU9VVD05MDAKX0FQUF9GVU5DVElPTlNfQ09OVEFJTkVSUz0xMApfQVBQX0ZVTkNUSU9OU19DUFVTPTAKX0FQUF9GVU5DVElPTlNfTUVNT1JZPTAKX0FQUF9GVU5DVElPTlNfTUVNT1JZX1NXQVA9MApfQVBQX0ZVTkNUSU9OU19SVU5USU1FUz1ub2RlLTE2LjAscGhwLTguMCxweXRob24tMy45LHJ1YnktMy4wCl9BUFBfRVhFQ1VUT1JfU0VDUkVUPXlvdXItc2VjcmV0LWtleQpfQVBQX0VYRUNVVE9SX0hPU1Q9aHR0cDovL2FwcHdyaXRlLWV4ZWN1dG9yL3YxCl9BUFBfRVhFQ1VUT1JfUlVOVElNRV9ORVRXT1JLPWFwcHdyaXRlX3J1bnRpbWVzCl9BUFBfRlVOQ1RJT05TX0VOVlM9bm9kZS0xNi4wLHBocC03LjQscHl0aG9uLTMuOSxydWJ5LTMuMApfQVBQX0ZVTkNUSU9OU19JTkFDVElWRV9USFJFU0hPTEQ9NjAKRE9DS0VSSFVCX1BVTExfVVNFUk5BTUU9CkRPQ0tFUkhVQl9QVUxMX1BBU1NXT1JEPQpET0NLRVJIVUJfUFVMTF9FTUFJTD0KT1BFTl9SVU5USU1FU19ORVRXT1JLPWFwcHdyaXRlX3J1bnRpbWVzCl9BUFBfRlVOQ1RJT05TX1JVTlRJTUVTX05FVFdPUks9cnVudGltZXMKX0FQUF9ET0NLRVJfSFVCX1VTRVJOQU1FPQpfQVBQX0RPQ0tFUl9IVUJfUEFTU1dPUkQ9Cl9BUFBfRlVOQ1RJT05TX01BSU5URU5BTkNFX0lOVEVSVkFMPTM2MDAKX0FQUF9WQ1NfR0lUSFVCX0FQUF9OQU1FPQpfQVBQX1ZDU19HSVRIVUJfUFJJVkFURV9LRVk9Cl9BUFBfVkNTX0dJVEhVQl9BUFBfSUQ9Cl9BUFBfVkNTX0dJVEhVQl9DTElFTlRfSUQ9Cl9BUFBfVkNTX0dJVEhVQl9DTElFTlRfU0VDUkVUPQpfQVBQX1ZDU19HSVRIVUJfV0VCSE9PS19TRUNSRVQ9Cl9BUFBfTUFJTlRFTkFOQ0VfSU5URVJWQUw9ODY0MDAKX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQ0FDSEU9MjU5MjAwMApfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9FWEVDVVRJT049MTIwOTYwMApfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9BVURJVD0xMjA5NjAwCl9BUFBfTUFJTlRFTkFOQ0VfUkVURU5USU9OX0FCVVNFPTg2NDAwCl9BUFBfTUFJTlRFTkFOQ0VfUkVURU5USU9OX1VTQUdFX0hPVVJMWT04NjQwMDAwCl9BUFBfTUFJTlRFTkFOQ0VfUkVURU5USU9OX1NDSEVEVUxFUz04NjQwMApfQVBQX0dSQVBIUUxfTUFYX0JBVENIX1NJWkU9MTAKX0FQUF9HUkFQSFFMX01BWF9DT01QTEVYSVRZPTI1MApfQVBQX0dSQVBIUUxfTUFYX0RFUFRIPTMKX0FQUF9NSUdSQVRJT05TX0ZJUkVCQVNFX0NMSUVOVF9JRD0KX0FQUF9NSUdSQVRJT05TX0ZJUkVCQVNFX0NMSUVOVF9TRUNSRVQ9Cl9BUFBfQVNTSVNUQU5UX09QRU5BSV9BUElfS0VZPQ==",
- "compose": "eC1sb2dnaW5nOiAmeC1sb2dnaW5nCiAgbG9nZ2luZzoKICAgIGRyaXZlcjogJ2pzb24tZmlsZScKICAgIG9wdGlvbnM6CiAgICAgIG1heC1maWxlOiAnNScKICAgICAgbWF4LXNpemU6ICcxMG0nCnZlcnNpb246ICczJwoKc2VydmljZXM6CiAgYXBwd3JpdGU6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBsYWJlbHM6CiAgICAgIC0gdHJhZWZpay5lbmFibGU9dHJ1ZQogICAgICAtIHRyYWVmaWsuY29uc3RyYWludC1sYWJlbC1zdGFjaz1hcHB3cml0ZQogICAgICAtIHRyYWVmaWsuaHR0cC5zZXJ2aWNlcy5hcHB3cml0ZV9hcGkubG9hZGJhbGFuY2VyLnNlcnZlci5wb3J0PTgwCiAgICAgICNodHRwCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfYXBpX2h0dHAuZW50cnlwb2ludHM9d2ViCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfYXBpX2h0dHAucnVsZT1QYXRoUHJlZml4KGAvYCkKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9hcGlfaHR0cC5zZXJ2aWNlPWFwcHdyaXRlX2FwaQogICAgICAjIGh0dHBzCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfYXBpX2h0dHBzLmVudHJ5cG9pbnRzPXdlYnNlY3VyZQogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX2FwaV9odHRwcy5ydWxlPVBhdGhQcmVmaXgoYC9gKQogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX2FwaV9odHRwcy5zZXJ2aWNlPWFwcHdyaXRlX2FwaQogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX2FwaV9odHRwcy50bHM9dHJ1ZQogICAgdm9sdW1lczoKICAgICAgLSBhcHB3cml0ZS11cGxvYWRzOi9zdG9yYWdlL3VwbG9hZHM6cncKICAgICAgLSBhcHB3cml0ZS1jYWNoZTovc3RvcmFnZS9jYWNoZTpydwogICAgICAtIGFwcHdyaXRlLWNvbmZpZzovc3RvcmFnZS9jb25maWc6cncKICAgICAgLSBhcHB3cml0ZS1jZXJ0aWZpY2F0ZXM6L3N0b3JhZ2UvY2VydGlmaWNhdGVzOnJ3CiAgICAgIC0gYXBwd3JpdGUtZnVuY3Rpb25zOi9zdG9yYWdlL2Z1bmN0aW9uczpydwogICAgZGVwZW5kc19vbjoKICAgICAgLSBtYXJpYWRiCiAgICAgIC0gcmVkaXMKIyAgICAgIC0gY2xhbWF2CiAgICAgIC0gaW5mbHV4ZGIKCiAgYXBwd3JpdGUtcmVhbHRpbWU6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHJlYWx0aW1lCiAgICA8PDogKngtbG9nZ2luZwogICAgbGFiZWxzOgogICAgICAtIHRyYWVmaWsuZW5hYmxlPXRydWUKICAgICAgLSAidHJhZWZpay5jb25zdHJhaW50LWxhYmVsLXN0YWNrPWFwcHdyaXRlIgogICAgICAtICJ0cmFlZmlrLmh0dHAuc2VydmljZXMuYXBwd3JpdGVfcmVhbHRpbWUubG9hZGJhbGFuY2VyLnNlcnZlci5wb3J0PTgwIgogICAgICAjd3MKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9yZWFsdGltZV93cy5lbnRyeXBvaW50cz13ZWIKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9yZWFsdGltZV93cy5ydWxlPVBhdGhQcmVmaXgoYC92MS9yZWFsdGltZWApCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfcmVhbHRpbWVfd3Muc2VydmljZT1hcHB3cml0ZV9yZWFsdGltZQogICAgICAjIHdzcwogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX3JlYWx0aW1lX3dzcy5lbnRyeXBvaW50cz13ZWJzZWN1cmUKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9yZWFsdGltZV93c3MucnVsZT1QYXRoUHJlZml4KGAvdjEvcmVhbHRpbWVgKQogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX3JlYWx0aW1lX3dzcy5zZXJ2aWNlPWFwcHdyaXRlX3JlYWx0aW1lCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfcmVhbHRpbWVfd3NzLnRscz10cnVlCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfcmVhbHRpbWVfd3NzLnRscy5jZXJ0cmVzb2x2ZXI9ZG5zCiAgICBkZXBlbmRzX29uOgogICAgICAtIG1hcmlhZGIKICAgICAgLSByZWRpcwoKICBhcHB3cml0ZS13b3JrZXItYXVkaXRzOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB3b3JrZXItYXVkaXRzCiAgICA8PDogKngtbG9nZ2luZwogICAgZGVwZW5kc19vbjoKICAgICAgLSByZWRpcwogICAgICAtIG1hcmlhZGIKCiAgYXBwd3JpdGUtd29ya2VyLXdlYmhvb2tzOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB3b3JrZXItd2ViaG9va3MKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgoKICBhcHB3cml0ZS13b3JrZXItZGVsZXRlczoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLWRlbGV0ZXMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgdm9sdW1lczogCiAgICAgIC0gYXBwd3JpdGUtdXBsb2Fkczovc3RvcmFnZS91cGxvYWRzOnJ3CiAgICAgIC0gYXBwd3JpdGUtY2FjaGU6L3N0b3JhZ2UvY2FjaGU6cncKICAgICAgLSBhcHB3cml0ZS1mdW5jdGlvbnM6L3N0b3JhZ2UvZnVuY3Rpb25zOnJ3CiAgICAgIC0gYXBwd3JpdGUtYnVpbGRzOi9zdG9yYWdlL2J1aWxkczpydwogICAgICAtIGFwcHdyaXRlLWNlcnRpZmljYXRlczovc3RvcmFnZS9jZXJ0aWZpY2F0ZXM6cncKCiAgYXBwd3JpdGUtd29ya2VyLWRhdGFiYXNlczoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLWRhdGFiYXNlcwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKICAgICAgLSBtYXJpYWRiCgogIGFwcHdyaXRlLXdvcmtlci1idWlsZHM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1idWlsZHMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgdm9sdW1lczoKICAgICAgLSBhcHB3cml0ZS1mdW5jdGlvbnM6L3N0b3JhZ2UvZnVuY3Rpb25zOnJ3CiAgICAgIC0gYXBwd3JpdGUtYnVpbGRzOi9zdG9yYWdlL2J1aWxkczpydwoKICBhcHB3cml0ZS13b3JrZXItY2VydGlmaWNhdGVzOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB3b3JrZXItY2VydGlmaWNhdGVzCiAgICA8PDogKngtbG9nZ2luZwogICAgZGVwZW5kc19vbjoKICAgICAgLSByZWRpcwogICAgICAtIG1hcmlhZGIKICAgIHZvbHVtZXM6IAogICAgICAtIGFwcHdyaXRlLWNvbmZpZzovc3RvcmFnZS9jb25maWc6cncKICAgICAgLSBhcHB3cml0ZS1jZXJ0aWZpY2F0ZXM6L3N0b3JhZ2UvY2VydGlmaWNhdGVzOnJ3CgogIGFwcHdyaXRlLXdvcmtlci1mdW5jdGlvbnM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1mdW5jdGlvbnMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgICAtIG9wZW5ydW50aW1lcy1leGVjdXRvcgoKICBhcHB3cml0ZS13b3JrZXItbWFpbHM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1tYWlscwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKCiAgYXBwd3JpdGUtd29ya2VyLW1lc3NhZ2luZzoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLW1lc3NhZ2luZwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKCiAgYXBwd3JpdGUtd29ya2VyLW1pZ3JhdGlvbnM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1taWdyYXRpb25zCiAgICA8PDogKngtbG9nZ2luZwogICAgZGVwZW5kc19vbjoKICAgICAgLSBtYXJpYWRiCgogIGFwcHdyaXRlLW1haW50ZW5hbmNlOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiBtYWludGVuYW5jZQogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKCiAgYXBwd3JpdGUtdXNhZ2U6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHVzYWdlCiAgICA8PDogKngtbG9nZ2luZwogICAgZGVwZW5kc19vbjoKICAgICAgLSBpbmZsdXhkYgogICAgICAtIG1hcmlhZGIKCiAgYXBwd3JpdGUtc2NoZWR1bGU6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHNjaGVkdWxlCiAgICA8PDogKngtbG9nZ2luZwogICAgZGVwZW5kc19vbjoKICAgICAgLSBtYXJpYWRiCiAgICAgIC0gcmVkaXMKCiAgYXBwd3JpdGUtYXNzaXN0YW50OgogICAgaW1hZ2U6IGFwcHdyaXRlL2Fzc2lzdGFudDowLjIuMQogICAgPDw6ICp4LWxvZ2dpbmcKICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCgogIG9wZW5ydW50aW1lcy1leGVjdXRvcjoKICAgIGhvc3RuYW1lOiBhcHB3cml0ZS1leGVjdXRvcgogICAgPDw6ICp4LWxvZ2dpbmcKICAgIHN0b3Bfc2lnbmFsOiBTSUdJTlQKICAgIGltYWdlOiBvcGVucnVudGltZXMvZXhlY3V0b3I6MC40LjEKICAgIHZvbHVtZXM6CiAgICAgIC0gL3Zhci9ydW4vZG9ja2VyLnNvY2s6L3Zhci9ydW4vZG9ja2VyLnNvY2sKICAgICAgLSBhcHB3cml0ZS1idWlsZHM6L3N0b3JhZ2UvYnVpbGRzOnJ3CiAgICAgIC0gYXBwd3JpdGUtZnVuY3Rpb25zOi9zdG9yYWdlL2Z1bmN0aW9uczpydwogICAgICAjIEhvc3QgbW91bnQgbmVzc2Vzc2FyeSB0byBzaGFyZSBmaWxlcyBiZXR3ZWVuIGV4ZWN1dG9yIGFuZCBydW50aW1lcy4KICAgICAgIyBJdCdzIG5vdCBwb3NzaWJsZSB0byBzaGFyZSBtb3VudCBmaWxlIGJldHdlZW4gMiBjb250YWluZXJzIHdpdGhvdXQgaG9zdCBtb3VudCAoY29weWluZyBpcyB0b28gc2xvdykKICAgICAgLSAvdG1wOi90bXA6cncKICAgIGVudmlyb25tZW50OgogICAgICAtIE9QUl9FWEVDVVRPUl9JTkFDVElWRV9UUkVTSE9MRD0kX0FQUF9GVU5DVElPTlNfSU5BQ1RJVkVfVEhSRVNIT0xECiAgICAgIC0gT1BSX0VYRUNVVE9SX01BSU5URU5BTkNFX0lOVEVSVkFMPSRfQVBQX0ZVTkNUSU9OU19NQUlOVEVOQU5DRV9JTlRFUlZBTAogICAgICAtIE9QUl9FWEVDVVRPUl9ORVRXT1JLPSRfQVBQX0ZVTkNUSU9OU19SVU5USU1FU19ORVRXT1JLCiAgICAgIC0gT1BSX0VYRUNVVE9SX0RPQ0tFUl9IVUJfVVNFUk5BTUU9JF9BUFBfRE9DS0VSX0hVQl9VU0VSTkFNRQogICAgICAtIE9QUl9FWEVDVVRPUl9ET0NLRVJfSFVCX1BBU1NXT1JEPSRfQVBQX0RPQ0tFUl9IVUJfUEFTU1dPUkQKICAgICAgLSBPUFJfRVhFQ1VUT1JfRU5WPSRfQVBQX0VOVgogICAgICAtIE9QUl9FWEVDVVRPUl9SVU5USU1FUz0kX0FQUF9GVU5DVElPTlNfUlVOVElNRVMKICAgICAgLSBPUFJfRVhFQ1VUT1JfU0VDUkVUPSRfQVBQX0VYRUNVVE9SX1NFQ1JFVAogICAgICAtIE9QUl9FWEVDVVRPUl9MT0dHSU5HX1BST1ZJREVSPSRfQVBQX0xPR0dJTkdfUFJPVklERVIKICAgICAgLSBPUFJfRVhFQ1VUT1JfTE9HR0lOR19DT05GSUc9JF9BUFBfTE9HR0lOR19DT05GSUcKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9ERVZJQ0U9JF9BUFBfU1RPUkFHRV9ERVZJQ0UKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9TM19BQ0NFU1NfS0VZPSRfQVBQX1NUT1JBR0VfUzNfQUNDRVNTX0tFWQogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX1NFQ1JFVD0kX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX1JFR0lPTj0kX0FQUF9TVE9SQUdFX1MzX1JFR0lPTgogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX0JVQ0tFVD0kX0FQUF9TVE9SQUdFX1MzX0JVQ0tFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0RPX1NQQUNFU19BQ0NFU1NfS0VZPSRfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0FDQ0VTU19LRVkKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9ET19TUEFDRVNfU0VDUkVUPSRfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0RPX1NQQUNFU19SRUdJT049JF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfUkVHSU9OCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfRE9fU1BBQ0VTX0JVQ0tFVD0kX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19CVUNLRVQKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9CQUNLQkxBWkVfQUNDRVNTX0tFWT0kX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9BQ0NFU1NfS0VZCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfQkFDS0JMQVpFX1NFQ1JFVD0kX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVQKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9CQUNLQkxBWkVfUkVHSU9OPSRfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1JFR0lPTgogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVQ9JF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfQlVDS0VUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfTElOT0RFX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9MSU5PREVfQUNDRVNTX0tFWQogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0xJTk9ERV9TRUNSRVQ9JF9BUFBfU1RPUkFHRV9MSU5PREVfU0VDUkVUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfTElOT0RFX1JFR0lPTj0kX0FQUF9TVE9SQUdFX0xJTk9ERV9SRUdJT04KICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9MSU5PREVfQlVDS0VUPSRfQVBQX1NUT1JBR0VfTElOT0RFX0JVQ0tFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1dBU0FCSV9BQ0NFU1NfS0VZPSRfQVBQX1NUT1JBR0VfV0FTQUJJX0FDQ0VTU19LRVkKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9XQVNBQklfU0VDUkVUPSRfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1dBU0FCSV9SRUdJT049JF9BUFBfU1RPUkFHRV9XQVNBQklfUkVHSU9OCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVD0kX0FQUF9TVE9SQUdFX1dBU0FCSV9CVUNLRVQKCiAgbWFyaWFkYjoKICAgIGltYWdlOiBtYXJpYWRiOjEwLjcgIyBmaXggaXNzdWVzIHdoZW4gdXBncmFkaW5nIHVzaW5nOiBteXNxbF91cGdyYWRlIC11IHJvb3QgLXAKICAgIDw8OiAqeC1sb2dnaW5nCiAgICB2b2x1bWVzOgogICAgICAtIGFwcHdyaXRlLW1hcmlhZGI6L3Zhci9saWIvbXlzcWw6cncKICAgIGVudmlyb25tZW50OgogICAgICAtIE1ZU1FMX1JPT1RfUEFTU1dPUkQ9JHtfQVBQX0RCX1JPT1RfUEFTU30KICAgICAgLSBNWVNRTF9EQVRBQkFTRT0ke19BUFBfREJfU0NIRU1BfQogICAgICAtIE1ZU1FMX1VTRVI9JHtfQVBQX0RCX1VTRVJ9CiAgICAgIC0gTVlTUUxfUEFTU1dPUkQ9JHtfQVBQX0RCX1BBU1N9CiAgICBjb21tYW5kOiAnbXlzcWxkIC0taW5ub2RiLWZsdXNoLW1ldGhvZD1mc3luYycKCiAgcmVkaXM6CiAgICBpbWFnZTogcmVkaXM6Ny4wLjQtYWxwaW5lCiAgICA8PDogKngtbG9nZ2luZwogICAgY29tbWFuZDogPgogICAgICByZWRpcy1zZXJ2ZXIKICAgICAgLS1tYXhtZW1vcnkgICAgICAgICAgICA1MTJtYgogICAgICAtLW1heG1lbW9yeS1wb2xpY3kgICAgIGFsbGtleXMtbHJ1CiAgICAgIC0tbWF4bWVtb3J5LXNhbXBsZXMgICAgNQogICAgdm9sdW1lczoKICAgICAgLSBhcHB3cml0ZS1yZWRpczovZGF0YTpydwoKICBjbGFtYXY6CiAgICBpbWFnZTogYXBwd3JpdGUvY2xhbWF2OjEuMi4wCiAgICB2b2x1bWVzOgogICAgICAtIGFwcHdyaXRlLXVwbG9hZHM6L3N0b3JhZ2UvdXBsb2FkcwoKICBpbmZsdXhkYjoKICAgIGltYWdlOiBhcHB3cml0ZS9pbmZsdXhkYjoxLjUuMAogICAgPDw6ICp4LWxvZ2dpbmcKICAgIHZvbHVtZXM6CiAgICAgIC0gYXBwd3JpdGUtaW5mbHV4ZGI6L3Zhci9saWIvaW5mbHV4ZGI6cncKCiAgdGVsZWdyYWY6CiAgICBpbWFnZTogYXBwd3JpdGUvdGVsZWdyYWY6MS40LjAKICAgIDw8OiAqeC1sb2dnaW5nCg== "
+ "compose": "eC1sb2dnaW5nOiAmeC1sb2dnaW5nCiAgbG9nZ2luZzoKICAgIGRyaXZlcjogJ2pzb24tZmlsZScKICAgIG9wdGlvbnM6CiAgICAgIG1heC1maWxlOiAnNScKICAgICAgbWF4LXNpemU6ICcxMG0nCnZlcnNpb246ICczJwoKc2VydmljZXM6CiAgYXBwd3JpdGU6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZQogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGxhYmVsczoKICAgICAgLSB0cmFlZmlrLmNvbnN0cmFpbnQtbGFiZWwtc3RhY2s9YXBwd3JpdGUKICAgICAgLSB0cmFlZmlrLmRvY2tlci5uZXR3b3JrPWFwcHdyaXRlCiAgICAgIC0gdHJhZWZpay5odHRwLnNlcnZpY2VzLmFwcHdyaXRlX2FwaS5sb2FkYmFsYW5jZXIuc2VydmVyLnBvcnQ9ODAKICAgICAgI2h0dHAKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9hcGlfaHR0cC5lbnRyeXBvaW50cz13ZWIKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9hcGlfaHR0cC5ydWxlPVBhdGhQcmVmaXgoYC9gKQogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX2FwaV9odHRwLnNlcnZpY2U9YXBwd3JpdGVfYXBpCiAgICAgICMgaHR0cHMKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9hcGlfaHR0cHMuZW50cnlwb2ludHM9d2Vic2VjdXJlCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfYXBpX2h0dHBzLnJ1bGU9UGF0aFByZWZpeChgL2ApCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfYXBpX2h0dHBzLnNlcnZpY2U9YXBwd3JpdGVfYXBpCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfYXBpX2h0dHBzLnRscz10cnVlCiAgICB2b2x1bWVzOgogICAgICAtIGFwcHdyaXRlLXVwbG9hZHM6L3N0b3JhZ2UvdXBsb2FkczpydwogICAgICAtIGFwcHdyaXRlLWNhY2hlOi9zdG9yYWdlL2NhY2hlOnJ3CiAgICAgIC0gYXBwd3JpdGUtY29uZmlnOi9zdG9yYWdlL2NvbmZpZzpydwogICAgICAtIGFwcHdyaXRlLWNlcnRpZmljYXRlczovc3RvcmFnZS9jZXJ0aWZpY2F0ZXM6cncKICAgICAgLSBhcHB3cml0ZS1mdW5jdGlvbnM6L3N0b3JhZ2UvZnVuY3Rpb25zOnJ3CiAgICBkZXBlbmRzX29uOgogICAgICAtIG1hcmlhZGIKICAgICAgLSByZWRpcwojICAgICAgLSBjbGFtYXYKICAgICAgLSBpbmZsdXhkYgogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0FQUFdSSVRFPS8KICAgICAgLSBfQVBQX0VOVgogICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFCiAgICAgIC0gX0FQUF9MT0NBTEUKICAgICAgLSBfQVBQX0NPTlNPTEVfV0hJVEVMSVNUX1JPT1QKICAgICAgLSBfQVBQX0NPTlNPTEVfV0hJVEVMSVNUX0VNQUlMUwogICAgICAtIF9BUFBfQ09OU09MRV9XSElURUxJU1RfSVBTCiAgICAgIC0gX0FQUF9TWVNURU1fRU1BSUxfTkFNRQogICAgICAtIF9BUFBfU1lTVEVNX0VNQUlMX0FERFJFU1MKICAgICAgLSBfQVBQX1NZU1RFTV9TRUNVUklUWV9FTUFJTF9BRERSRVNTCiAgICAgIC0gX0FQUF9TWVNURU1fUkVTUE9OU0VfRk9STUFUCiAgICAgIC0gX0FQUF9PUFRJT05TX0FCVVNFCiAgICAgIC0gX0FQUF9PUFRJT05TX0ZPUkNFX0hUVFBTCiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMQogICAgICAtIF9BUFBfRE9NQUlOCiAgICAgIC0gX0FQUF9ET01BSU5fVEFSR0VUCiAgICAgIC0gX0FQUF9ET01BSU5fRlVOQ1RJT05TCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX1NNVFBfSE9TVAogICAgICAtIF9BUFBfU01UUF9QT1JUCiAgICAgIC0gX0FQUF9TTVRQX1NFQ1VSRQogICAgICAtIF9BUFBfU01UUF9VU0VSTkFNRQogICAgICAtIF9BUFBfU01UUF9QQVNTV09SRAogICAgICAtIF9BUFBfVVNBR0VfU1RBVFMKICAgICAgLSBfQVBQX0lORkxVWERCX0hPU1QKICAgICAgLSBfQVBQX0lORkxVWERCX1BPUlQKICAgICAgLSBfQVBQX1NUT1JBR0VfTElNSVQKICAgICAgLSBfQVBQX1NUT1JBR0VfUFJFVklFV19MSU1JVAogICAgICAtIF9BUFBfU1RPUkFHRV9BTlRJVklSVVMKICAgICAgLSBfQVBQX1NUT1JBR0VfQU5USVZJUlVTX0hPU1QKICAgICAgLSBfQVBQX1NUT1JBR0VfQU5USVZJUlVTX1BPUlQKICAgICAgLSBfQVBQX1NUT1JBR0VfREVWSUNFCiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX0FDQ0VTU19LRVkKICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfU0VDUkVUCiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9TM19CVUNLRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0FDQ0VTU19LRVkKICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1NFQ1JFVAogICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfUkVHSU9OCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19CVUNLRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0FDQ0VTU19LRVkKICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1NFQ1JFVAogICAgICAtIF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfUkVHSU9OCiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfTElOT0RFX0FDQ0VTU19LRVkKICAgICAgLSBfQVBQX1NUT1JBR0VfTElOT0RFX1NFQ1JFVAogICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfUkVHSU9OCiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9CVUNLRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX0FDQ0VTU19LRVkKICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1NFQ1JFVAogICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfUkVHSU9OCiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9CVUNLRVQKICAgICAgLSBfQVBQX0ZVTkNUSU9OU19TSVpFX0xJTUlUCiAgICAgIC0gX0FQUF9GVU5DVElPTlNfVElNRU9VVAogICAgICAtIF9BUFBfRlVOQ1RJT05TX0JVSUxEX1RJTUVPVVQKICAgICAgLSBfQVBQX0ZVTkNUSU9OU19DUFVTCiAgICAgIC0gX0FQUF9GVU5DVElPTlNfTUVNT1JZCiAgICAgIC0gX0FQUF9GVU5DVElPTlNfUlVOVElNRVMKICAgICAgLSBfQVBQX0VYRUNVVE9SX1NFQ1JFVAogICAgICAtIF9BUFBfRVhFQ1VUT1JfSE9TVAogICAgICAtIF9BUFBfTE9HR0lOR19QUk9WSURFUgogICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUcKICAgICAgLSBfQVBQX1NUQVRTRF9IT1NUCiAgICAgIC0gX0FQUF9TVEFUU0RfUE9SVAogICAgICAtIF9BUFBfTUFJTlRFTkFOQ0VfSU5URVJWQUwKICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9FWEVDVVRJT04KICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9DQUNIRQogICAgICAtIF9BUFBfTUFJTlRFTkFOQ0VfUkVURU5USU9OX0FCVVNFCiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQVVESVQKICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9VU0FHRV9IT1VSTFkKICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9TQ0hFRFVMRVMKICAgICAgLSBfQVBQX1NNU19QUk9WSURFUgogICAgICAtIF9BUFBfU01TX0ZST00KICAgICAgLSBfQVBQX0dSQVBIUUxfTUFYX0JBVENIX1NJWkUKICAgICAgLSBfQVBQX0dSQVBIUUxfTUFYX0NPTVBMRVhJVFkKICAgICAgLSBfQVBQX0dSQVBIUUxfTUFYX0RFUFRICiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0FQUF9OQU1FCiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX1BSSVZBVEVfS0VZCiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0FQUF9JRAogICAgICAtIF9BUFBfVkNTX0dJVEhVQl9XRUJIT09LX1NFQ1JFVAogICAgICAtIF9BUFBfVkNTX0dJVEhVQl9DTElFTlRfU0VDUkVUCiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0NMSUVOVF9JRAogICAgICAtIF9BUFBfTUlHUkFUSU9OU19GSVJFQkFTRV9DTElFTlRfSUQKICAgICAgLSBfQVBQX01JR1JBVElPTlNfRklSRUJBU0VfQ0xJRU5UX1NFQ1JFVAogICAgICAtIF9BUFBfQVNTSVNUQU5UX09QRU5BSV9BUElfS0VZCgogIGFwcHdyaXRlLXJlYWx0aW1lOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiByZWFsdGltZQogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLXJlYWx0aW1lCiAgICA8PDogKngtbG9nZ2luZwogICAgbGFiZWxzOgogICAgICAtICJ0cmFlZmlrLmNvbnN0cmFpbnQtbGFiZWwtc3RhY2s9YXBwd3JpdGUiCiAgICAgIC0gInRyYWVmaWsuZG9ja2VyLm5ldHdvcms9YXBwd3JpdGUiCiAgICAgIC0gInRyYWVmaWsuaHR0cC5zZXJ2aWNlcy5hcHB3cml0ZV9yZWFsdGltZS5sb2FkYmFsYW5jZXIuc2VydmVyLnBvcnQ9ODAiCiAgICAgICN3cwogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX3JlYWx0aW1lX3dzLmVudHJ5cG9pbnRzPXdlYgogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX3JlYWx0aW1lX3dzLnJ1bGU9UGF0aFByZWZpeChgL3YxL3JlYWx0aW1lYCkKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9yZWFsdGltZV93cy5zZXJ2aWNlPWFwcHdyaXRlX3JlYWx0aW1lCiAgICAgICMgd3NzCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfcmVhbHRpbWVfd3NzLmVudHJ5cG9pbnRzPXdlYnNlY3VyZQogICAgICAtIHRyYWVmaWsuaHR0cC5yb3V0ZXJzLmFwcHdyaXRlX3JlYWx0aW1lX3dzcy5ydWxlPVBhdGhQcmVmaXgoYC92MS9yZWFsdGltZWApCiAgICAgIC0gdHJhZWZpay5odHRwLnJvdXRlcnMuYXBwd3JpdGVfcmVhbHRpbWVfd3NzLnNlcnZpY2U9YXBwd3JpdGVfcmVhbHRpbWUKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9yZWFsdGltZV93c3MudGxzPXRydWUKICAgICAgLSB0cmFlZmlrLmh0dHAucm91dGVycy5hcHB3cml0ZV9yZWFsdGltZV93c3MudGxzLmNlcnRyZXNvbHZlcj1kbnMKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIG1hcmlhZGIKICAgICAgLSByZWRpcwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0FQUFdSSVRFPS92MS9yZWFsdGltZQogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX09QVElPTlNfQUJVU0UKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX1VTQUdFX1NUQVRTCiAgICAgIC0gX0FQUF9MT0dHSU5HX1BST1ZJREVSCiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJRwoKICBhcHB3cml0ZS13b3JrZXItYXVkaXRzOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB3b3JrZXItYXVkaXRzCiAgICA8PDogKngtbG9nZ2luZwogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLXdvcmtlci1hdWRpdHMKICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCiAgICBuZXR3b3JrczoKICAgICAgLSBhcHB3cml0ZQogICAgZGVwZW5kc19vbjoKICAgICAgLSByZWRpcwogICAgICAtIG1hcmlhZGIKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX0xPR0dJTkdfUFJPVklERVIKICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHCgogIGFwcHdyaXRlLXdvcmtlci13ZWJob29rczoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLXdlYmhvb2tzCiAgICA8PDogKngtbG9nZ2luZwogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLXdvcmtlci13ZWJob29rcwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gX0FQUF9FTlYKICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRQogICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjEKICAgICAgLSBfQVBQX1NZU1RFTV9TRUNVUklUWV9FTUFJTF9BRERSRVNTCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9MT0dHSU5HX1BST1ZJREVSCiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJRwoKICBhcHB3cml0ZS13b3JrZXItZGVsZXRlczoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLWRlbGV0ZXMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtd29ya2VyLWRlbGV0ZXMKICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCiAgICBuZXR3b3JrczoKICAgICAgLSBhcHB3cml0ZQogICAgZGVwZW5kc19vbjoKICAgICAgLSByZWRpcwogICAgICAtIG1hcmlhZGIKICAgIHZvbHVtZXM6IAogICAgICAtIGFwcHdyaXRlLXVwbG9hZHM6L3N0b3JhZ2UvdXBsb2FkczpydwogICAgICAtIGFwcHdyaXRlLWNhY2hlOi9zdG9yYWdlL2NhY2hlOnJ3CiAgICAgIC0gYXBwd3JpdGUtZnVuY3Rpb25zOi9zdG9yYWdlL2Z1bmN0aW9uczpydwogICAgICAtIGFwcHdyaXRlLWJ1aWxkczovc3RvcmFnZS9idWlsZHM6cncKICAgICAgLSBhcHB3cml0ZS1jZXJ0aWZpY2F0ZXM6L3N0b3JhZ2UvY2VydGlmaWNhdGVzOnJ3CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBfQVBQX0VOVgogICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFCiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMQogICAgICAtIF9BUFBfUkVESVNfSE9TVAogICAgICAtIF9BUFBfUkVESVNfUE9SVAogICAgICAtIF9BUFBfUkVESVNfVVNFUgogICAgICAtIF9BUFBfUkVESVNfUEFTUwogICAgICAtIF9BUFBfREJfSE9TVAogICAgICAtIF9BUFBfREJfUE9SVAogICAgICAtIF9BUFBfREJfU0NIRU1BCiAgICAgIC0gX0FQUF9EQl9VU0VSCiAgICAgIC0gX0FQUF9EQl9QQVNTCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RFVklDRQogICAgICAtIF9BUFBfU1RPUkFHRV9TM19BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVAogICAgICAtIF9BUFBfU1RPUkFHRV9TM19SRUdJT04KICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfTElOT0RFX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQlVDS0VUCiAgICAgIC0gX0FQUF9MT0dHSU5HX1BST1ZJREVSCiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJRwogICAgICAtIF9BUFBfRVhFQ1VUT1JfU0VDUkVUCiAgICAgIC0gX0FQUF9FWEVDVVRPUl9IT1NUCgogIGFwcHdyaXRlLXdvcmtlci1kYXRhYmFzZXM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1kYXRhYmFzZXMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtd29ya2VyLWRhdGFiYXNlcwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gX0FQUF9FTlYKICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRQogICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjEKICAgICAgLSBfQVBQX1JFRElTX0hPU1QKICAgICAgLSBfQVBQX1JFRElTX1BPUlQKICAgICAgLSBfQVBQX1JFRElTX1VTRVIKICAgICAgLSBfQVBQX1JFRElTX1BBU1MKICAgICAgLSBfQVBQX0RCX0hPU1QKICAgICAgLSBfQVBQX0RCX1BPUlQKICAgICAgLSBfQVBQX0RCX1NDSEVNQQogICAgICAtIF9BUFBfREJfVVNFUgogICAgICAtIF9BUFBfREJfUEFTUwogICAgICAtIF9BUFBfTE9HR0lOR19QUk9WSURFUgogICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUcKCiAgYXBwd3JpdGUtd29ya2VyLWJ1aWxkczoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLWJ1aWxkcwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZS13b3JrZXItYnVpbGRzCiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZAogICAgbmV0d29ya3M6CiAgICAgIC0gYXBwd3JpdGUKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKICAgICAgLSBtYXJpYWRiCiAgICB2b2x1bWVzOgogICAgICAtIGFwcHdyaXRlLWZ1bmN0aW9uczovc3RvcmFnZS9mdW5jdGlvbnM6cncKICAgICAgLSBhcHB3cml0ZS1idWlsZHM6L3N0b3JhZ2UvYnVpbGRzOnJ3CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBfQVBQX0VOVgogICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFCiAgICAgIC0gX0FQUF9PUEVOU1NMX0tFWV9WMQogICAgICAtIF9BUFBfRVhFQ1VUT1JfU0VDUkVUCiAgICAgIC0gX0FQUF9FWEVDVVRPUl9IT1NUCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX0xPR0dJTkdfUFJPVklERVIKICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHCiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0FQUF9OQU1FCiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX1BSSVZBVEVfS0VZCiAgICAgIC0gX0FQUF9WQ1NfR0lUSFVCX0FQUF9JRAogICAgICAtIF9BUFBfRlVOQ1RJT05TX1RJTUVPVVQKICAgICAgLSBfQVBQX0ZVTkNUSU9OU19CVUlMRF9USU1FT1VUCiAgICAgIC0gX0FQUF9GVU5DVElPTlNfQ1BVUwogICAgICAtIF9BUFBfRlVOQ1RJT05TX01FTU9SWQogICAgICAtIF9BUFBfT1BUSU9OU19GT1JDRV9IVFRQUwogICAgICAtIF9BUFBfRE9NQUlOCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RFVklDRQogICAgICAtIF9BUFBfU1RPUkFHRV9TM19BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX1MzX1NFQ1JFVAogICAgICAtIF9BUFBfU1RPUkFHRV9TM19SRUdJT04KICAgICAgLSBfQVBQX1NUT1JBR0VfUzNfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX0xJTk9ERV9TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfTElOT0RFX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUCiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9BQ0NFU1NfS0VZCiAgICAgIC0gX0FQUF9TVE9SQUdFX1dBU0FCSV9TRUNSRVQKICAgICAgLSBfQVBQX1NUT1JBR0VfV0FTQUJJX1JFR0lPTgogICAgICAtIF9BUFBfU1RPUkFHRV9XQVNBQklfQlVDS0VUCgogIGFwcHdyaXRlLXdvcmtlci1jZXJ0aWZpY2F0ZXM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1jZXJ0aWZpY2F0ZXMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtd29ya2VyLWNlcnRpZmljYXRlcwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgdm9sdW1lczogCiAgICAgIC0gYXBwd3JpdGUtY29uZmlnOi9zdG9yYWdlL2NvbmZpZzpydwogICAgICAtIGFwcHdyaXRlLWNlcnRpZmljYXRlczovc3RvcmFnZS9jZXJ0aWZpY2F0ZXM6cncKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9ET01BSU4KICAgICAgLSBfQVBQX0RPTUFJTl9UQVJHRVQKICAgICAgLSBfQVBQX0RPTUFJTl9GVU5DVElPTlMKICAgICAgLSBfQVBQX1NZU1RFTV9TRUNVUklUWV9FTUFJTF9BRERSRVNTCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX0xPR0dJTkdfUFJPVklERVIKICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHCgogIGFwcHdyaXRlLXdvcmtlci1mdW5jdGlvbnM6CiAgICBpbWFnZTogYXBwd3JpdGUvYXBwd3JpdGU6MS40LjMKICAgIGVudHJ5cG9pbnQ6IHdvcmtlci1mdW5jdGlvbnMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtd29ya2VyLWZ1bmN0aW9ucwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICAgIC0gbWFyaWFkYgogICAgICAtIG9wZW5ydW50aW1lcy1leGVjdXRvcgogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gX0FQUF9FTlYKICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRQogICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjEKICAgICAgLSBfQVBQX1JFRElTX0hPU1QKICAgICAgLSBfQVBQX1JFRElTX1BPUlQKICAgICAgLSBfQVBQX1JFRElTX1VTRVIKICAgICAgLSBfQVBQX1JFRElTX1BBU1MKICAgICAgLSBfQVBQX0RCX0hPU1QKICAgICAgLSBfQVBQX0RCX1BPUlQKICAgICAgLSBfQVBQX0RCX1NDSEVNQQogICAgICAtIF9BUFBfREJfVVNFUgogICAgICAtIF9BUFBfREJfUEFTUwogICAgICAtIF9BUFBfRlVOQ1RJT05TX1RJTUVPVVQKICAgICAgLSBfQVBQX0ZVTkNUSU9OU19CVUlMRF9USU1FT1VUCiAgICAgIC0gX0FQUF9GVU5DVElPTlNfQ1BVUwogICAgICAtIF9BUFBfRlVOQ1RJT05TX01FTU9SWQogICAgICAtIF9BUFBfRVhFQ1VUT1JfU0VDUkVUCiAgICAgIC0gX0FQUF9FWEVDVVRPUl9IT1NUCiAgICAgIC0gX0FQUF9VU0FHRV9TVEFUUwogICAgICAtIF9BUFBfRE9DS0VSX0hVQl9VU0VSTkFNRQogICAgICAtIF9BUFBfRE9DS0VSX0hVQl9QQVNTV09SRAogICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUcKICAgICAgLSBfQVBQX0xPR0dJTkdfUFJPVklERVIKCiAgYXBwd3JpdGUtd29ya2VyLW1haWxzOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB3b3JrZXItbWFpbHMKICAgIDw8OiAqeC1sb2dnaW5nCiAgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtd29ya2VyLW1haWxzCiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZAogICAgbmV0d29ya3M6CiAgICAgIC0gYXBwd3JpdGUKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9TWVNURU1fRU1BSUxfTkFNRQogICAgICAtIF9BUFBfU1lTVEVNX0VNQUlMX0FERFJFU1MKICAgICAgLSBfQVBQX1JFRElTX0hPU1QKICAgICAgLSBfQVBQX1JFRElTX1BPUlQKICAgICAgLSBfQVBQX1JFRElTX1VTRVIKICAgICAgLSBfQVBQX1JFRElTX1BBU1MKICAgICAgLSBfQVBQX1NNVFBfSE9TVAogICAgICAtIF9BUFBfU01UUF9QT1JUCiAgICAgIC0gX0FQUF9TTVRQX1NFQ1VSRQogICAgICAtIF9BUFBfU01UUF9VU0VSTkFNRQogICAgICAtIF9BUFBfU01UUF9QQVNTV09SRAogICAgICAtIF9BUFBfTE9HR0lOR19QUk9WSURFUgogICAgICAtIF9BUFBfTE9HR0lOR19DT05GSUcKCiAgYXBwd3JpdGUtd29ya2VyLW1lc3NhZ2luZzoKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogd29ya2VyLW1lc3NhZ2luZwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZS13b3JrZXItbWVzc2FnaW5nCiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZAogICAgbmV0d29ya3M6CiAgICAgIC0gYXBwd3JpdGUKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcmVkaXMKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX1JFRElTX0hPU1QKICAgICAgLSBfQVBQX1JFRElTX1BPUlQKICAgICAgLSBfQVBQX1JFRElTX1VTRVIKICAgICAgLSBfQVBQX1JFRElTX1BBU1MKICAgICAgLSBfQVBQX1NNU19QUk9WSURFUgogICAgICAtIF9BUFBfU01TX0ZST00KICAgICAgLSBfQVBQX0xPR0dJTkdfUFJPVklERVIKICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHCgogIGFwcHdyaXRlLXdvcmtlci1taWdyYXRpb25zOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB3b3JrZXItbWlncmF0aW9ucwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZS13b3JrZXItbWlncmF0aW9ucwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIG1hcmlhZGIKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9ET01BSU4KICAgICAgLSBfQVBQX0RPTUFJTl9UQVJHRVQKICAgICAgLSBfQVBQX1NZU1RFTV9TRUNVUklUWV9FTUFJTF9BRERSRVNTCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX0xPR0dJTkdfUFJPVklERVIKICAgICAgLSBfQVBQX0xPR0dJTkdfQ09ORklHCiAgICAgIC0gX0FQUF9NSUdSQVRJT05TX0ZJUkVCQVNFX0NMSUVOVF9JRAogICAgICAtIF9BUFBfTUlHUkFUSU9OU19GSVJFQkFTRV9DTElFTlRfU0VDUkVUCgogIGFwcHdyaXRlLW1haW50ZW5hbmNlOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiBtYWludGVuYW5jZQogICAgPDw6ICp4LWxvZ2dpbmcKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZS1tYWludGVuYW5jZQogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIHJlZGlzCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBfQVBQX0VOVgogICAgICAtIF9BUFBfV09SS0VSX1BFUl9DT1JFCiAgICAgIC0gX0FQUF9ET01BSU4KICAgICAgLSBfQVBQX0RPTUFJTl9UQVJHRVQKICAgICAgLSBfQVBQX0RPTUFJTl9GVU5DVElPTlMKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKICAgICAgLSBfQVBQX01BSU5URU5BTkNFX0lOVEVSVkFMCiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fRVhFQ1VUSU9OCiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fQ0FDSEUKICAgICAgLSBfQVBQX01BSU5URU5BTkNFX1JFVEVOVElPTl9BQlVTRQogICAgICAtIF9BUFBfTUFJTlRFTkFOQ0VfUkVURU5USU9OX0FVRElUCiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fVVNBR0VfSE9VUkxZCiAgICAgIC0gX0FQUF9NQUlOVEVOQU5DRV9SRVRFTlRJT05fU0NIRURVTEVTCgogIGFwcHdyaXRlLXVzYWdlOgogICAgaW1hZ2U6IGFwcHdyaXRlL2FwcHdyaXRlOjEuNC4zCiAgICBlbnRyeXBvaW50OiB1c2FnZQogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLXVzYWdlCiAgICA8PDogKngtbG9nZ2luZwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICBkZXBlbmRzX29uOgogICAgICAtIGluZmx1eGRiCiAgICAgIC0gbWFyaWFkYgogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gX0FQUF9FTlYKICAgICAgLSBfQVBQX1dPUktFUl9QRVJfQ09SRQogICAgICAtIF9BUFBfT1BFTlNTTF9LRVlfVjEKICAgICAgLSBfQVBQX0RCX0hPU1QKICAgICAgLSBfQVBQX0RCX1BPUlQKICAgICAgLSBfQVBQX0RCX1NDSEVNQQogICAgICAtIF9BUFBfREJfVVNFUgogICAgICAtIF9BUFBfREJfUEFTUwogICAgICAtIF9BUFBfSU5GTFVYREJfSE9TVAogICAgICAtIF9BUFBfSU5GTFVYREJfUE9SVAogICAgICAtIF9BUFBfVVNBR0VfQUdHUkVHQVRJT05fSU5URVJWQUwKICAgICAgLSBfQVBQX1JFRElTX0hPU1QKICAgICAgLSBfQVBQX1JFRElTX1BPUlQKICAgICAgLSBfQVBQX1JFRElTX1VTRVIKICAgICAgLSBfQVBQX1JFRElTX1BBU1MKICAgICAgLSBfQVBQX1VTQUdFX1NUQVRTCiAgICAgIC0gX0FQUF9MT0dHSU5HX1BST1ZJREVSCiAgICAgIC0gX0FQUF9MT0dHSU5HX0NPTkZJRwoKICBhcHB3cml0ZS1zY2hlZHVsZToKICAgIGltYWdlOiBhcHB3cml0ZS9hcHB3cml0ZToxLjQuMwogICAgZW50cnlwb2ludDogc2NoZWR1bGUKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZS1zY2hlZHVsZQogICAgPDw6ICp4LWxvZ2dpbmcKICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCiAgICBuZXR3b3JrczoKICAgICAgLSBhcHB3cml0ZQogICAgZGVwZW5kc19vbjoKICAgICAgLSBtYXJpYWRiCiAgICAgIC0gcmVkaXMKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfRU5WCiAgICAgIC0gX0FQUF9XT1JLRVJfUEVSX0NPUkUKICAgICAgLSBfQVBQX09QRU5TU0xfS0VZX1YxCiAgICAgIC0gX0FQUF9SRURJU19IT1NUCiAgICAgIC0gX0FQUF9SRURJU19QT1JUCiAgICAgIC0gX0FQUF9SRURJU19VU0VSCiAgICAgIC0gX0FQUF9SRURJU19QQVNTCiAgICAgIC0gX0FQUF9EQl9IT1NUCiAgICAgIC0gX0FQUF9EQl9QT1JUCiAgICAgIC0gX0FQUF9EQl9TQ0hFTUEKICAgICAgLSBfQVBQX0RCX1VTRVIKICAgICAgLSBfQVBQX0RCX1BBU1MKCiAgYXBwd3JpdGUtYXNzaXN0YW50OgogICAgaW1hZ2U6IGFwcHdyaXRlL2Fzc2lzdGFudDowLjIuMQogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLWFzc2lzdGFudAogICAgPDw6ICp4LWxvZ2dpbmcKICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCiAgICBuZXR3b3JrczoKICAgICAgLSBhcHB3cml0ZQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gX0FQUF9BU1NJU1RBTlRfT1BFTkFJX0FQSV9LRVkKCiAgb3BlbnJ1bnRpbWVzLWV4ZWN1dG9yOgogICAgY29udGFpbmVyX25hbWU6IG9wZW5ydW50aW1lcy1leGVjdXRvcgogICAgaG9zdG5hbWU6IGFwcHdyaXRlLWV4ZWN1dG9yCiAgICA8PDogKngtbG9nZ2luZwogICAgc3RvcF9zaWduYWw6IFNJR0lOVAogICAgaW1hZ2U6IG9wZW5ydW50aW1lcy9leGVjdXRvcjowLjQuMQogICAgbmV0d29ya3M6CiAgICAgIC0gYXBwd3JpdGUKICAgICAgLSBydW50aW1lcwogICAgdm9sdW1lczoKICAgICAgLSAvdmFyL3J1bi9kb2NrZXIuc29jazovdmFyL3J1bi9kb2NrZXIuc29jawogICAgICAtIGFwcHdyaXRlLWJ1aWxkczovc3RvcmFnZS9idWlsZHM6cncKICAgICAgLSBhcHB3cml0ZS1mdW5jdGlvbnM6L3N0b3JhZ2UvZnVuY3Rpb25zOnJ3CiAgICAgICMgSG9zdCBtb3VudCBuZXNzZXNzYXJ5IHRvIHNoYXJlIGZpbGVzIGJldHdlZW4gZXhlY3V0b3IgYW5kIHJ1bnRpbWVzLgogICAgICAjIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHNoYXJlIG1vdW50IGZpbGUgYmV0d2VlbiAyIGNvbnRhaW5lcnMgd2l0aG91dCBob3N0IG1vdW50IChjb3B5aW5nIGlzIHRvbyBzbG93KQogICAgICAtIC90bXA6L3RtcDpydwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gT1BSX0VYRUNVVE9SX0lOQUNUSVZFX1RSRVNIT0xEPSRfQVBQX0ZVTkNUSU9OU19JTkFDVElWRV9USFJFU0hPTEQKICAgICAgLSBPUFJfRVhFQ1VUT1JfTUFJTlRFTkFOQ0VfSU5URVJWQUw9JF9BUFBfRlVOQ1RJT05TX01BSU5URU5BTkNFX0lOVEVSVkFMCiAgICAgIC0gT1BSX0VYRUNVVE9SX05FVFdPUks9JF9BUFBfRlVOQ1RJT05TX1JVTlRJTUVTX05FVFdPUksKICAgICAgLSBPUFJfRVhFQ1VUT1JfRE9DS0VSX0hVQl9VU0VSTkFNRT0kX0FQUF9ET0NLRVJfSFVCX1VTRVJOQU1FCiAgICAgIC0gT1BSX0VYRUNVVE9SX0RPQ0tFUl9IVUJfUEFTU1dPUkQ9JF9BUFBfRE9DS0VSX0hVQl9QQVNTV09SRAogICAgICAtIE9QUl9FWEVDVVRPUl9FTlY9JF9BUFBfRU5WCiAgICAgIC0gT1BSX0VYRUNVVE9SX1JVTlRJTUVTPSRfQVBQX0ZVTkNUSU9OU19SVU5USU1FUwogICAgICAtIE9QUl9FWEVDVVRPUl9TRUNSRVQ9JF9BUFBfRVhFQ1VUT1JfU0VDUkVUCiAgICAgIC0gT1BSX0VYRUNVVE9SX0xPR0dJTkdfUFJPVklERVI9JF9BUFBfTE9HR0lOR19QUk9WSURFUgogICAgICAtIE9QUl9FWEVDVVRPUl9MT0dHSU5HX0NPTkZJRz0kX0FQUF9MT0dHSU5HX0NPTkZJRwogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0RFVklDRT0kX0FQUF9TVE9SQUdFX0RFVklDRQogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1MzX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9TM19BQ0NFU1NfS0VZCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfUzNfU0VDUkVUPSRfQVBQX1NUT1JBR0VfUzNfU0VDUkVUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfUzNfUkVHSU9OPSRfQVBQX1NUT1JBR0VfUzNfUkVHSU9OCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfUzNfQlVDS0VUPSRfQVBQX1NUT1JBR0VfUzNfQlVDS0VUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfRE9fU1BBQ0VTX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfQUNDRVNTX0tFWQogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0RPX1NQQUNFU19TRUNSRVQ9JF9BUFBfU1RPUkFHRV9ET19TUEFDRVNfU0VDUkVUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfRE9fU1BBQ0VTX1JFR0lPTj0kX0FQUF9TVE9SQUdFX0RPX1NQQUNFU19SRUdJT04KICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9ET19TUEFDRVNfQlVDS0VUPSRfQVBQX1NUT1JBR0VfRE9fU1BBQ0VTX0JVQ0tFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0JBQ0tCTEFaRV9BQ0NFU1NfS0VZPSRfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX0FDQ0VTU19LRVkKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9CQUNLQkxBWkVfU0VDUkVUPSRfQVBQX1NUT1JBR0VfQkFDS0JMQVpFX1NFQ1JFVAogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0JBQ0tCTEFaRV9SRUdJT049JF9BUFBfU1RPUkFHRV9CQUNLQkxBWkVfUkVHSU9OCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfQkFDS0JMQVpFX0JVQ0tFVD0kX0FQUF9TVE9SQUdFX0JBQ0tCTEFaRV9CVUNLRVQKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9MSU5PREVfQUNDRVNTX0tFWT0kX0FQUF9TVE9SQUdFX0xJTk9ERV9BQ0NFU1NfS0VZCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfTElOT0RFX1NFQ1JFVD0kX0FQUF9TVE9SQUdFX0xJTk9ERV9TRUNSRVQKICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9MSU5PREVfUkVHSU9OPSRfQVBQX1NUT1JBR0VfTElOT0RFX1JFR0lPTgogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX0xJTk9ERV9CVUNLRVQ9JF9BUFBfU1RPUkFHRV9MSU5PREVfQlVDS0VUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfV0FTQUJJX0FDQ0VTU19LRVk9JF9BUFBfU1RPUkFHRV9XQVNBQklfQUNDRVNTX0tFWQogICAgICAtIE9QUl9FWEVDVVRPUl9TVE9SQUdFX1dBU0FCSV9TRUNSRVQ9JF9BUFBfU1RPUkFHRV9XQVNBQklfU0VDUkVUCiAgICAgIC0gT1BSX0VYRUNVVE9SX1NUT1JBR0VfV0FTQUJJX1JFR0lPTj0kX0FQUF9TVE9SQUdFX1dBU0FCSV9SRUdJT04KICAgICAgLSBPUFJfRVhFQ1VUT1JfU1RPUkFHRV9XQVNBQklfQlVDS0VUPSRfQVBQX1NUT1JBR0VfV0FTQUJJX0JVQ0tFVAoKICBtYXJpYWRiOgogICAgaW1hZ2U6IG1hcmlhZGI6MTAuNyAjIGZpeCBpc3N1ZXMgd2hlbiB1cGdyYWRpbmcgdXNpbmc6IG15c3FsX3VwZ3JhZGUgLXUgcm9vdCAtcAogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLW1hcmlhZGIKICAgIDw8OiAqeC1sb2dnaW5nCiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZAogICAgbmV0d29ya3M6CiAgICAgIC0gYXBwd3JpdGUKICAgIHZvbHVtZXM6CiAgICAgIC0gYXBwd3JpdGUtbWFyaWFkYjovdmFyL2xpYi9teXNxbDpydwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gTVlTUUxfUk9PVF9QQVNTV09SRD0ke19BUFBfREJfUk9PVF9QQVNTfQogICAgICAtIE1ZU1FMX0RBVEFCQVNFPSR7X0FQUF9EQl9TQ0hFTUF9CiAgICAgIC0gTVlTUUxfVVNFUj0ke19BUFBfREJfVVNFUn0KICAgICAgLSBNWVNRTF9QQVNTV09SRD0ke19BUFBfREJfUEFTU30KICAgIGNvbW1hbmQ6ICdteXNxbGQgLS1pbm5vZGItZmx1c2gtbWV0aG9kPWZzeW5jJwoKICByZWRpczoKICAgIGltYWdlOiByZWRpczo3LjAuNC1hbHBpbmUKICAgIGNvbnRhaW5lcl9uYW1lOiBhcHB3cml0ZS1yZWRpcwogICAgPDw6ICp4LWxvZ2dpbmcKICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCiAgICBjb21tYW5kOiA+CiAgICAgIHJlZGlzLXNlcnZlcgogICAgICAtLW1heG1lbW9yeSAgICAgICAgICAgIDUxMm1iCiAgICAgIC0tbWF4bWVtb3J5LXBvbGljeSAgICAgYWxsa2V5cy1scnUKICAgICAgLS1tYXhtZW1vcnktc2FtcGxlcyAgICA1CiAgICBuZXR3b3JrczoKICAgICAgLSBhcHB3cml0ZQogICAgdm9sdW1lczoKICAgICAgLSBhcHB3cml0ZS1yZWRpczovZGF0YTpydwoKICAjIGNsYW1hdjoKICAjICAgaW1hZ2U6IGFwcHdyaXRlL2NsYW1hdjoxLjIuMAogICMgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtY2xhbWF2CiAgIyAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkCiAgIyAgIG5ldHdvcmtzOgogICMgICAgIC0gYXBwd3JpdGUKICAjICAgdm9sdW1lczoKICAjICAgICAtIGFwcHdyaXRlLXVwbG9hZHM6L3N0b3JhZ2UvdXBsb2FkcwoKICBpbmZsdXhkYjoKICAgIGltYWdlOiBhcHB3cml0ZS9pbmZsdXhkYjoxLjUuMAogICAgY29udGFpbmVyX25hbWU6IGFwcHdyaXRlLWluZmx1eGRiCiAgICA8PDogKngtbG9nZ2luZwogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIG5ldHdvcmtzOgogICAgICAtIGFwcHdyaXRlCiAgICB2b2x1bWVzOgogICAgICAtIGFwcHdyaXRlLWluZmx1eGRiOi92YXIvbGliL2luZmx1eGRiOnJ3CgogIHRlbGVncmFmOgogICAgaW1hZ2U6IGFwcHdyaXRlL3RlbGVncmFmOjEuNC4wCiAgICBjb250YWluZXJfbmFtZTogYXBwd3JpdGUtdGVsZWdyYWYKICAgIDw8OiAqeC1sb2dnaW5nCiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZAogICAgbmV0d29ya3M6CiAgICAgIC0gYXBwd3JpdGUKICAgIGVudmlyb25tZW50OgogICAgICAtIF9BUFBfSU5GTFVYREJfSE9TVAogICAgICAtIF9BUFBfSU5GTFVYREJfUE9SVAoKbmV0d29ya3M6CiAgZ2F0ZXdheToKICAgIG5hbWU6IGdhdGV3YXkKICBhcHB3cml0ZToKICAgIG5hbWU6IGFwcHdyaXRlCiAgcnVudGltZXM6CiAgICBuYW1lOiBydW50aW1lcwoKdm9sdW1lczoKICBhcHB3cml0ZS1tYXJpYWRiOgogIGFwcHdyaXRlLXJlZGlzOgogIGFwcHdyaXRlLWNhY2hlOgogIGFwcHdyaXRlLXVwbG9hZHM6CiAgYXBwd3JpdGUtY2VydGlmaWNhdGVzOgogIGFwcHdyaXRlLWZ1bmN0aW9uczoKICBhcHB3cml0ZS1idWlsZHM6CiAgYXBwd3JpdGUtaW5mbHV4ZGI6CiAgYXBwd3JpdGUtY29uZmlnOg=="
}
}
diff --git a/resources/views/livewire/project/service/index.blade.php b/resources/views/livewire/project/service/index.blade.php
index 926a29130..8c08f1ff2 100644
--- a/resources/views/livewire/project/service/index.blade.php
+++ b/resources/views/livewire/project/service/index.blade.php
@@ -79,10 +79,10 @@
(configuration required)
@endif
@if ($application->description)
- {{ $application->description }}
+ {{ Str::limit($application->description, 60) }}
@endif
@if ($application->fqdn)
- {{ $application->fqdn }}
+ {{ Str::limit($application->fqdn, 60) }}
@endif
{{ $application->status }}
@@ -107,7 +107,7 @@
(configuration required)
@endif
@if ($database->description)
- {{ $database->description }}
+ {{ Str::limit($database->description, 60) }}
@endif
{{ $database->status }}
diff --git a/resources/views/livewire/project/shared/environment-variable/show.blade.php b/resources/views/livewire/project/shared/environment-variable/show.blade.php
index 4f1d4919e..6663dc12a 100644
--- a/resources/views/livewire/project/shared/environment-variable/show.blade.php
+++ b/resources/views/livewire/project/shared/environment-variable/show.blade.php
@@ -6,18 +6,36 @@ class="font-bold text-warning">({{ $env->key }})?