diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c49a716..3138c799 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ original submission: MedTimeLine v1.0.1.0, commit number 3f17565ee6549a97b9be164 ## Versions +### 2.3.0.0 +* Update error message. +* Update antiviral and antifungal generic RxNorm codes +* Add generic antibiotics to configurations. + ### 2.2.1.0 * Turn off optimization for the prod build. It breaks Cerner deployment. diff --git a/docs/assets/clinical_concept_configuration/medications_antibiotics.json b/docs/assets/clinical_concept_configuration/medications_antibiotics.json index f824da8b..855d31b7 100644 --- a/docs/assets/clinical_concept_configuration/medications_antibiotics.json +++ b/docs/assets/clinical_concept_configuration/medications_antibiotics.json @@ -7,6 +7,14 @@ "displayName": "Amoxicillin 50 MG/ML Oral Suspension", "codeString": "239191" }, + { + "groupNames": [ + "Amoxicillin", + "Antibiotics Summary" + ], + "displayName": "Amoxicillin", + "codeString": "723" + }, { "groupNames": [ "Amphotericin", @@ -15,6 +23,14 @@ "displayName": "Amphotericin B 5 MG/ML Injectable Solution", "codeString": "239240" }, + { + "groupNames": [ + "Amphotericin", + "Antibiotics Summary" + ], + "displayName": "Amphotericin", + "codeString": "42527" + }, { "groupNames": [ "Ampicillin", @@ -95,6 +111,14 @@ "displayName": "cefdinir 25 MG/ML Oral Suspension", "codeString": "309054" }, + { + "groupNames": [ + "Cefdinir", + "Antibiotics Summary" + ], + "displayName": "cefdinir", + "codeString": "25037" + }, { "groupNames": [ "Cefdinir", @@ -119,6 +143,14 @@ "displayName": "cefepime 2000 MG Injection", "codeString": "1665088" }, + { + "groupNames": [ + "Cefepime", + "Antibiotics Summary" + ], + "displayName": "cefepime", + "codeString": "20481" + }, { "groupNames": [ "Cefixime", @@ -151,6 +183,14 @@ "displayName": "Cefoxitin 200 MG/ML Injectable Solution", "codeString": "309072" }, + { + "groupNames": [ + "Cefoxitin", + "Antibiotics Summary" + ], + "displayName": "Cefoxitin", + "codeString": "2189" + }, { "groupNames": [ "Ceftaroline", @@ -159,6 +199,14 @@ "displayName": "ceftaroline fosamil 30 MG/ML Injectable Solution", "codeString": "1040014" }, + { + "groupNames": [ + "Ceftaroline", + "Antibiotics Summary" + ], + "displayName": "ceftaroline", + "codeString": "1040005" + }, { "groupNames": [ "Ceftazidime", @@ -175,6 +223,14 @@ "displayName": "avibactam 0.000042 MG/ML / Ceftazidime 0.000167 MG/ML Injectable Solution", "codeString": "1603840" }, + { + "groupNames": [ + "Ceftazidime", + "Antibiotics Summary" + ], + "displayName": "Ceftazidime", + "codeString": "2191" + }, { "groupNames": [ "Ceftriaxone", @@ -199,6 +255,14 @@ "displayName": "Ceftriaxone 500 MG Injection", "codeString": "1665005" }, + { + "groupNames": [ + "Ceftriaxone", + "Antibiotics Summary" + ], + "displayName": "Ceftriaxone", + "codeString": "2193" + }, { "groupNames": [ "Cefuroxime", @@ -207,6 +271,14 @@ "displayName": "Cefuroxime 50 MG/ML Oral Suspension", "codeString": "313926" }, + { + "groupNames": [ + "Cefuroxime", + "Antibiotics Summary" + ], + "displayName": "Cefuroxime", + "codeString": "2194" + }, { "groupNames": [ "Cephalexin", @@ -215,6 +287,14 @@ "displayName": "Cephalexin 50 MG/ML Oral Suspension", "codeString": "309113" }, + { + "groupNames": [ + "Cephalexin", + "Antibiotics Summary" + ], + "displayName": "Cephalexin", + "codeString": "2231" + }, { "groupNames": [ "Ciprofloxacin", @@ -239,6 +319,22 @@ "displayName": "Ciprofloxacin 3 MG/ML Ophthalmic Solution", "codeString": "309307" }, + { + "groupNames": [ + "Ciprofloxacin", + "Antibiotics Summary" + ], + "displayName": "Ciprofloxacin", + "codeString": "2551" + }, + { + "groupNames": [ + "Clavulanate", + "Antibiotics Summary" + ], + "displayName": "clauvulnate", + "codeString": "48203" + }, { "groupNames": [ "Clavulanate", @@ -279,6 +375,15 @@ "displayName": "Amoxicillin 875 MG / Clavulanate 125 MG Oral Tablet", "codeString": "562508" }, + { + "groupNames": [ + "Amoxicillin", + "Clavulanate", + "Antibiotics Summary" + ], + "displayName": "Amoxicillin / Clavulanate", + "codeString": "19711" + }, { "groupNames": [ "Clindamycin", @@ -311,6 +416,14 @@ "displayName": "Ciprofloxacin 3 MG/ML / Dexamethasone 1 MG/ML Otic Suspension", "codeString": "403908" }, + { + "groupNames": [ + "Ciprofloxacin", + "Antibiotics Summary" + ], + "displayName": "Ciprofloxacin/Dexamethasone", + "codeString": "465937" + }, { "groupNames": [ "Doxycycline", @@ -319,6 +432,22 @@ "displayName": "doxycycline hyclate 50 MG Oral Capsule", "codeString": "1649405" }, + { + "groupNames": [ + "Doxycycline", + "Antibiotics Summary" + ], + "displayName": "doxycycline", + "codeString": "3640" + }, + { + "groupNames": [ + "Doxycycline", + "Antibiotics Summary" + ], + "displayName": "doxycycline hyclate", + "codeString": "23663" + }, { "groupNames": [ "Erythromycin", @@ -343,6 +472,30 @@ "displayName": "Erythromycin Ethylsuccinate 40 MG/ML Oral Suspension", "codeString": "686400" }, + { + "groupNames": [ + "Erythromycin", + "Antibiotics Summary" + ], + "displayName": "Erythromycin Ethylsuccinate", + "codeString": "4056" + }, + { + "groupNames": [ + "Erythromycin", + "Antibiotics Summary" + ], + "displayName": "Erythromycin", + "codeString": "4053" + }, + { + "groupNames": [ + "Ethambutol", + "Antibiotics Summary" + ], + "displayName": "Ethambutol", + "codeString": "4110" + }, { "groupNames": [ "Ethambutol", @@ -359,6 +512,14 @@ "displayName": "Ethambutol Hydrochloride 400 MG Oral Tablet", "codeString": "995607" }, + { + "groupNames": [ + "Ethambutol", + "Antibiotics Summary" + ], + "displayName": "Ethambutol Hydrochloride", + "codeString": "142435" + }, { "groupNames": [ "Flucytosine", @@ -375,6 +536,23 @@ "displayName": "Fosfomycin 33.3 MG/ML Oral Suspension", "codeString": "808917" }, + { + "groupNames": [ + "Fosfomycin", + "Antibiotics Summary" + ], + "displayName": "Fosfomycin", + "codeString": "4550" + }, + { + "groupNames": [ + "Gentamicin Administrations", + "Gentamicin Monitoring Reference", + "Antibiotics Summary" + ], + "displayName": "Gentamicin", + "codeString": "1596450" + }, { "groupNames": [ "Gentamicin Administrations", @@ -411,6 +589,15 @@ "displayName": "Gentamicin Sulfate (USP) 40 MG/ML Injectable Solution", "codeString": "313996" }, + { + "groupNames": [ + "Gentamicin Administrations", + "Gentamicin Monitoring Reference", + "Antibiotics Summary" + ], + "displayName": "Gentamicin sulfate", + "codeString": "1870193" + }, { "groupNames": [ "Ciprofloxacin", @@ -419,6 +606,22 @@ "displayName": "Ciprofloxacin 2 MG/ML / Hydrocortisone 10 MG/ML Otic Suspension", "codeString": "309305" }, + { + "groupNames": [ + "Ciprofloxacin", + "Antibiotics Summary" + ], + "displayName": "Ciprofloxacin/Hydrocortisone", + "codeString": "465711" + }, + { + "groupNames": [ + "Imipenem", + "Antibiotics Summary" + ], + "displayName": "Imipenem", + "codeString": "5690" + }, { "groupNames": [ "Imipenem", @@ -444,6 +647,14 @@ "displayName": "isoniazid 100 MG Oral Tablet", "codeString": "311166" }, + { + "groupNames": [ + "Isoniazid", + "Antibiotics Summary" + ], + "displayName": "isoniazid", + "codeString": "6038" + }, { "groupNames": [ "Levofloxacin", @@ -452,6 +663,14 @@ "displayName": "Levofloxacin 500 MG Oral Tablet", "codeString": "199885" }, + { + "groupNames": [ + "Levofloxacin", + "Antibiotics Summary" + ], + "displayName": "Levofloxacin", + "codeString": "82122" + }, { "groupNames": [ "Linezolid", @@ -468,6 +687,14 @@ "displayName": "linezolid 600 MG Oral Tablet", "codeString": "311347" }, + { + "groupNames": [ + "Linezolid", + "Antibiotics Summary" + ], + "displayName": "linezolid", + "codeString": "190376" + }, { "groupNames": [ "Meropenem", @@ -476,6 +703,14 @@ "displayName": "meropenem 1000 MG Injection", "codeString": "1722939" }, + { + "groupNames": [ + "Meropenem", + "Antibiotics Summary" + ], + "displayName": "meropenem", + "codeString": "29561" + }, { "groupNames": [ "Metronidazole", @@ -500,6 +735,14 @@ "displayName": "Metronidazole 500 MG Oral Tablet", "codeString": "311681" }, + { + "groupNames": [ + "Metronidazole", + "Antibiotics Summary" + ], + "displayName": "Metronidazole", + "codeString": "6922" + }, { "groupNames": [ "Moxifloxacin", @@ -524,6 +767,14 @@ "displayName": "moxifloxacin 5 MG/ML Ophthalmic Solution", "codeString": "403818" }, + { + "groupNames": [ + "Moxifloxacin", + "Antibiotics Summary" + ], + "displayName": "moxifloxacin", + "codeString": "139462" + }, { "groupNames": [ "Nitrofurantoin", @@ -532,6 +783,22 @@ "displayName": "Nitrofurantoin 50 MG Oral Capsule", "codeString": "311995" }, + { + "groupNames": [ + "Nitrofurantoin", + "Antibiotics Summary" + ], + "displayName": "Nitrofurantoin", + "codeString": "7454" + }, + { + "groupNames": [ + "Penicillin", + "Antibiotics Summary" + ], + "displayName": "Penicillin", + "codeString": "70618" + }, { "groupNames": [ "Penicillin", @@ -551,7 +818,6 @@ { "groupNames": [ "Polymyxin", - "Dexamethasone", "Neomycin", "Antibiotics Summary" ], @@ -567,6 +833,32 @@ "displayName": "Neomycin 40 MG/ML / Polymyxin B 200000 UNT/ML Irrigation Solution [Neosporin G. U. Irrigant]", "codeString": "211680" }, + { + "groupNames": [ + "Polymyxin", + "Antibiotics Summary" + ], + "displayName": "Polymyxin B", + "codeString": "8536" + }, + { + "groupNames": [ + "Neomycin", + "Polymyxin", + "Antibiotics Summary" + ], + "displayName": "Dexamethasone 0.001 MG/MG / Neomycin 0.0035 MG/MG / Polymyxin B 10 UNT/MG Ophthalmic Ointment", + "codeString": "216525" + }, + { + "groupNames": [ + "Neomycin", + "Polymyxin", + "Antibiotics Summary" + ], + "displayName": "Neomycin/Polymyxin B", + "codeString": "466541" + }, { "groupNames": [ "Pyrazinamide", @@ -575,6 +867,14 @@ "displayName": "Pyrazinamide 500 MG Oral Tablet", "codeString": "198181" }, + { + "groupNames": [ + "Pyrazinamide", + "Antibiotics Summary" + ], + "displayName": "Pyrazinamide", + "codeString": "8987" + }, { "groupNames": [ "Rifampin", @@ -608,6 +908,23 @@ "displayName": "Ampicillin 100 MG/ML / Sulbactam 50 MG/ML Injectable Solution", "codeString": "240984" }, + { + "groupNames": [ + "Sulbactam", + "Ampicillin", + "Antibiotics Summary" + ], + "displayName": "Ampicillin/Sulbactam", + "codeString": "1009148" + }, + { + "groupNames": [ + "Sulbactam", + "Antibiotics Summary" + ], + "displayName": "Sulbactam", + "codeString": "10167" + }, { "groupNames": [ "Tazobactam", @@ -617,10 +934,26 @@ "displayName": "Piperacillin 200 MG/ML / tazobactam 25 MG/ML Injectable Solution", "codeString": "312447" }, + { + "groupNames": [ + "Tazobactam", + "Antibiotics Summary" + ], + "displayName": "tazobactam", + "codeString": "37617" + }, + { + "groupNames": [ + "Tazobactam", + "Piperacillin", + "Antibiotics Summary" + ], + "displayName": "Piperacillin/tazobactam", + "codeString": "74169" + }, { "groupNames": [ "Tobramycin", - "Dexamethasone", "Antibiotics Summary" ], "displayName": "Dexamethasone 0.001 MG/MG / Tobramycin 0.003 MG/MG Ophthalmic Ointment", @@ -629,7 +962,6 @@ { "groupNames": [ "Tobramycin", - "Dexamethasone", "Antibiotics Summary" ], "displayName": "Dexamethasone 1 MG/ML / Tobramycin 3 MG/ML Ophthalmic Suspension [Tobradex]", @@ -667,6 +999,14 @@ "displayName": "Tobramycin 75 MG/ML Inhalant Solution", "codeString": "1314763" }, + { + "groupNames": [ + "Tobramycin", + "Antibiotics Summary" + ], + "displayName": "Tobramycin", + "codeString": "10627" + }, { "groupNames": [ "Trimethoprim", @@ -694,6 +1034,23 @@ "displayName": "Sulfamethoxazole 400 MG / Trimethoprim 80 MG Oral Tablet", "codeString": "198334" }, + { + "groupNames": [ + "Trimethoprim", + "Antibiotics Summary" + ], + "displayName": "Trimethoprim", + "codeString": "10829" + }, + { + "groupNames": [ + "Trimethoprim", + "Sulfamethoxazole", + "Antibiotics Summary" + ], + "displayName": "Sulfamethoxazole/Trimethoprim", + "codeString": "10831" + }, { "groupNames": [ "Vancomycin Administrations", @@ -721,4 +1078,4 @@ "displayName": "Vancomycin 100 MG/ML Injectable Solution", "codeString": "239209" } -] +] \ No newline at end of file diff --git a/docs/assets/clinical_concept_configuration/medications_antifungals.json b/docs/assets/clinical_concept_configuration/medications_antifungals.json index 38498676..43f2968a 100644 --- a/docs/assets/clinical_concept_configuration/medications_antifungals.json +++ b/docs/assets/clinical_concept_configuration/medications_antifungals.json @@ -23,6 +23,14 @@ "displayName": "Fluconazole 40 MG/ML Oral Suspension", "codeString": "310353" }, + { + "groupNames": [ + "Flucytosine", + "Antifungals Summary" + ], + "displayName": "Flucytosine", + "codeString": "4451" + }, { "groupNames": [ "Flucytosine", @@ -39,6 +47,22 @@ "displayName": "amphotericin B liposomal 4 MG/ML Injectable Solution", "codeString": "967385" }, + { + "groupNames": [ + "Liposomal", + "Antifungals Summary" + ], + "displayName": "amphotericin B liposomal", + "codeString": "236594" + }, + { + "groupNames": [ + "Micafungin", + "Antifungals Summary" + ], + "displayName": "MICAFUNGIN", + "codeString": "325887" + }, { "groupNames": [ "Micafungin", @@ -47,6 +71,14 @@ "displayName": "MICAFUNGIN SODIUM 10 MG/ML Injectable Solution", "codeString": "861379" }, + { + "groupNames": [ + "Micafungin", + "Antifungals Summary" + ], + "displayName": "Micafungin sodium", + "codeString": "487070" + }, { "groupNames": [ "Posaconazole", @@ -63,6 +95,14 @@ "displayName": "posaconazole 18 MG/ML Injectable Solution", "codeString": "1492043" }, + { + "groupNames": [ + "Posaconazole", + "Antifungals Summary" + ], + "displayName": "posaconazole", + "codeString": "282446" + }, { "groupNames": [ "Voriconazole", @@ -78,5 +118,13 @@ ], "displayName": "voriconazole 50 MG Oral Tablet", "codeString": "349435" + }, + { + "groupNames": [ + "Voriconazole", + "Antifungals Summary" + ], + "displayName": "voriconazole", + "codeString": "121243" } -] +] \ No newline at end of file diff --git a/docs/assets/clinical_concept_configuration/medications_antivirals.json b/docs/assets/clinical_concept_configuration/medications_antivirals.json index 6984e5a2..d9417710 100644 --- a/docs/assets/clinical_concept_configuration/medications_antivirals.json +++ b/docs/assets/clinical_concept_configuration/medications_antivirals.json @@ -15,6 +15,14 @@ "displayName": "Acyclovir 50 MG/ML Injection", "codeString": "1734933" }, + { + "groupNames": [ + "Acyclovir", + "Antivirals Summary" + ], + "displayName": "Acyclovir", + "codeString": "281" + }, { "groupNames": [ "Foscarnet", @@ -23,6 +31,14 @@ "displayName": "Foscarnet", "codeString": "33562" }, + { + "groupNames": [ + "Foscarnet", + "Antivirals Summary" + ], + "displayName": "Foscarnet sodium", + "codeString": "57529" + }, { "groupNames": [ "Foscarnet", @@ -39,6 +55,14 @@ "displayName": "Ganciclovir 50 MG/ML Injectable Solution", "codeString": "310442" }, + { + "groupNames": [ + "Ganciclovir", + "Antivirals Summary" + ], + "displayName": "Ganciclovir", + "codeString": "4678" + }, { "groupNames": [ "Oseltamivir", @@ -47,6 +71,14 @@ "displayName": "Oseltamivir 75 MG Oral Capsule", "codeString": "312122" }, + { + "groupNames": [ + "Oseltamivir", + "Antivirals Summary" + ], + "displayName": "Oseltamivir", + "codeString": "260101" + }, { "groupNames": [ "Valacyclovir", @@ -55,6 +87,14 @@ "displayName": "valacyclovir 500 MG Oral Tablet", "codeString": "313565" }, + { + "groupNames": [ + "Valacyclovir", + "Antivirals Summary" + ], + "displayName": "valacyclovir", + "codeString": "73645" + }, { "groupNames": [ "Valganciclovir", @@ -62,5 +102,13 @@ ], "displayName": "valganciclovir 450 MG Oral Tablet", "codeString": "313566" + }, + { + "groupNames": [ + "Valganciclovir", + "Antivirals Summary" + ], + "displayName": "valganciclovir", + "codeString": "275891" } -] +] \ No newline at end of file diff --git a/docs/assets/documents/ifu_1.png b/docs/assets/documents/ifu_1.png new file mode 100644 index 00000000..9794fe2a Binary files /dev/null and b/docs/assets/documents/ifu_1.png differ diff --git a/docs/assets/documents/ifu_10.png b/docs/assets/documents/ifu_10.png new file mode 100644 index 00000000..99c82819 Binary files /dev/null and b/docs/assets/documents/ifu_10.png differ diff --git a/docs/assets/documents/ifu_11.png b/docs/assets/documents/ifu_11.png new file mode 100644 index 00000000..b3d7f913 Binary files /dev/null and b/docs/assets/documents/ifu_11.png differ diff --git a/docs/assets/documents/ifu_12.png b/docs/assets/documents/ifu_12.png new file mode 100644 index 00000000..4790f34b Binary files /dev/null and b/docs/assets/documents/ifu_12.png differ diff --git a/docs/assets/documents/ifu_13.png b/docs/assets/documents/ifu_13.png new file mode 100644 index 00000000..1d1a4eb9 Binary files /dev/null and b/docs/assets/documents/ifu_13.png differ diff --git a/docs/assets/documents/ifu_14.png b/docs/assets/documents/ifu_14.png new file mode 100644 index 00000000..dda28585 Binary files /dev/null and b/docs/assets/documents/ifu_14.png differ diff --git a/docs/assets/documents/ifu_2.png b/docs/assets/documents/ifu_2.png new file mode 100644 index 00000000..92edf658 Binary files /dev/null and b/docs/assets/documents/ifu_2.png differ diff --git a/docs/assets/documents/ifu_3.png b/docs/assets/documents/ifu_3.png new file mode 100644 index 00000000..4226caff Binary files /dev/null and b/docs/assets/documents/ifu_3.png differ diff --git a/docs/assets/documents/ifu_4.png b/docs/assets/documents/ifu_4.png new file mode 100644 index 00000000..192f621c Binary files /dev/null and b/docs/assets/documents/ifu_4.png differ diff --git a/docs/assets/documents/ifu_5.png b/docs/assets/documents/ifu_5.png new file mode 100644 index 00000000..fa64cbb4 Binary files /dev/null and b/docs/assets/documents/ifu_5.png differ diff --git a/docs/assets/documents/ifu_6.png b/docs/assets/documents/ifu_6.png new file mode 100644 index 00000000..9f89d40a Binary files /dev/null and b/docs/assets/documents/ifu_6.png differ diff --git a/docs/assets/documents/ifu_7.png b/docs/assets/documents/ifu_7.png new file mode 100644 index 00000000..7f3f1f8d Binary files /dev/null and b/docs/assets/documents/ifu_7.png differ diff --git a/docs/assets/documents/ifu_8.png b/docs/assets/documents/ifu_8.png new file mode 100644 index 00000000..27a84461 Binary files /dev/null and b/docs/assets/documents/ifu_8.png differ diff --git a/docs/assets/documents/ifu_9.png b/docs/assets/documents/ifu_9.png new file mode 100644 index 00000000..30e25275 Binary files /dev/null and b/docs/assets/documents/ifu_9.png differ diff --git a/docs/main.js b/docs/main.js index c35d6baa..71571382 100644 --- a/docs/main.js +++ b/docs/main.js @@ -1125,7 +1125,7 @@ var CardComponent = /** @class */ (function () { /*! no static exports found */ /***/ (function(module, exports) { -module.exports = "ngb-timepicker {\n font-size: 1rem;\n}\n\n::ng-deep fieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n::ng-deep .ngb-tp {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n::ng-deep .ngb-tp-hour, .ngb-tp-meridian, .ngb-tp-minute, .ngb-tp-second {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n}\n\n::ng-deep .ngb-tp-input-container {\n width: 4em;\n}\n\n::ng-deep .ngb-tp-spacer {\n width: 50px !important;\n text-align: center;\n}\n\n::ng-deep .btn-link {\n font-weight: 400;\n color: #5E35B1;\n background-color: transparent;\n border-width: 1px;\n cursor: pointer;\n border-radius: 4px;\n}\n\n::ng-deep .form-control {\n display: block;\n width: 100%;\n padding: .375rem .75rem;\n font-size: 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: .25rem;\n}\n\n::ng-deep .ngb-tp-input {\n text-align: center;\n width: inherit;\n}\n\n::ng-deep .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: nowrap;\n -webkit-clip-path: inset(50%);\n clip-path: inset(50%);\n border: none;\n}\n\n::ng-deep .mat-error {\n font-size: 12px;\n}\n\n.mockPlaceholder {\n font-size: 12px;\n color: grey;\n margin-top: 18px;\n}\n\n::ng-deep .dateInput {\n width: 100px !important;\n}\n\n::ng-deep ngb-datepicker {\n z-index: 4;\n background-color:white;\n}\n\n::ng-deep .date {\n display: inline-block;\n vertical-align: middle;\n}\n\n::ng-deep .time {\n display: inline-block;\n margin-left:30px;\n vertical-align: middle;\n}\n\n::ng-deep .date .mockPlaceholder {\n margin-bottom: 20px;\n}\n\n::ng-deep .date .dateInput {\n margin-bottom: 20px;\n}\n\n::ng-deep .mat-dialog-container {\n max-height: 400px !important;\n}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osVUFBVTtFQUNWLFNBQVM7RUFDVCxTQUFTO0FBQ1g7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QixtQkFBbUI7QUFDckI7O0FBQ0E7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQixzQkFBc0I7RUFDdEIsc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsNkJBQTZCO0VBQzdCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2Ysa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7RUFDWCx1QkFBdUI7RUFDdkIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2Qsc0JBQXNCO0VBQ3RCLDRCQUE0QjtFQUM1Qix5QkFBeUI7RUFDekIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsVUFBVTtFQUNWLFdBQVc7RUFDWCxVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsNkJBQTZCO0VBQzdCLHFCQUFxQjtFQUNyQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtFQUNmLFdBQVc7RUFDWCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxVQUFVO0VBQ1Ysc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIm5nYi10aW1lcGlja2VyIHtcbiAgZm9udC1zaXplOiAxcmVtO1xufVxuXG46Om5nLWRlZXAgZmllbGRzZXQge1xuICBtaW4td2lkdGg6IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cCB7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuOjpuZy1kZWVwIC5uZ2ItdHAtaG91ciwgLm5nYi10cC1tZXJpZGlhbiwgLm5nYi10cC1taW51dGUsIC5uZ2ItdHAtc2Vjb25kIHtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtaW5wdXQtY29udGFpbmVyIHtcbiAgd2lkdGg6IDRlbTtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtc3BhY2VyIHtcbiAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG46Om5nLWRlZXAgLmJ0bi1saW5rIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICM1RTM1QjE7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbjo6bmctZGVlcCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAuMzc1cmVtIC43NXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogIzQ5NTA1NztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NlZDRkYTtcbiAgYm9yZGVyLXJhZGl1czogLjI1cmVtO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cC1pbnB1dCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IGluaGVyaXQ7XG59XG5cbjo6bmctZGVlcCAuc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCg1MCUpO1xuICBjbGlwLXBhdGg6IGluc2V0KDUwJSk7XG4gIGJvcmRlcjogbm9uZTtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZXJyb3Ige1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5tb2NrUGxhY2Vob2xkZXIge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBncmV5O1xuICBtYXJnaW4tdG9wOiAxOHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGVJbnB1dCB7XG4gIHdpZHRoOiAxMDBweCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgbmdiLWRhdGVwaWNrZXIge1xuICB6LWluZGV4OiA0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO1xufVxuXG46Om5nLWRlZXAgLmRhdGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbjo6bmctZGVlcCAudGltZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6MzBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuOjpuZy1kZWVwIC5kYXRlIC5tb2NrUGxhY2Vob2xkZXIge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGUgLmRhdGVJbnB1dCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbjo6bmctZGVlcCAubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBtYXgtaGVpZ2h0OiA0MDBweCAhaW1wb3J0YW50O1xufSJdfQ== */" +module.exports = "ngb-timepicker {\n font-size: 1rem;\n}\n\n::ng-deep fieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n::ng-deep .ngb-tp {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n::ng-deep .ngb-tp-hour, .ngb-tp-meridian, .ngb-tp-minute, .ngb-tp-second {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: distribute;\n justify-content: space-around;\n}\n\n::ng-deep .ngb-tp-input-container {\n width: 4em;\n}\n\n::ng-deep .ngb-tp-spacer {\n width: 50px !important;\n text-align: center;\n}\n\n::ng-deep .btn-link {\n font-weight: 400;\n color: #5E35B1;\n background-color: transparent;\n border-width: 1px;\n cursor: pointer;\n border-radius: 4px;\n}\n\n::ng-deep .form-control {\n display: block;\n width: 100%;\n padding: .375rem .75rem;\n font-size: 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ced4da;\n border-radius: .25rem;\n}\n\n::ng-deep .ngb-tp-input {\n text-align: center;\n width: inherit;\n}\n\n::ng-deep .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: nowrap;\n -webkit-clip-path: inset(50%);\n clip-path: inset(50%);\n border: none;\n}\n\n::ng-deep .mat-error {\n font-size: 12px;\n}\n\n.mockPlaceholder {\n font-size: 12px;\n color: grey;\n margin-top: 18px;\n}\n\n::ng-deep .dateInput {\n width: 100px !important;\n}\n\n::ng-deep ngb-datepicker {\n z-index: 4;\n background-color:white;\n}\n\n::ng-deep .date {\n display: inline-block;\n vertical-align: middle;\n}\n\n::ng-deep .time {\n display: inline-block;\n margin-left:30px;\n vertical-align: middle;\n}\n\n::ng-deep .date .mockPlaceholder {\n margin-bottom: 20px;\n}\n\n::ng-deep .date .dateInput {\n margin-bottom: 20px;\n}\n\n::ng-deep .mat-dialog-container {\n max-height: 400px !important;\n}\n\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osVUFBVTtFQUNWLFNBQVM7RUFDVCxTQUFTO0FBQ1g7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QixtQkFBbUI7QUFDckI7O0FBQ0E7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQixzQkFBc0I7RUFDdEIsc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsNkJBQTZCO0VBQzdCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2Ysa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7RUFDWCx1QkFBdUI7RUFDdkIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2Qsc0JBQXNCO0VBQ3RCLDRCQUE0QjtFQUM1Qix5QkFBeUI7RUFDekIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsVUFBVTtFQUNWLFdBQVc7RUFDWCxVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsNkJBQTZCO0VBQzdCLHFCQUFxQjtFQUNyQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtFQUNmLFdBQVc7RUFDWCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxVQUFVO0VBQ1Ysc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIm5nYi10aW1lcGlja2VyIHtcbiAgZm9udC1zaXplOiAxcmVtO1xufVxuXG46Om5nLWRlZXAgZmllbGRzZXQge1xuICBtaW4td2lkdGg6IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cCB7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuOjpuZy1kZWVwIC5uZ2ItdHAtaG91ciwgLm5nYi10cC1tZXJpZGlhbiwgLm5nYi10cC1taW51dGUsIC5uZ2ItdHAtc2Vjb25kIHtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtaW5wdXQtY29udGFpbmVyIHtcbiAgd2lkdGg6IDRlbTtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtc3BhY2VyIHtcbiAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG46Om5nLWRlZXAgLmJ0bi1saW5rIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICM1RTM1QjE7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbjo6bmctZGVlcCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAuMzc1cmVtIC43NXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogIzQ5NTA1NztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NlZDRkYTtcbiAgYm9yZGVyLXJhZGl1czogLjI1cmVtO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cC1pbnB1dCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IGluaGVyaXQ7XG59XG5cbjo6bmctZGVlcCAuc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCg1MCUpO1xuICBjbGlwLXBhdGg6IGluc2V0KDUwJSk7XG4gIGJvcmRlcjogbm9uZTtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZXJyb3Ige1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5tb2NrUGxhY2Vob2xkZXIge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBncmV5O1xuICBtYXJnaW4tdG9wOiAxOHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGVJbnB1dCB7XG4gIHdpZHRoOiAxMDBweCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgbmdiLWRhdGVwaWNrZXIge1xuICB6LWluZGV4OiA0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO1xufVxuXG46Om5nLWRlZXAgLmRhdGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbjo6bmctZGVlcCAudGltZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6MzBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuOjpuZy1kZWVwIC5kYXRlIC5tb2NrUGxhY2Vob2xkZXIge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGUgLmRhdGVJbnB1dCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbjo6bmctZGVlcCAubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBtYXgtaGVpZ2h0OiA0MDBweCAhaW1wb3J0YW50O1xufVxuIl19 */" /***/ }), @@ -1136,7 +1136,7 @@ module.exports = "ngb-timepicker {\n font-size: 1rem;\n}\n\n::ng-deep fieldset /*! no static exports found */ /***/ (function(module, exports) { -module.exports = "
\n
\n
\n
Date *
\n \n
Invalid date
\n
\n
\n
Time *
\n \n \n
Invalid time
\n
\n
\n Caution: Date outside of current range\n
\n
\n
\n \n \n Please enter a title.\n \n \n \n \n
\n Flag color\n \n \n \n \n \n
\n
\n \n \n
\n
" +module.exports = "
\n
\n
\n
Date *
\n \n
Invalid date
\n
\n
\n
Time *
\n \n \n
Invalid time
\n
\n
\n Caution: Date outside of current range\n
\n
\n
\n \n \n Please enter a title.\n \n \n \n \n
\n Flag color\n \n \n \n \n \n
\n
\n \n \n
\n
\n" /***/ }), @@ -1704,7 +1704,7 @@ var MultiGraphCardComponent = /** @class */ (function () { /*! no static exports found */ /***/ (function(module, exports) { -module.exports = "\n 1\" class=\"legends-block\">\n \n
\n \n \n
{{series.key.label}}
\n
\n
\n
\n
\n
\n \n \n \n errorError loading data for: {{axis.label}}\n Technical details:
{{axis.errorMessage}}\n
\n \n 1 ? axis.label : ''\" [showTicks]=\"axis.showTicks\">\n 1 ? axis.label : ''\" [showTicks]=\"axis.showTicks\">\n 1 ? axis.label : ''\">\n \n 1 ? axis.label : ''\">\n \n 1 ? axis.label : ''\">\n \n \n
\n
\n
" +module.exports = "\n 1\" class=\"legends-block\">\n \n
\n \n \n
{{series.key.label}}
\n
\n
\n
\n
\n
\n \n \n \n errorError loading data for: {{axis.label}}. Please check the PowerChart for correct\n information.\n Technical details:
{{axis.errorMessage}}\n
\n \n 1 ? axis.label : ''\" [showTicks]=\"axis.showTicks\">\n 1 ? axis.label : ''\" [showTicks]=\"axis.showTicks\">\n 1 ? axis.label : ''\">\n \n 1 ? axis.label : ''\">\n \n 1 ? axis.label : ''\">\n \n \n
\n
\n
" /***/ }), @@ -12647,7 +12647,7 @@ var UI_CONSTANTS_TOKEN = new _angular_core__WEBPACK_IMPORTED_MODULE_0__["Injecti */ var UI_CONSTANTS = { SYNTH_DATA: 'This is synthesized data used only for demo purposes.', - LOINC_VERIFIED_STRING: 'These BCH data mappings were verified 2019-04-30. v.2.2.1.0', + LOINC_VERIFIED_STRING: 'These BCH data mappings were verified 2019-04-30. v.2.3.0.0', // Tooltip for adding a card inline ADD_TIMELINE_HERE: 'Add timeline here', // Dialog for adding an event to the custom timeline @@ -12882,10 +12882,10 @@ Object(_angular_platform_browser_dynamic__WEBPACK_IMPORTED_MODULE_1__["platformB /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -module.exports = __webpack_require__(/*! /usr/local/google/home/laurendukes/charmander-bch/medtimeline/src/main.ts */"./src/main.ts"); +module.exports = __webpack_require__(/*! /usr/local/google/home/hmulholland/Code/bch/medtimeline/src/main.ts */"./src/main.ts"); /***/ }) },[[0,"runtime","vendor"]]]); -//# sourceMappingURL=main.js.map +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/docs/main.js.map b/docs/main.js.map index 4fdf7858..da3eb624 100644 --- a/docs/main.js.map +++ b/docs/main.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/$_lazy_route_resource lazy namespace object","webpack:///./src/app/app-routing.module.ts","webpack:///./src/app/app.component.css","webpack:///./src/app/app.component.html","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.module.ts","webpack:///./src/app/cardcontainer/cardcontainer.component.css","webpack:///./src/app/cardcontainer/cardcontainer.component.html","webpack:///./src/app/cardcontainer/cardcontainer.component.ts","webpack:///./src/app/cardtypes/card/card.component.css","webpack:///./src/app/cardtypes/card/card.component.html","webpack:///./src/app/cardtypes/card/card.component.ts","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component.css","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component.html","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component.ts","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline.component.css","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline.component.html","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline.component.ts","webpack:///./src/app/cardtypes/legendstyles.css","webpack:///./src/app/cardtypes/multigraphcard/multigraphcard.component.css","webpack:///./src/app/cardtypes/multigraphcard/multigraphcard.component.ts","webpack:///./src/app/cardtypes/multigraphcard/multigraphcard.html","webpack:///./src/app/cardtypes/textboxcard/textboxcard.component.html","webpack:///./src/app/cardtypes/textboxcard/textboxcard.component.ts","webpack:///./src/app/conceptmappings/annotation-mapping.ts","webpack:///./src/app/conceptmappings/concept-file-configuration.ts","webpack:///./src/app/conceptmappings/resource-code-creator.ts","webpack:///./src/app/conceptmappings/resource-code-manager.ts","webpack:///./src/app/conceptmappings/resource-codes/bch-microbio-code.ts","webpack:///./src/app/conceptmappings/resource-codes/diagnostic-report-code.ts","webpack:///./src/app/conceptmappings/resource-codes/display-grouping.ts","webpack:///./src/app/conceptmappings/resource-codes/loinc-code.ts","webpack:///./src/app/conceptmappings/resource-codes/resource-code-group.ts","webpack:///./src/app/conceptmappings/resource-codes/rx-norm-group.ts","webpack:///./src/app/conceptmappings/resource-codes/rx-norm.ts","webpack:///./src/app/data-selector-menu/data-selector-element/data-selector-element.component.css","webpack:///./src/app/data-selector-menu/data-selector-element/data-selector-element.component.html","webpack:///./src/app/data-selector-menu/data-selector-element/data-selector-element.component.ts","webpack:///./src/app/data-selector-menu/data-selector-menu.component.css","webpack:///./src/app/data-selector-menu/data-selector-menu.component.html","webpack:///./src/app/data-selector-menu/data-selector-menu.component.ts","webpack:///./src/app/debugger/debugger.component.html","webpack:///./src/app/debugger/debugger.component.ts","webpack:///./src/app/debugger/debugger.service.ts","webpack:///./src/app/dialogs/confirm-save/confirm-save.component.css","webpack:///./src/app/dialogs/confirm-save/confirm-save.component.html","webpack:///./src/app/dialogs/confirm-save/confirm-save.component.ts","webpack:///./src/app/dialogs/delete-dialog/delete-dialog.component.html","webpack:///./src/app/dialogs/delete-dialog/delete-dialog.component.ts","webpack:///./src/app/dialogs/help-dialog/help-dialog.component.css","webpack:///./src/app/dialogs/help-dialog/help-dialog.component.html","webpack:///./src/app/dialogs/help-dialog/help-dialog.component.ts","webpack:///./src/app/dialogs/ifu-dialog/ifu-dialog.component.css","webpack:///./src/app/dialogs/ifu-dialog/ifu-dialog.component.html","webpack:///./src/app/dialogs/ifu-dialog/ifu-dialog.component.ts","webpack:///./src/app/fhir-resources/annotated/annotated-diagnostic-report.ts","webpack:///./src/app/fhir-resources/annotated/annotated-microbio-report.ts","webpack:///./src/app/fhir-resources/annotated/annotated-observation.ts","webpack:///./src/app/fhir-resources/attachment.ts","webpack:///./src/app/fhir-resources/diagnostic-report.ts","webpack:///./src/app/fhir-resources/dosage.ts","webpack:///./src/app/fhir-resources/encounter.ts","webpack:///./src/app/fhir-resources/medication-administration.ts","webpack:///./src/app/fhir-resources/medication-order.ts","webpack:///./src/app/fhir-resources/medication.ts","webpack:///./src/app/fhir-resources/microbio-report.ts","webpack:///./src/app/fhir-resources/narrative.ts","webpack:///./src/app/fhir-resources/observation-interpretation-valueset.ts","webpack:///./src/app/fhir-resources/observation.ts","webpack:///./src/app/fhir-resources/sets/fhir-resource-set.ts","webpack:///./src/app/fhir-resources/sets/observation-set.ts","webpack:///./src/app/fhir-resources/specimen.ts","webpack:///./src/app/fhir-server/fhir-cache.ts","webpack:///./src/app/fhir-server/fhir-http.service.ts","webpack:///./src/app/fhir-server/fhir-launch/fhir-launch.component.css","webpack:///./src/app/fhir-server/fhir-launch/fhir-launch.component.html","webpack:///./src/app/fhir-server/fhir-launch/fhir-launch.component.ts","webpack:///./src/app/fhir-server/fhir.service.ts","webpack:///./src/app/fhir-server/mock-fhir.service.ts","webpack:///./src/app/fhir-server/smart-on-fhir-client.ts","webpack:///./src/app/graphs/graphdatatypes/customizabledata.ts","webpack:///./src/app/graphs/graphdatatypes/diagnosticgraphdata.ts","webpack:///./src/app/graphs/graphdatatypes/graphdata.ts","webpack:///./src/app/graphs/graphdatatypes/labeled-series.ts","webpack:///./src/app/graphs/graphdatatypes/linegraphdata.ts","webpack:///./src/app/graphs/graphdatatypes/microbiographdata.ts","webpack:///./src/app/graphs/graphdatatypes/stepgraphdata.ts","webpack:///./src/app/graphs/graphtypes/axis-group.ts","webpack:///./src/app/graphs/graphtypes/axis.ts","webpack:///./src/app/graphs/graphtypes/customizable-graph/customizable-graph-annotation.ts","webpack:///./src/app/graphs/graphtypes/customizable-graph/customizable-graph.component.ts","webpack:///./src/app/graphs/graphtypes/diagnostic-graph/diagnostic-graph.component.ts","webpack:///./src/app/graphs/graphtypes/diagnostic-graph/diagnostic-graph.dialog.component.html","webpack:///./src/app/graphs/graphtypes/diagnostic-graph/diagnostic-graph.dialog.component.ts","webpack:///./src/app/graphs/graphtypes/graph.css","webpack:///./src/app/graphs/graphtypes/graph/graph.component.html","webpack:///./src/app/graphs/graphtypes/graph/graph.component.ts","webpack:///./src/app/graphs/graphtypes/legend-info.ts","webpack:///./src/app/graphs/graphtypes/linegraph/linegraph.component.ts","webpack:///./src/app/graphs/graphtypes/microbio-graph/microbio-graph.component.ts","webpack:///./src/app/graphs/graphtypes/scatterplot/scatterplot.component.ts","webpack:///./src/app/graphs/graphtypes/stepgraph/stepgraph.component.html","webpack:///./src/app/graphs/graphtypes/stepgraph/stepgraph.component.ts","webpack:///./src/app/graphs/graphtypes/tooltips/annotated-tooltip.ts","webpack:///./src/app/graphs/graphtypes/tooltips/diagnostic-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/medication-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/microbio-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/observation-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/tooltip.ts","webpack:///./src/app/result-error.ts","webpack:///./src/app/setup/setup-data.service.ts","webpack:///./src/app/setup/setup.component.css","webpack:///./src/app/setup/setup.component.html","webpack:///./src/app/setup/setup.component.ts","webpack:///./src/app/theme/verily_colors.ts","webpack:///./src/app/time-navigation/timeline-controller/timeline-controller.component.css","webpack:///./src/app/time-navigation/timeline-controller/timeline-controller.component.html","webpack:///./src/app/time-navigation/timeline-controller/timeline-controller.component.ts","webpack:///./src/app/time-navigation/timeline-toolbar/timeline-toolbar.component.html","webpack:///./src/app/time-navigation/timeline-toolbar/timeline-toolbar.component.ts","webpack:///./src/app/utils/date_utils.ts","webpack:///./src/app/utils/number_utils.ts","webpack:///./src/app/utils/unit_utils.ts","webpack:///./src/constants.ts","webpack:///./src/environments/environment.ts","webpack:///./src/environments/environment_file_locations.ts","webpack:///./src/main.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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","file":"main.js","sourcesContent":["var map = {\n\t\"./af\": \"./node_modules/moment/locale/af.js\",\n\t\"./af.js\": \"./node_modules/moment/locale/af.js\",\n\t\"./ar\": \"./node_modules/moment/locale/ar.js\",\n\t\"./ar-dz\": \"./node_modules/moment/locale/ar-dz.js\",\n\t\"./ar-dz.js\": \"./node_modules/moment/locale/ar-dz.js\",\n\t\"./ar-kw\": \"./node_modules/moment/locale/ar-kw.js\",\n\t\"./ar-kw.js\": \"./node_modules/moment/locale/ar-kw.js\",\n\t\"./ar-ly\": \"./node_modules/moment/locale/ar-ly.js\",\n\t\"./ar-ly.js\": \"./node_modules/moment/locale/ar-ly.js\",\n\t\"./ar-ma\": \"./node_modules/moment/locale/ar-ma.js\",\n\t\"./ar-ma.js\": \"./node_modules/moment/locale/ar-ma.js\",\n\t\"./ar-sa\": \"./node_modules/moment/locale/ar-sa.js\",\n\t\"./ar-sa.js\": \"./node_modules/moment/locale/ar-sa.js\",\n\t\"./ar-tn\": \"./node_modules/moment/locale/ar-tn.js\",\n\t\"./ar-tn.js\": \"./node_modules/moment/locale/ar-tn.js\",\n\t\"./ar.js\": \"./node_modules/moment/locale/ar.js\",\n\t\"./az\": \"./node_modules/moment/locale/az.js\",\n\t\"./az.js\": \"./node_modules/moment/locale/az.js\",\n\t\"./be\": \"./node_modules/moment/locale/be.js\",\n\t\"./be.js\": \"./node_modules/moment/locale/be.js\",\n\t\"./bg\": \"./node_modules/moment/locale/bg.js\",\n\t\"./bg.js\": \"./node_modules/moment/locale/bg.js\",\n\t\"./bm\": \"./node_modules/moment/locale/bm.js\",\n\t\"./bm.js\": \"./node_modules/moment/locale/bm.js\",\n\t\"./bn\": \"./node_modules/moment/locale/bn.js\",\n\t\"./bn.js\": \"./node_modules/moment/locale/bn.js\",\n\t\"./bo\": \"./node_modules/moment/locale/bo.js\",\n\t\"./bo.js\": \"./node_modules/moment/locale/bo.js\",\n\t\"./br\": \"./node_modules/moment/locale/br.js\",\n\t\"./br.js\": \"./node_modules/moment/locale/br.js\",\n\t\"./bs\": \"./node_modules/moment/locale/bs.js\",\n\t\"./bs.js\": \"./node_modules/moment/locale/bs.js\",\n\t\"./ca\": \"./node_modules/moment/locale/ca.js\",\n\t\"./ca.js\": \"./node_modules/moment/locale/ca.js\",\n\t\"./cs\": \"./node_modules/moment/locale/cs.js\",\n\t\"./cs.js\": \"./node_modules/moment/locale/cs.js\",\n\t\"./cv\": \"./node_modules/moment/locale/cv.js\",\n\t\"./cv.js\": \"./node_modules/moment/locale/cv.js\",\n\t\"./cy\": \"./node_modules/moment/locale/cy.js\",\n\t\"./cy.js\": \"./node_modules/moment/locale/cy.js\",\n\t\"./da\": \"./node_modules/moment/locale/da.js\",\n\t\"./da.js\": \"./node_modules/moment/locale/da.js\",\n\t\"./de\": \"./node_modules/moment/locale/de.js\",\n\t\"./de-at\": \"./node_modules/moment/locale/de-at.js\",\n\t\"./de-at.js\": \"./node_modules/moment/locale/de-at.js\",\n\t\"./de-ch\": \"./node_modules/moment/locale/de-ch.js\",\n\t\"./de-ch.js\": \"./node_modules/moment/locale/de-ch.js\",\n\t\"./de.js\": \"./node_modules/moment/locale/de.js\",\n\t\"./dv\": \"./node_modules/moment/locale/dv.js\",\n\t\"./dv.js\": \"./node_modules/moment/locale/dv.js\",\n\t\"./el\": \"./node_modules/moment/locale/el.js\",\n\t\"./el.js\": \"./node_modules/moment/locale/el.js\",\n\t\"./en-au\": \"./node_modules/moment/locale/en-au.js\",\n\t\"./en-au.js\": \"./node_modules/moment/locale/en-au.js\",\n\t\"./en-ca\": \"./node_modules/moment/locale/en-ca.js\",\n\t\"./en-ca.js\": \"./node_modules/moment/locale/en-ca.js\",\n\t\"./en-gb\": \"./node_modules/moment/locale/en-gb.js\",\n\t\"./en-gb.js\": \"./node_modules/moment/locale/en-gb.js\",\n\t\"./en-ie\": \"./node_modules/moment/locale/en-ie.js\",\n\t\"./en-ie.js\": \"./node_modules/moment/locale/en-ie.js\",\n\t\"./en-il\": \"./node_modules/moment/locale/en-il.js\",\n\t\"./en-il.js\": \"./node_modules/moment/locale/en-il.js\",\n\t\"./en-nz\": \"./node_modules/moment/locale/en-nz.js\",\n\t\"./en-nz.js\": \"./node_modules/moment/locale/en-nz.js\",\n\t\"./eo\": \"./node_modules/moment/locale/eo.js\",\n\t\"./eo.js\": \"./node_modules/moment/locale/eo.js\",\n\t\"./es\": \"./node_modules/moment/locale/es.js\",\n\t\"./es-do\": \"./node_modules/moment/locale/es-do.js\",\n\t\"./es-do.js\": \"./node_modules/moment/locale/es-do.js\",\n\t\"./es-us\": \"./node_modules/moment/locale/es-us.js\",\n\t\"./es-us.js\": \"./node_modules/moment/locale/es-us.js\",\n\t\"./es.js\": \"./node_modules/moment/locale/es.js\",\n\t\"./et\": \"./node_modules/moment/locale/et.js\",\n\t\"./et.js\": \"./node_modules/moment/locale/et.js\",\n\t\"./eu\": \"./node_modules/moment/locale/eu.js\",\n\t\"./eu.js\": \"./node_modules/moment/locale/eu.js\",\n\t\"./fa\": \"./node_modules/moment/locale/fa.js\",\n\t\"./fa.js\": \"./node_modules/moment/locale/fa.js\",\n\t\"./fi\": \"./node_modules/moment/locale/fi.js\",\n\t\"./fi.js\": \"./node_modules/moment/locale/fi.js\",\n\t\"./fo\": \"./node_modules/moment/locale/fo.js\",\n\t\"./fo.js\": \"./node_modules/moment/locale/fo.js\",\n\t\"./fr\": \"./node_modules/moment/locale/fr.js\",\n\t\"./fr-ca\": \"./node_modules/moment/locale/fr-ca.js\",\n\t\"./fr-ca.js\": \"./node_modules/moment/locale/fr-ca.js\",\n\t\"./fr-ch\": \"./node_modules/moment/locale/fr-ch.js\",\n\t\"./fr-ch.js\": \"./node_modules/moment/locale/fr-ch.js\",\n\t\"./fr.js\": \"./node_modules/moment/locale/fr.js\",\n\t\"./fy\": \"./node_modules/moment/locale/fy.js\",\n\t\"./fy.js\": \"./node_modules/moment/locale/fy.js\",\n\t\"./gd\": \"./node_modules/moment/locale/gd.js\",\n\t\"./gd.js\": \"./node_modules/moment/locale/gd.js\",\n\t\"./gl\": \"./node_modules/moment/locale/gl.js\",\n\t\"./gl.js\": \"./node_modules/moment/locale/gl.js\",\n\t\"./gom-latn\": \"./node_modules/moment/locale/gom-latn.js\",\n\t\"./gom-latn.js\": \"./node_modules/moment/locale/gom-latn.js\",\n\t\"./gu\": \"./node_modules/moment/locale/gu.js\",\n\t\"./gu.js\": \"./node_modules/moment/locale/gu.js\",\n\t\"./he\": \"./node_modules/moment/locale/he.js\",\n\t\"./he.js\": \"./node_modules/moment/locale/he.js\",\n\t\"./hi\": \"./node_modules/moment/locale/hi.js\",\n\t\"./hi.js\": \"./node_modules/moment/locale/hi.js\",\n\t\"./hr\": \"./node_modules/moment/locale/hr.js\",\n\t\"./hr.js\": \"./node_modules/moment/locale/hr.js\",\n\t\"./hu\": \"./node_modules/moment/locale/hu.js\",\n\t\"./hu.js\": \"./node_modules/moment/locale/hu.js\",\n\t\"./hy-am\": \"./node_modules/moment/locale/hy-am.js\",\n\t\"./hy-am.js\": \"./node_modules/moment/locale/hy-am.js\",\n\t\"./id\": \"./node_modules/moment/locale/id.js\",\n\t\"./id.js\": \"./node_modules/moment/locale/id.js\",\n\t\"./is\": \"./node_modules/moment/locale/is.js\",\n\t\"./is.js\": \"./node_modules/moment/locale/is.js\",\n\t\"./it\": \"./node_modules/moment/locale/it.js\",\n\t\"./it.js\": \"./node_modules/moment/locale/it.js\",\n\t\"./ja\": \"./node_modules/moment/locale/ja.js\",\n\t\"./ja.js\": \"./node_modules/moment/locale/ja.js\",\n\t\"./jv\": \"./node_modules/moment/locale/jv.js\",\n\t\"./jv.js\": \"./node_modules/moment/locale/jv.js\",\n\t\"./ka\": \"./node_modules/moment/locale/ka.js\",\n\t\"./ka.js\": \"./node_modules/moment/locale/ka.js\",\n\t\"./kk\": \"./node_modules/moment/locale/kk.js\",\n\t\"./kk.js\": \"./node_modules/moment/locale/kk.js\",\n\t\"./km\": \"./node_modules/moment/locale/km.js\",\n\t\"./km.js\": \"./node_modules/moment/locale/km.js\",\n\t\"./kn\": \"./node_modules/moment/locale/kn.js\",\n\t\"./kn.js\": \"./node_modules/moment/locale/kn.js\",\n\t\"./ko\": \"./node_modules/moment/locale/ko.js\",\n\t\"./ko.js\": \"./node_modules/moment/locale/ko.js\",\n\t\"./ku\": \"./node_modules/moment/locale/ku.js\",\n\t\"./ku.js\": \"./node_modules/moment/locale/ku.js\",\n\t\"./ky\": \"./node_modules/moment/locale/ky.js\",\n\t\"./ky.js\": \"./node_modules/moment/locale/ky.js\",\n\t\"./lb\": \"./node_modules/moment/locale/lb.js\",\n\t\"./lb.js\": \"./node_modules/moment/locale/lb.js\",\n\t\"./lo\": \"./node_modules/moment/locale/lo.js\",\n\t\"./lo.js\": \"./node_modules/moment/locale/lo.js\",\n\t\"./lt\": \"./node_modules/moment/locale/lt.js\",\n\t\"./lt.js\": \"./node_modules/moment/locale/lt.js\",\n\t\"./lv\": \"./node_modules/moment/locale/lv.js\",\n\t\"./lv.js\": \"./node_modules/moment/locale/lv.js\",\n\t\"./me\": \"./node_modules/moment/locale/me.js\",\n\t\"./me.js\": \"./node_modules/moment/locale/me.js\",\n\t\"./mi\": \"./node_modules/moment/locale/mi.js\",\n\t\"./mi.js\": \"./node_modules/moment/locale/mi.js\",\n\t\"./mk\": \"./node_modules/moment/locale/mk.js\",\n\t\"./mk.js\": \"./node_modules/moment/locale/mk.js\",\n\t\"./ml\": \"./node_modules/moment/locale/ml.js\",\n\t\"./ml.js\": \"./node_modules/moment/locale/ml.js\",\n\t\"./mn\": \"./node_modules/moment/locale/mn.js\",\n\t\"./mn.js\": \"./node_modules/moment/locale/mn.js\",\n\t\"./mr\": \"./node_modules/moment/locale/mr.js\",\n\t\"./mr.js\": \"./node_modules/moment/locale/mr.js\",\n\t\"./ms\": \"./node_modules/moment/locale/ms.js\",\n\t\"./ms-my\": \"./node_modules/moment/locale/ms-my.js\",\n\t\"./ms-my.js\": \"./node_modules/moment/locale/ms-my.js\",\n\t\"./ms.js\": \"./node_modules/moment/locale/ms.js\",\n\t\"./mt\": \"./node_modules/moment/locale/mt.js\",\n\t\"./mt.js\": \"./node_modules/moment/locale/mt.js\",\n\t\"./my\": \"./node_modules/moment/locale/my.js\",\n\t\"./my.js\": \"./node_modules/moment/locale/my.js\",\n\t\"./nb\": \"./node_modules/moment/locale/nb.js\",\n\t\"./nb.js\": \"./node_modules/moment/locale/nb.js\",\n\t\"./ne\": \"./node_modules/moment/locale/ne.js\",\n\t\"./ne.js\": \"./node_modules/moment/locale/ne.js\",\n\t\"./nl\": \"./node_modules/moment/locale/nl.js\",\n\t\"./nl-be\": \"./node_modules/moment/locale/nl-be.js\",\n\t\"./nl-be.js\": \"./node_modules/moment/locale/nl-be.js\",\n\t\"./nl.js\": \"./node_modules/moment/locale/nl.js\",\n\t\"./nn\": \"./node_modules/moment/locale/nn.js\",\n\t\"./nn.js\": \"./node_modules/moment/locale/nn.js\",\n\t\"./pa-in\": \"./node_modules/moment/locale/pa-in.js\",\n\t\"./pa-in.js\": \"./node_modules/moment/locale/pa-in.js\",\n\t\"./pl\": \"./node_modules/moment/locale/pl.js\",\n\t\"./pl.js\": \"./node_modules/moment/locale/pl.js\",\n\t\"./pt\": \"./node_modules/moment/locale/pt.js\",\n\t\"./pt-br\": \"./node_modules/moment/locale/pt-br.js\",\n\t\"./pt-br.js\": \"./node_modules/moment/locale/pt-br.js\",\n\t\"./pt.js\": \"./node_modules/moment/locale/pt.js\",\n\t\"./ro\": \"./node_modules/moment/locale/ro.js\",\n\t\"./ro.js\": \"./node_modules/moment/locale/ro.js\",\n\t\"./ru\": \"./node_modules/moment/locale/ru.js\",\n\t\"./ru.js\": \"./node_modules/moment/locale/ru.js\",\n\t\"./sd\": \"./node_modules/moment/locale/sd.js\",\n\t\"./sd.js\": \"./node_modules/moment/locale/sd.js\",\n\t\"./se\": \"./node_modules/moment/locale/se.js\",\n\t\"./se.js\": \"./node_modules/moment/locale/se.js\",\n\t\"./si\": \"./node_modules/moment/locale/si.js\",\n\t\"./si.js\": \"./node_modules/moment/locale/si.js\",\n\t\"./sk\": \"./node_modules/moment/locale/sk.js\",\n\t\"./sk.js\": \"./node_modules/moment/locale/sk.js\",\n\t\"./sl\": \"./node_modules/moment/locale/sl.js\",\n\t\"./sl.js\": \"./node_modules/moment/locale/sl.js\",\n\t\"./sq\": \"./node_modules/moment/locale/sq.js\",\n\t\"./sq.js\": \"./node_modules/moment/locale/sq.js\",\n\t\"./sr\": \"./node_modules/moment/locale/sr.js\",\n\t\"./sr-cyrl\": \"./node_modules/moment/locale/sr-cyrl.js\",\n\t\"./sr-cyrl.js\": \"./node_modules/moment/locale/sr-cyrl.js\",\n\t\"./sr.js\": \"./node_modules/moment/locale/sr.js\",\n\t\"./ss\": \"./node_modules/moment/locale/ss.js\",\n\t\"./ss.js\": \"./node_modules/moment/locale/ss.js\",\n\t\"./sv\": \"./node_modules/moment/locale/sv.js\",\n\t\"./sv.js\": \"./node_modules/moment/locale/sv.js\",\n\t\"./sw\": \"./node_modules/moment/locale/sw.js\",\n\t\"./sw.js\": \"./node_modules/moment/locale/sw.js\",\n\t\"./ta\": \"./node_modules/moment/locale/ta.js\",\n\t\"./ta.js\": \"./node_modules/moment/locale/ta.js\",\n\t\"./te\": \"./node_modules/moment/locale/te.js\",\n\t\"./te.js\": \"./node_modules/moment/locale/te.js\",\n\t\"./tet\": \"./node_modules/moment/locale/tet.js\",\n\t\"./tet.js\": \"./node_modules/moment/locale/tet.js\",\n\t\"./tg\": \"./node_modules/moment/locale/tg.js\",\n\t\"./tg.js\": \"./node_modules/moment/locale/tg.js\",\n\t\"./th\": \"./node_modules/moment/locale/th.js\",\n\t\"./th.js\": \"./node_modules/moment/locale/th.js\",\n\t\"./tl-ph\": \"./node_modules/moment/locale/tl-ph.js\",\n\t\"./tl-ph.js\": \"./node_modules/moment/locale/tl-ph.js\",\n\t\"./tlh\": \"./node_modules/moment/locale/tlh.js\",\n\t\"./tlh.js\": \"./node_modules/moment/locale/tlh.js\",\n\t\"./tr\": \"./node_modules/moment/locale/tr.js\",\n\t\"./tr.js\": \"./node_modules/moment/locale/tr.js\",\n\t\"./tzl\": \"./node_modules/moment/locale/tzl.js\",\n\t\"./tzl.js\": \"./node_modules/moment/locale/tzl.js\",\n\t\"./tzm\": \"./node_modules/moment/locale/tzm.js\",\n\t\"./tzm-latn\": \"./node_modules/moment/locale/tzm-latn.js\",\n\t\"./tzm-latn.js\": \"./node_modules/moment/locale/tzm-latn.js\",\n\t\"./tzm.js\": \"./node_modules/moment/locale/tzm.js\",\n\t\"./ug-cn\": \"./node_modules/moment/locale/ug-cn.js\",\n\t\"./ug-cn.js\": \"./node_modules/moment/locale/ug-cn.js\",\n\t\"./uk\": \"./node_modules/moment/locale/uk.js\",\n\t\"./uk.js\": \"./node_modules/moment/locale/uk.js\",\n\t\"./ur\": \"./node_modules/moment/locale/ur.js\",\n\t\"./ur.js\": \"./node_modules/moment/locale/ur.js\",\n\t\"./uz\": \"./node_modules/moment/locale/uz.js\",\n\t\"./uz-latn\": \"./node_modules/moment/locale/uz-latn.js\",\n\t\"./uz-latn.js\": \"./node_modules/moment/locale/uz-latn.js\",\n\t\"./uz.js\": \"./node_modules/moment/locale/uz.js\",\n\t\"./vi\": \"./node_modules/moment/locale/vi.js\",\n\t\"./vi.js\": \"./node_modules/moment/locale/vi.js\",\n\t\"./x-pseudo\": \"./node_modules/moment/locale/x-pseudo.js\",\n\t\"./x-pseudo.js\": \"./node_modules/moment/locale/x-pseudo.js\",\n\t\"./yo\": \"./node_modules/moment/locale/yo.js\",\n\t\"./yo.js\": \"./node_modules/moment/locale/yo.js\",\n\t\"./zh-cn\": \"./node_modules/moment/locale/zh-cn.js\",\n\t\"./zh-cn.js\": \"./node_modules/moment/locale/zh-cn.js\",\n\t\"./zh-hk\": \"./node_modules/moment/locale/zh-hk.js\",\n\t\"./zh-hk.js\": \"./node_modules/moment/locale/zh-hk.js\",\n\t\"./zh-tw\": \"./node_modules/moment/locale/zh-tw.js\",\n\t\"./zh-tw.js\": \"./node_modules/moment/locale/zh-tw.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) { // check for number or string\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn id;\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./node_modules/moment/locale sync recursive ^\\\\.\\\\/.*$\";","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"./src/$$_lazy_route_resource lazy recursive\";","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {NgModule} from '@angular/core';\nimport {RouterModule, Routes} from '@angular/router';\n\nimport {CardcontainerComponent} from './cardcontainer/cardcontainer.component';\nimport {FhirLaunchComponent} from './fhir-server/fhir-launch/fhir-launch.component';\nimport {SetupComponent} from './setup/setup.component';\n\n/* On their end, it's locked down so that the only acceptable redirect\nURL is localhost:8000/. So, we have to do a different path for\nauthentication. */\nconst routes: Routes = [\n {path: 'main', component: CardcontainerComponent},\n {path: 'setup', component: SetupComponent},\n {path: '', component: FhirLaunchComponent}, {path: '**', redirectTo: ''}\n];\n\n\n@NgModule({exports: [RouterModule], imports: [RouterModule.forRoot(routes)]})\nexport class AppRoutingModule {\n}\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2FwcC5jb21wb25lbnQuY3NzIn0= */\"","module.exports = \"\\n\\nMedTimeLine\\n\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component} from '@angular/core';\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.css']\n})\nexport class AppComponent {\n title = 'app';\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport 'fhirclient';\n\nimport {HttpClientModule} from '@angular/common/http';\nimport {NgModule} from '@angular/core';\nimport {FlexLayoutModule} from '@angular/flex-layout';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\n// tslint:disable-next-line:max-line-length\nimport {MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCheckboxModule, MatDatepickerModule, MatDialogModule, MatDividerModule, MatExpansionModule, MatGridListModule, MatListModule, MatMenuModule, MatNativeDateModule, MatProgressSpinnerModule, MatRadioModule, MatSnackBarModule, MatStepperModule, MatToolbarModule, MatTooltipModule} from '@angular/material';\nimport {MatCardModule} from '@angular/material/card';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatInputModule} from '@angular/material/input';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\nimport {NgbModule} from '@ng-bootstrap/ng-bootstrap';\nimport {ChartsModule} from 'ng2-charts';\nimport {DragulaModule} from 'ng2-dragula';\nimport {NgxDaterangepickerMd} from 'ngx-daterangepicker-material';\nimport {UI_CONSTANTS, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {environment} from '../environments/environment';\n\nimport {AppRoutingModule} from './app-routing.module';\nimport {AppComponent} from './app.component';\nimport {CardcontainerComponent} from './cardcontainer/cardcontainer.component';\nimport {CardComponent} from './cardtypes/card/card.component';\n// tslint:disable-next-line:max-line-length\nimport {CustomizableTimelineDialogComponent} from './cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component';\nimport {CustomizableTimelineComponent} from './cardtypes/customizable-timeline/customizable-timeline.component';\nimport {MultiGraphCardComponent} from './cardtypes/multigraphcard/multigraphcard.component';\nimport {TextboxcardComponent} from './cardtypes/textboxcard/textboxcard.component';\nimport {ConceptFileConfiguration} from './conceptmappings/concept-file-configuration';\nimport {ResourceCodeCreator} from './conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from './conceptmappings/resource-code-manager';\nimport {DataSelectorElementComponent} from './data-selector-menu/data-selector-element/data-selector-element.component';\nimport {DataSelectorMenuComponent} from './data-selector-menu/data-selector-menu.component';\nimport {DebuggerComponent} from './debugger/debugger.component';\nimport {ConfirmSaveComponent} from './dialogs/confirm-save/confirm-save.component';\nimport {DeleteDialogComponent} from './dialogs/delete-dialog/delete-dialog.component';\nimport {HelpDialogComponent} from './dialogs/help-dialog/help-dialog.component';\nimport {IfuDialogComponent} from './dialogs/ifu-dialog/ifu-dialog.component';\nimport {FhirHttpService} from './fhir-server/fhir-http.service';\nimport {FhirLaunchComponent} from './fhir-server/fhir-launch/fhir-launch.component';\nimport {FhirService} from './fhir-server/fhir.service';\nimport {MockFhirService} from './fhir-server/mock-fhir.service';\nimport {SMART_ON_FHIR_CLIENT} from './fhir-server/smart-on-fhir-client';\nimport {CustomizableGraphComponent} from './graphs/graphtypes/customizable-graph/customizable-graph.component';\nimport {DiagnosticGraphComponent} from './graphs/graphtypes/diagnostic-graph/diagnostic-graph.component';\nimport {DiagnosticGraphDialogComponent} from './graphs/graphtypes/diagnostic-graph/diagnostic-graph.dialog.component';\nimport {LineGraphComponent} from './graphs/graphtypes/linegraph/linegraph.component';\nimport {MicrobioGraphComponent} from './graphs/graphtypes/microbio-graph/microbio-graph.component';\nimport {ScatterplotComponent} from './graphs/graphtypes/scatterplot/scatterplot.component';\nimport {StepGraphComponent} from './graphs/graphtypes/stepgraph/stepgraph.component';\nimport {SetupComponent} from './setup/setup.component';\nimport {TimelineControllerComponent} from './time-navigation/timeline-controller/timeline-controller.component';\nimport {TimelineToolbarComponent} from './time-navigation/timeline-toolbar/timeline-toolbar.component';\n\n@NgModule({\n declarations: [\n AppComponent,\n FhirLaunchComponent,\n CardcontainerComponent,\n TextboxcardComponent,\n LineGraphComponent,\n ScatterplotComponent,\n StepGraphComponent,\n MultiGraphCardComponent,\n TimelineControllerComponent,\n CustomizableTimelineComponent,\n CustomizableGraphComponent,\n CustomizableTimelineDialogComponent,\n MicrobioGraphComponent,\n DiagnosticGraphComponent,\n TimelineToolbarComponent,\n DataSelectorElementComponent,\n DataSelectorMenuComponent,\n HelpDialogComponent,\n CardComponent,\n DeleteDialogComponent,\n DebuggerComponent,\n SetupComponent,\n ConfirmSaveComponent,\n IfuDialogComponent,\n DiagnosticGraphDialogComponent,\n ],\n imports: [\n BrowserModule,\n NgbModule,\n MatCardModule,\n MatGridListModule,\n HttpClientModule,\n MatListModule,\n MatDividerModule,\n MatIconModule,\n NoopAnimationsModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatProgressSpinnerModule,\n MatButtonModule,\n MatAutocompleteModule,\n MatMenuModule,\n MatTooltipModule,\n FlexLayoutModule.withConfig({useColumnBasisZero: false}),\n MatDialogModule,\n MatStepperModule,\n MatToolbarModule,\n MatSnackBarModule,\n MatDatepickerModule,\n NgxDaterangepickerMd.forRoot({}),\n MatButtonToggleModule,\n MatNativeDateModule,\n MatCheckboxModule,\n MatRadioModule,\n ChartsModule,\n DragulaModule.forRoot(),\n AppRoutingModule,\n MatExpansionModule,\n ],\n providers: [\n ResourceCodeCreator, ResourceCodeManager,\n // This sets up a provider for the smart on fhir client defined by\n // assets/fhir-client.min.js (defined as symbol `FHIR`) so that it can be\n // injected into the service that uses it to allow for easier testing.\n {provide: SMART_ON_FHIR_CLIENT, useValue: FHIR}, {\n provide: FhirService,\n useClass: environment.useMockServer ? MockFhirService : FhirHttpService\n },\n {provide: UI_CONSTANTS_TOKEN, useValue: UI_CONSTANTS}, {\n provide: ConceptFileConfiguration,\n useValue: new ConceptFileConfiguration(\n environment.conceptsFolder, environment.vitalGroupFile,\n environment.vitalConceptsFile, environment.labConceptsFile,\n environment.labGroupFile, environment.radiologyConceptsFile,\n environment.radiologyGroupFile, environment.antibioticConceptsFile,\n environment.antibioticGroupFile, environment.antiviralConceptsFile,\n environment.antiviralGroupFile, environment.antifungalConceptsFile,\n environment.antifungalGroupFile, environment.microbioGroupFile,\n environment.microbioConceptsFile)\n }\n ],\n bootstrap: [AppComponent],\n entryComponents: [\n CustomizableTimelineDialogComponent, HelpDialogComponent,\n DeleteDialogComponent, ConfirmSaveComponent, IfuDialogComponent,\n DiagnosticGraphDialogComponent\n ]\n})\nexport class AppModule {\n}\n","module.exports = \".cardContainer {\\n background-color: #202020; /* GREY_900 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n width: 100%;\\n min-height: 100%;\\n height: 100%;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n /* Disable selecting/highlighting on the page. */\\n -webkit-touch-callout: none; /* iOS Safari */\\n -webkit-user-select: none; /* Safari */\\n -moz-user-select: none; /* Firefox */\\n -ms-user-select: none; /* Internet Explorer/Edge */\\n user-select: none; /* Chrome and Opera */\\n}\\n\\n.draggable {\\n display: flex;\\n display: -ms-flexbox;\\n height: 100%;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n}\\n\\n.flexSpacer {\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\n::ng-deep .mat-toolbar, .mat-toolbar h1, .mat-toolbar h2, .mat-toolbar h3, .mat-toolbar h4, .mat-toolbar h5, .mat-toolbar h6, .mat-toolbar-row, .mat-toolbar-single-row {\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n.mat-toolbar {\\n /* Deep Purple 800 to Pink 900 */\\n background-image: linear-gradient(to right, #4527A0 , #870D4E);\\n color: white;\\n}\\n\\n::ng-deep .gu-unselectable app-data-selector-menu {\\n /* Hide the data selector menus while a card is being dragged. */\\n opacity: 0 !important;\\n}\\n\\n.makeGutters {\\n padding-right: 50px;\\n padding-left: 50px;\\n}\\n\\n::ng-deep .mat-toolbar-single-row {\\n white-space: unset !important;\\n}\\n\\n::ng-deep .timelineToolbarMain {\\n float: right;\\n margin-right: 15px;\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n::ng-deep app-card {\\n flex-direction: row;\\n -ms-flex-direction: row;\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n::ng-deep app-data-selector-menu {\\n flex-direction: row;\\n -ms-flex-direction: row;\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZGNvbnRhaW5lci9jYXJkY29udGFpbmVyLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSx5QkFBeUIsRUFBRSxhQUFhO0VBQ3hDLGFBQWE7RUFDYixvQkFBb0IsRUFBRSxhQUFhO0VBQ25DLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QiwwQkFBMEIsRUFBRSxhQUFhO0VBQ3pDLGdEQUFnRDtFQUNoRCwyQkFBMkIsRUFBRSxlQUFlO0VBQzVDLHlCQUF5QixFQUFFLFdBQVc7S0FDbkMsc0JBQXNCLEVBQUUsWUFBWTtNQUNuQyxxQkFBcUIsRUFBRSwyQkFBMkI7VUFDOUMsaUJBQWlCLEVBQUUscUJBQXFCO0FBQ2xEOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG9CQUFvQjtFQUNwQixZQUFZO0VBQ1osc0JBQXNCO0VBQ3RCLDBCQUEwQixFQUFFLGFBQWE7QUFDM0M7O0FBRUE7RUFDRSxZQUFZO0VBQ1osZ0JBQWdCLEVBQUUsYUFBYTtBQUNqQzs7QUFFQTtFQUNFLG9CQUFvQixFQUFFLGFBQWE7QUFDckM7O0FBRUE7R0FDRyxnQ0FBZ0M7RUFDakMsOERBQThEO0VBQzlELFlBQVk7QUFDZDs7QUFFQTtFQUNFLGdFQUFnRTtFQUNoRSxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixvQkFBb0IsR0FBRyxhQUFhO0FBQ3RDOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QixhQUFhO0VBQ2Isb0JBQW9CLEVBQUUsYUFBYTtBQUNyQzs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQix1QkFBdUI7RUFDdkIsYUFBYTtFQUNiLG9CQUFvQixFQUFFLGFBQWE7QUFDckMiLCJmaWxlIjoic3JjL2FwcC9jYXJkY29udGFpbmVyL2NhcmRjb250YWluZXIuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jYXJkQ29udGFpbmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsgLyogR1JFWV85MDAgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIHdpZHRoOiAxMDAlO1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvKiBGb3IgSUUxMCAqL1xuICAvKiBEaXNhYmxlIHNlbGVjdGluZy9oaWdobGlnaHRpbmcgb24gdGhlIHBhZ2UuICovXG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsgLyogaU9TIFNhZmFyaSAqL1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyAvKiBTYWZhcmkgKi9cbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsgLyogRmlyZWZveCAqL1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOyAvKiBJbnRlcm5ldCBFeHBsb3Jlci9FZGdlICovXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IC8qIENocm9tZSBhbmQgT3BlcmEgKi9cbn1cblxuLmRyYWdnYWJsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvKiBGb3IgSUUxMCAqL1xufVxuXG4uZmxleFNwYWNlciB7XG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbn1cblxuOjpuZy1kZWVwIC5tYXQtdG9vbGJhciwgLm1hdC10b29sYmFyIGgxLCAubWF0LXRvb2xiYXIgaDIsIC5tYXQtdG9vbGJhciBoMywgLm1hdC10b29sYmFyIGg0LCAubWF0LXRvb2xiYXIgaDUsIC5tYXQtdG9vbGJhciBoNiwgLm1hdC10b29sYmFyLXJvdywgLm1hdC10b29sYmFyLXNpbmdsZS1yb3cge1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDsgLyogRm9yIElFMTAgKi9cbn1cblxuLm1hdC10b29sYmFyIHtcbiAgIC8qIERlZXAgUHVycGxlIDgwMCB0byBQaW5rIDkwMCAqL1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICM0NTI3QTAgLCAjODcwRDRFKTtcbiAgY29sb3I6IHdoaXRlO1xufVxuXG46Om5nLWRlZXAgLmd1LXVuc2VsZWN0YWJsZSBhcHAtZGF0YS1zZWxlY3Rvci1tZW51IHtcbiAgLyogSGlkZSB0aGUgZGF0YSBzZWxlY3RvciBtZW51cyB3aGlsZSBhIGNhcmQgaXMgYmVpbmcgZHJhZ2dlZC4gKi9cbiAgb3BhY2l0eTogMCAhaW1wb3J0YW50O1xufVxuXG4ubWFrZUd1dHRlcnMge1xuICBwYWRkaW5nLXJpZ2h0OiA1MHB4O1xuICBwYWRkaW5nLWxlZnQ6IDUwcHg7XG59XG5cbjo6bmctZGVlcCAubWF0LXRvb2xiYXItc2luZ2xlLXJvdyB7XG4gIHdoaXRlLXNwYWNlOiB1bnNldCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgLnRpbWVsaW5lVG9vbGJhck1haW4ge1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogMTVweDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7ICAvKiBGb3IgSUUxMCAqL1xufVxuXG46Om5nLWRlZXAgYXBwLWNhcmQge1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG59XG5cbjo6bmctZGVlcCBhcHAtZGF0YS1zZWxlY3Rvci1tZW51IHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94OyAvKiBGb3IgSUUxMCAqL1xufVxuIl19 */\"","module.exports = \"\\n \\n \\n \\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n \\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {MatDialogRef} from '@angular/material/dialog';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport html2canvas from 'html2canvas';\nimport {DateTime, Interval} from 'luxon';\nimport {DragulaService} from 'ng2-dragula';\nimport {Subscription} from 'rxjs';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\nimport {v4 as uuid} from 'uuid';\n\nimport {environment} from '../../environments/environment';\nimport {ConfirmSaveComponent} from '../dialogs/confirm-save/confirm-save.component';\nimport {DeleteDialogComponent} from '../dialogs/delete-dialog/delete-dialog.component';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {CustomizableData} from '../graphs/graphdatatypes/customizabledata';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ChartType} from '../graphs/graphtypes/graph/graph.component';\nimport {SetupDataService} from '../setup/setup-data.service';\n\n@Component({\n selector: 'app-cardcontainer',\n templateUrl: './cardcontainer.component.html',\n styleUrls: ['./cardcontainer.component.css'],\n entryComponents: [DeleteDialogComponent],\n})\nexport class CardcontainerComponent {\n // How long to display the snack bar for.\n private readonly DISPLAY_TIME = 6000;\n\n // Whether or not to display the debugger.\n useDebugger = environment.useDebugger;\n\n /**\n * The format of each object in the array is an object representing a line\n * drawn on the chart, that has a value, text, and class field. The value\n * field represents the x-position of the line to be drawn, while the class\n * represents the class name, and the text represents the text displayed near\n * the line.\n */\n eventlines: Array<{[key: string]: number | string}> = [];\n\n // The concepts that are actually being displayed on the page.\n // We keep track of unique ids for each displayed card, to allow removal on\n // clicking the trashcan icon.\n\n readonly displayedConcepts:\n Array<{[key: string]: AxisGroup | string | CustomizableData}> = [];\n\n // The original concepts to duplicate, if necessary.\n readonly originalConcepts: Promise =\n this.setupDataService.displayGroupMapping.then((mapping) => {\n /* Load in the concepts to display, flattening them all into a\n * single-depth array. */\n return Array.from(mapping.values())\n .reduce((acc, val) => acc.concat(val), []);\n });\n\n // Hold an instance of this enum so that the HTML template can access it.\n readonly chartType = ChartType;\n\n /**\n * By default make the date range displayed the past seven days.\n */\n dateRange: Interval =\n Interval.fromDateTimes(DateTime.utc().minus({days: 7}), DateTime.utc());\n\n // Holds a subscription to the observable sequence of events emitted by the\n // Dragula Service.\n private readonly subs = new Subscription();\n\n // Holds the most recently removed card from the container, mapping the index\n // of the displayed card to the displayedConcept value.\n private recentlyRemoved:\n [number, {[key: string]: AxisGroup | string | CustomizableData}];\n\n // The reference for the Delete Card Dialog opened.\n private deleteDialogRef: MatDialogRef;\n\n // The reference for the Save Snapshot Dialog opened.\n private saveDialogRef: MatDialogRef;\n\n // A map of custom timeline id to the event lines corresponding to that\n // timeline.\n private eventsForCustomTimelines =\n new Map>();\n\n\n\n constructor(\n dragulaService: DragulaService,\n readonly setupDataService: SetupDataService,\n private snackBar: MatSnackBar,\n private deleteDialog: MatDialog,\n private saveDialog: MatDialog,\n private fhirService: FhirService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any,\n ) {\n this.setUpCards();\n this.setUpDrag(dragulaService);\n }\n\n private setUpCards() {\n // Add a textbox at the top of the card list.\n this.addTextbox();\n // Add a custom timeline to the top of the card list.\n this.addCustomTimeline();\n // Add all cards selected at the set-up screen.\n for (const concept of this.setupDataService.selectedConcepts) {\n this.displayedConcepts.push({'id': uuid(), 'concept': concept});\n }\n }\n\n // Ensures that the order of displayed concepts is updated as the user drags\n // cards around.\n private setUpDrag(dragulaService: DragulaService) {\n this.subs.add(dragulaService.drop('graphcards').subscribe((value) => {\n // Rearrange the order of this.displayedConcepts if graph/textbox\n // cards are reordered. We do not use dragulaModel since we cannot use\n // it for separate lists on the configuration panel.\n let originalIndex = this.displayedConcepts.map(x => x.id).indexOf(\n value.el.getAttribute('data-index'));\n const siblingIndex = this.getSiblingIdx(value);\n const elementDisplayed = this.displayedConcepts[originalIndex];\n // Add the element to its new position.\n this.displayedConcepts.splice(siblingIndex, 0, elementDisplayed);\n // Adjust the original position if needed.\n if (siblingIndex < originalIndex) {\n originalIndex++;\n }\n this.displayedConcepts.splice(originalIndex, 1);\n\n recordGoogleAnalyticsEvent(\n 'moveCard', 'moveCard',\n (typeof elementDisplayed === 'string') ?\n (elementDisplayed as string) :\n (elementDisplayed.label as string));\n }));\n }\n\n /**\n * Gets the index of the card below a dragged-and-dropped card's new place.\n */\n private getSiblingIdx(value): number {\n let siblingIndex;\n if (value.sibling === null) {\n // Dragged to bottom of list\n siblingIndex = this.displayedConcepts.length;\n } else {\n const siblingId = value.sibling.getAttribute('data-index');\n siblingIndex = this.displayedConcepts.map(x => x.id).indexOf(siblingId);\n }\n return siblingIndex;\n }\n\n /**\n * Adds a new annotation box to the card panel.\n * @param id: The id of the card above the position of the new annotation box.\n */\n addTextbox(id?: string) {\n const index =\n id ? (this.displayedConcepts.map(x => x.id).indexOf(id) + 1) : 0;\n this.displayedConcepts.splice(index, 0, {id: uuid(), concept: 'textbox'});\n }\n\n /**\n * Adds a new custom timeline to the card panel.\n * @param id: The id of the card above the position of the new annotation box.\n */\n addCustomTimeline(id?: string) {\n const index =\n id ? (this.displayedConcepts.map(x => x.id).indexOf(id) + 1) : 0;\n this.displayedConcepts.splice(\n index, 0, {id: uuid(), concept: 'customTimeline'});\n }\n\n // Listen for an event indicating that the date range has been changed on the\n // UI, and update the date range.\n changeDateRange($event) {\n this.dateRange = $event;\n }\n\n // Saves a snapshot of the graph drawer HTML to the EHR using a FhirService.\n snapshot() {\n html2canvas(document.body).then((canvas) => {\n this.saveDialogRef = this.saveDialog.open(\n ConfirmSaveComponent, {data: canvas, height: '80%'});\n\n this.saveDialogRef.afterClosed().subscribe(result => {\n // Only save the snapshot to the EHR if the user confirmed the save.\n if (result) {\n const date = DateTime.fromJSDate(new Date()).toISO();\n this.fhirService.saveStaticNote(canvas, date).then(res => {\n if (res) {\n this.snackBar.open(\n this.uiConstants.SAVED_TO_POWERCHART,\n this.uiConstants.DISMISS, {\n duration: this.DISPLAY_TIME, // Wait 6 seconds before\n // dismissing the snack bar.\n });\n } else {\n this.snackBar.open(\n this.uiConstants.ERROR_SAVED_TO_POWERCHART,\n this.uiConstants.DISMISS, {\n duration: this.DISPLAY_TIME, // Wait 6 seconds before\n // dismissing the snack bar.\n });\n }\n });\n\n\n recordGoogleAnalyticsEvent(\n 'saveStaticSnapshot', 'save', new Date().toDateString());\n }\n });\n });\n }\n\n // Listen for an event indicating that a \"delete\" button has been clicked on a\n // card currently displayed, and update the displayed concepts\n // accordingly after asking for confirmation of deletion.\n removeDisplayedCard($event) {\n const index = this.displayedConcepts.map(x => x.id).indexOf($event.id);\n const concept = this.displayedConcepts[index];\n concept.value = $event.value;\n this.deleteDialogRef = this.deleteDialog.open(DeleteDialogComponent);\n this.deleteDialogRef.afterClosed().subscribe(result => {\n // The user wishes to delete the card.\n if (result) {\n this.displayedConcepts.splice(index, 1);\n this.recentlyRemoved = [index, concept];\n this.openSnackBar();\n if (this.eventsForCustomTimelines.get($event.id)) {\n // We only remove the event lines for this CustomTimeline if the user\n // confirms the deletion of the card.\n this.updateEventLines({id: $event.id});\n }\n }\n });\n }\n\n // Open a snack bar allowing for the user to potentially reverse the removal\n // of cards from the page. Only one snack bar can be opened at a time.\n private openSnackBar() {\n const message = this.uiConstants.CARD_REMOVED;\n const snackBarRef = this.snackBar.open(message, this.uiConstants.UNDO, {\n duration:\n this.DISPLAY_TIME, // Wait 6 seconds before dismissing the snack bar.\n });\n // Undo the most recent deletion according to what is stored in\n // recentlyRemoved.\n snackBarRef.onAction().subscribe(() => {\n const index = this.recentlyRemoved[0];\n this.displayedConcepts.splice(index, 0, this.recentlyRemoved[1]);\n if (this.displayedConcepts[index].concept === 'customTimeline') {\n this.updateEventLines({\n id: this.displayedConcepts[0].id,\n data: this.displayedConcepts[0].value\n });\n }\n recordGoogleAnalyticsEvent(\n 'undoDelete', 'deleteCard',\n Array.from(this.recentlyRemoved.values()).toString());\n });\n }\n\n /**\n * Listens for an event indicating that the user has selected to add the\n * concept card from the top toolbar. The card is added at the top of the\n * page, or, if the id of the closest card is specified, below the closest\n * card.\n * @param label The label of the new concept to add.\n * @param id The id of the card below which to add the new concept.\n */\n\n addConceptCard(label: string, id?: string) {\n this.originalConcepts.then((concepts) => {\n const graphCardValue = concepts.find(obj => (obj.label === label));\n // Insert the card at the top of the page\n // Insert after the closest card rather than before the card.\n const index =\n id ? (this.displayedConcepts.map(x => x.id).indexOf(id) + 1) : 0;\n this.displayedConcepts.splice(\n index, 0, {id: uuid(), concept: graphCardValue});\n });\n }\n\n /**\n * Listens for an event indicating that the user has edited the points on a\n * custom timeline, and updates the x-axis eventlines displayed on all other\n * charts.\n * @param $event The updated CustomizableData from which we calculate event\n * lines for each chart to display, along with the id of the updated.\n *\n */\n\n updateEventLines($event) {\n let times = [];\n if ($event.data) {\n times = Array.from($event.data.annotations.keys()).map(x => Number(x));\n }\n const eventlines = times.map(x => {\n return {\n value: x,\n text: $event.data.annotations.get(x).title,\n color: $event.data.annotations.get(x).color.hex()\n };\n });\n this.eventsForCustomTimelines.set($event.id, eventlines);\n\n // Consolidate all event lines from all custom timelines.\n let allEvents = [];\n for (const events of Array.from(this.eventsForCustomTimelines.values())) {\n allEvents = allEvents.concat(events);\n }\n this.eventlines = allEvents;\n }\n}\n","module.exports = \".mat-card {\\n cursor: -webkit-grab;\\n cursor: grab;\\n margin-top:0px;\\n margin-bottom:0px;\\n margin-left: 35px; /* Leave space for the \\\"add card\\\" button. */\\n padding-top: 0px;\\n padding-bottom: 0px;\\n padding-right: 20px;\\n padding-left: 0px;\\n transition: box-shadow .1s;\\n background-color: rgb(248, 248, 248);\\n flex-direction: row;\\n -ms-flex-direction: row; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n width: 100%;\\n max-width: 100%;\\n}\\n\\n::ng-deep .inEditMode .mat-card {\\n background-color: rgb(226, 226, 226) !important;\\n}\\n\\n.mat-card:hover {\\n background-color: rgb(240, 240, 240);\\n box-shadow: 0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);\\n}\\n\\n.colorbar {\\n margin-right: 6px;\\n min-width: 24px;\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 0 0 0%;\\n -ms-flex: 0 0 0%; /* For IE10 */\\n align-content: center;\\n -ms-flex-line-pack: center; /* Align content: center conversion for IE10 */\\n justify-content: center;\\n -ms-flex-pack: center; /* Justify content: center conversion for IE10 */\\n align-self: stretch;\\n -ms-flex-item-align: stretch; /* Align self: stretch conversion for IE10 */\\n}\\n\\n.mat-icon {\\n color: rgb(34, 44, 66);\\n cursor: pointer;\\n opacity: .3;\\n transition: opacity .3s;\\n}\\n\\n.removeCardButton {\\n opacity: 0;\\n}\\n\\n.mat-card:hover .mat-icon {\\n opacity: .8;\\n}\\n\\n.mat-card:hover .dragCardIcon.mat-icon {\\n opacity: .4;\\n}\\n\\n.dragCardIcon {\\n opacity: 0;\\n margin-bottom: 15px;\\n}\\n\\n.labelColumn {\\n padding: 3px;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 0 0 auto;\\n -ms-flex: 0 0 auto; /* For IE10 */\\n}\\n\\n.label {\\n width: 100%;\\n word-wrap: break-word;\\n flex: 1 1 auto;\\n -ms-flex: 1 1 auto; /* For IE10 */\\n font-family: 'Montserrat', sans-serif;\\n}\\n\\n::ng-deep .mat-input-element:disabled{\\n color: rgb(0,0,0, .7) !important;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2NhcmQvY2FyZC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0Usb0JBQVk7RUFBWixZQUFZO0VBQ1osY0FBYztFQUNkLGlCQUFpQjtFQUNqQixpQkFBaUIsRUFBRSwyQ0FBMkM7RUFDOUQsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsaUJBQWlCO0VBQ2pCLDBCQUEwQjtFQUMxQixvQ0FBb0M7RUFDcEMsbUJBQW1CO0VBQ25CLHVCQUF1QixFQUFFLGFBQWE7RUFDdEMsYUFBYTtFQUNiLG9CQUFvQixFQUFFLGFBQWE7RUFDbkMsWUFBWTtFQUNaLGdCQUFnQixFQUFFLGFBQWE7RUFDL0IsV0FBVztFQUNYLGVBQWU7QUFDakI7O0FBRUE7RUFDRSwrQ0FBK0M7QUFDakQ7O0FBRUE7RUFDRSxvQ0FBb0M7RUFDcEMsOERBQThEO0FBQ2hFOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGVBQWU7RUFDZiwyQkFBMkI7RUFDM0IsOEJBQThCO0VBQzlCLHNCQUFzQjtFQUN0QiwwQkFBMEIsRUFBRSxhQUFhO0VBQ3pDLGFBQWE7RUFDYixvQkFBb0IsRUFBRSxhQUFhO0VBQ25DLFlBQVk7RUFDWixnQkFBZ0IsRUFBRSxhQUFhO0VBQy9CLHFCQUFxQjtFQUNyQiwwQkFBMEIsRUFBRSw4Q0FBOEM7RUFDMUUsdUJBQXVCO0VBQ3ZCLHFCQUFxQixHQUFHLGdEQUFnRDtFQUN4RSxtQkFBbUI7RUFDbkIsNEJBQTRCLEdBQUcsNENBQTRDO0FBQzdFOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGVBQWU7RUFDZixXQUFXO0VBQ1gsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsVUFBVTtFQUNWLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixzQkFBc0I7RUFDdEIsMEJBQTBCLEVBQUUsYUFBYTtFQUN6QyxhQUFhO0VBQ2Isb0JBQW9CLEVBQUUsYUFBYTtFQUNuQyxjQUFjO0VBQ2Qsa0JBQWtCLEVBQUUsYUFBYTtBQUNuQzs7QUFFQTtFQUNFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsY0FBYztFQUNkLGtCQUFrQixFQUFFLGFBQWE7RUFDakMscUNBQXFDO0FBQ3ZDOztBQUVBO0VBQ0UsZ0NBQWdDO0FBQ2xDIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2NhcmQvY2FyZC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLm1hdC1jYXJkIHtcbiAgY3Vyc29yOiBncmFiO1xuICBtYXJnaW4tdG9wOjBweDtcbiAgbWFyZ2luLWJvdHRvbTowcHg7XG4gIG1hcmdpbi1sZWZ0OiAzNXB4OyAvKiBMZWF2ZSBzcGFjZSBmb3IgdGhlIFwiYWRkIGNhcmRcIiBidXR0b24uICovXG4gIHBhZGRpbmctdG9wOiAwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogMHB4O1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IC4xcztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0OCwgMjQ4LCAyNDgpO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdzsgLyogRm9yIElFMTAgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuOjpuZy1kZWVwIC5pbkVkaXRNb2RlIC5tYXQtY2FyZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KSAhaW1wb3J0YW50O1xufVxuXG4ubWF0LWNhcmQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7XG4gIGJveC1zaGFkb3c6IDAgMCA4cHggcmdiYSgwLDAsMCwuMTgpLDAgOHB4IDE2cHggcmdiYSgwLDAsMCwuMzYpO1xufVxuXG4uY29sb3JiYXIge1xuICBtYXJnaW4tcmlnaHQ6IDZweDtcbiAgbWluLXdpZHRoOiAyNHB4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IC8qIEZvciBJRTEwICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94OyAvKiBGb3IgSUUxMCAqL1xuICBmbGV4OiAwIDAgMCU7XG4gIC1tcy1mbGV4OiAwIDAgMCU7IC8qIEZvciBJRTEwICovXG4gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7IC8qIEFsaWduIGNvbnRlbnQ6IGNlbnRlciBjb252ZXJzaW9uIGZvciBJRTEwICovXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7ICAvKiBKdXN0aWZ5IGNvbnRlbnQ6IGNlbnRlciBjb252ZXJzaW9uIGZvciBJRTEwICovXG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gIC1tcy1mbGV4LWl0ZW0tYWxpZ246IHN0cmV0Y2g7ICAvKiBBbGlnbiBzZWxmOiBzdHJldGNoIGNvbnZlcnNpb24gZm9yIElFMTAgKi9cbn1cblxuLm1hdC1pY29uIHtcbiAgY29sb3I6IHJnYigzNCwgNDQsIDY2KTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBvcGFjaXR5OiAuMztcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3M7XG59XG5cbi5yZW1vdmVDYXJkQnV0dG9uIHtcbiAgb3BhY2l0eTogMDtcbn1cblxuLm1hdC1jYXJkOmhvdmVyIC5tYXQtaWNvbiB7XG4gIG9wYWNpdHk6IC44O1xufVxuXG4ubWF0LWNhcmQ6aG92ZXIgLmRyYWdDYXJkSWNvbi5tYXQtaWNvbiB7XG4gIG9wYWNpdHk6IC40O1xufVxuXG4uZHJhZ0NhcmRJY29uIHtcbiAgb3BhY2l0eTogMDtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLmxhYmVsQ29sdW1uIHtcbiAgcGFkZGluZzogM3B4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgLyogRm9yIElFMTAgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIGZsZXg6IDAgMCBhdXRvO1xuICAtbXMtZmxleDogMCAwIGF1dG87IC8qIEZvciBJRTEwICovXG59XG5cbi5sYWJlbCB7XG4gIHdpZHRoOiAxMDAlO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICAtbXMtZmxleDogMSAxIGF1dG87IC8qIEZvciBJRTEwICovXG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG59XG5cbjo6bmctZGVlcCAubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWR7XG4gIGNvbG9yOiByZ2IoMCwwLDAsIC43KSAhaW1wb3J0YW50O1xufVxuIl19 */\"","module.exports = \"\\n\\n
\\n clear\\n \\n \\n drag_handle\\n \\n \\n
\\n
\\n
\\n
{{label}}
\\n \\n \\n
\\n \\n \\n
\\n \\n edit\\n \\n save\\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, Input, Output} from '@angular/core';\nimport * as Color from 'color';\nimport * as Colors from 'src/app/theme/verily_colors';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * This is the base template for all the cards in this app. It will show a\n * colored bar on the left hand side with icons for actions, and then\n * optionally a label and legend, then the contents of the card.\n */\n@Component({\n selector: 'app-card',\n templateUrl: './card.component.html',\n styleUrls: ['./card.component.css']\n})\nexport class CardComponent {\n @Input() color: Color = Colors.BLUE_GREY_500;\n @Input() id: string;\n @Input() label: string;\n @Input() isEditable = false;\n @Input() isRemovable = true;\n\n @Output() renderEvent = new EventEmitter();\n @Output() removeEvent = new EventEmitter();\n @Output() editEvent = new EventEmitter();\n @Output() saveEvent = new EventEmitter();\n\n inEditMode = false;\n\n constructor(@Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n // The events below need to get propogated up to the card container.\n\n // Called when the user clicks the trashcan button on the card.\n remove() {\n this.removeEvent.emit(this.id);\n }\n\n // Called when the card resizes.\n resize($event) {\n this.renderEvent.emit($event);\n }\n\n // Called when the user clicks on the edit button.\n edit($event) {\n this.inEditMode = true;\n this.editEvent.emit($event);\n }\n\n // Called when the user hits the save button to exit out of edit mode.\n save($event) {\n this.inEditMode = false;\n this.saveEvent.emit($event);\n }\n}\n","module.exports = \"ngb-timepicker {\\n font-size: 1rem;\\n}\\n\\n::ng-deep fieldset {\\n min-width: 0;\\n padding: 0;\\n margin: 0;\\n border: 0;\\n}\\n\\n::ng-deep .ngb-tp {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-align: center;\\n align-items: center;\\n}\\n\\n::ng-deep .ngb-tp-hour, .ngb-tp-meridian, .ngb-tp-minute, .ngb-tp-second {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n -ms-flex-align: center;\\n align-items: center;\\n -ms-flex-pack: distribute;\\n justify-content: space-around;\\n}\\n\\n::ng-deep .ngb-tp-input-container {\\n width: 4em;\\n}\\n\\n::ng-deep .ngb-tp-spacer {\\n width: 50px !important;\\n text-align: center;\\n}\\n\\n::ng-deep .btn-link {\\n font-weight: 400;\\n color: #5E35B1;\\n background-color: transparent;\\n border-width: 1px;\\n cursor: pointer;\\n border-radius: 4px;\\n}\\n\\n::ng-deep .form-control {\\n display: block;\\n width: 100%;\\n padding: .375rem .75rem;\\n font-size: 1rem;\\n line-height: 1.5;\\n color: #495057;\\n background-color: #fff;\\n background-clip: padding-box;\\n border: 1px solid #ced4da;\\n border-radius: .25rem;\\n}\\n\\n::ng-deep .ngb-tp-input {\\n text-align: center;\\n width: inherit;\\n}\\n\\n::ng-deep .sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n overflow: hidden;\\n clip: rect(0,0,0,0);\\n white-space: nowrap;\\n -webkit-clip-path: inset(50%);\\n clip-path: inset(50%);\\n border: none;\\n}\\n\\n::ng-deep .mat-error {\\n font-size: 12px;\\n}\\n\\n.mockPlaceholder {\\n font-size: 12px;\\n color: grey;\\n margin-top: 18px;\\n}\\n\\n::ng-deep .dateInput {\\n width: 100px !important;\\n}\\n\\n::ng-deep ngb-datepicker {\\n z-index: 4;\\n background-color:white;\\n}\\n\\n::ng-deep .date {\\n display: inline-block;\\n vertical-align: middle;\\n}\\n\\n::ng-deep .time {\\n display: inline-block;\\n margin-left:30px;\\n vertical-align: middle;\\n}\\n\\n::ng-deep .date .mockPlaceholder {\\n margin-bottom: 20px;\\n}\\n\\n::ng-deep .date .dateInput {\\n margin-bottom: 20px;\\n}\\n\\n::ng-deep .mat-dialog-container {\\n max-height: 400px !important;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osVUFBVTtFQUNWLFNBQVM7RUFDVCxTQUFTO0FBQ1g7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QixtQkFBbUI7QUFDckI7O0FBQ0E7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQixzQkFBc0I7RUFDdEIsc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsNkJBQTZCO0VBQzdCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2Ysa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7RUFDWCx1QkFBdUI7RUFDdkIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2Qsc0JBQXNCO0VBQ3RCLDRCQUE0QjtFQUM1Qix5QkFBeUI7RUFDekIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsVUFBVTtFQUNWLFdBQVc7RUFDWCxVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsNkJBQTZCO0VBQzdCLHFCQUFxQjtFQUNyQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtFQUNmLFdBQVc7RUFDWCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxVQUFVO0VBQ1Ysc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIm5nYi10aW1lcGlja2VyIHtcbiAgZm9udC1zaXplOiAxcmVtO1xufVxuXG46Om5nLWRlZXAgZmllbGRzZXQge1xuICBtaW4td2lkdGg6IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cCB7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuOjpuZy1kZWVwIC5uZ2ItdHAtaG91ciwgLm5nYi10cC1tZXJpZGlhbiwgLm5nYi10cC1taW51dGUsIC5uZ2ItdHAtc2Vjb25kIHtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtaW5wdXQtY29udGFpbmVyIHtcbiAgd2lkdGg6IDRlbTtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtc3BhY2VyIHtcbiAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG46Om5nLWRlZXAgLmJ0bi1saW5rIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICM1RTM1QjE7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbjo6bmctZGVlcCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAuMzc1cmVtIC43NXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogIzQ5NTA1NztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NlZDRkYTtcbiAgYm9yZGVyLXJhZGl1czogLjI1cmVtO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cC1pbnB1dCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IGluaGVyaXQ7XG59XG5cbjo6bmctZGVlcCAuc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCg1MCUpO1xuICBjbGlwLXBhdGg6IGluc2V0KDUwJSk7XG4gIGJvcmRlcjogbm9uZTtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZXJyb3Ige1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5tb2NrUGxhY2Vob2xkZXIge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBncmV5O1xuICBtYXJnaW4tdG9wOiAxOHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGVJbnB1dCB7XG4gIHdpZHRoOiAxMDBweCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgbmdiLWRhdGVwaWNrZXIge1xuICB6LWluZGV4OiA0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO1xufVxuXG46Om5nLWRlZXAgLmRhdGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbjo6bmctZGVlcCAudGltZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6MzBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuOjpuZy1kZWVwIC5kYXRlIC5tb2NrUGxhY2Vob2xkZXIge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGUgLmRhdGVJbnB1dCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbjo6bmctZGVlcCAubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBtYXgtaGVpZ2h0OiA0MDBweCAhaW1wb3J0YW50O1xufSJdfQ== */\"","module.exports = \"
\\n
\\n
\\n
Date *
\\n \\n
Invalid date
\\n
\\n
\\n
Time *
\\n \\n \\n
Invalid time
\\n
\\n
\\n Caution: Date outside of current range\\n
\\n
\\n
\\n \\n \\n Please enter a title.\\n \\n \\n \\n \\n
\\n Flag color\\n \\n \\n \\n \\n \\n
\\n
\\n \\n \\n
\\n
\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {NgbDateAdapter, NgbDateNativeAdapter} from '@ng-bootstrap/ng-bootstrap';\nimport * as Color from 'color';\nimport {DateTime, Interval} from 'luxon';\n// tslint:disable-next-line:max-line-length\nimport {CustomizableGraphAnnotation} from 'src/app/graphs/graphtypes/customizable-graph/customizable-graph-annotation';\n// tslint:disable-next-line:max-line-length\nimport * as Colors from 'src/app/theme/verily_colors';\n\n/**\n * A Dialog with a textarea input, used to set the description of points on the\n * CustomizableTimeline.\n */\n@Component({\n selector: 'app-customizable-timeline-dialog',\n templateUrl: './customizable-timeline-dialog.component.html',\n styleUrls: ['./customizable-timeline-dialog.component.css'],\n providers: [{provide: NgbDateAdapter, useClass: NgbDateNativeAdapter}]\n})\nexport class CustomizableTimelineDialogComponent {\n // The text input for this dialog box.\n userTitle: string;\n\n // The list of suggested times to display with the autocomplete.\n listOfTimes = [];\n\n // The list of colors the user will be able to choose from.\n listOfColors = [\n Colors.DEEP_CORAL,\n Colors.DEEP_ORANGE,\n Colors.DEEP_TURQUOISE,\n Colors.DEEP_CYAN,\n Colors.DEEP_PURPLE_600,\n ];\n\n // The selected color in this dialog box.\n selectedColor: string;\n\n // The description input for this dialog box.\n userDescription: string;\n\n // The FormControl handling the time selection for this dialog box.\n timeFormControl: FormControl;\n\n // The date selected for this dialog box.\n date: Date;\n\n // The time selected for this dialog box.\n time: any;\n\n // The date range currently being viewed.\n dateRange: Interval;\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n this.date = new Date(data.date);\n const minutes = this.date.getMinutes();\n const hours = this.date.getHours();\n this.time = {hour: hours, minute: minutes};\n this.timeFormControl =\n new FormControl(this.time, (control: FormControl) => {\n const value = control.value;\n if (!value) {\n return null;\n }\n });\n // Set the default selected color as yellow if unset, or find the BCH Color\n // matching the selected color passed in.\n this.selectedColor = data.color ?\n this.listOfColors.find(c => c.hex() === data.color.hex()) :\n Colors.DEEP_CORAL;\n // Set the title if it is passed in.\n if (data.title) {\n this.userTitle = data.title;\n }\n // Set the description if it is passed in.\n if (data.description) {\n this.userDescription = data.description;\n }\n\n if (data.dateRange) {\n this.dateRange = Interval.fromDateTimes(\n this.data.dateRange.start.toLocal().startOf('day'),\n this.data.dateRange.end.toLocal().endOf('day'));\n }\n }\n\n // Closes the dialog popup without saving the user input.\n onCancel(): void {\n this.dialogRef.close();\n }\n\n // Closes the dialog popup and saves user input.\n onSave(): void {\n this.dialogRef.close(new CustomizableGraphAnnotation(\n DateTime.fromJSDate(this.getSelectedDate()),\n this.userTitle.trim(),\n this.userDescription,\n Color.rgb(this.selectedColor),\n ));\n }\n\n // Constructs a new Date based on user input.\n private getSelectedDate(): Date {\n const dateTime = new Date(this.date);\n if (!this.time || !this.timeFormControl.value) {\n return undefined;\n }\n // For date parsing to work in IE, we must remove all extraneous non-ASCII\n // characters added, and manually change the time.\n dateTime.setHours(this.time.hour, this.time.minute);\n return dateTime;\n }\n\n // Finds incomplete fields that are required and disables saving.\n findIncompleteFields() {\n return !this.userTitle ||\n (this.userTitle && this.userTitle.trim().length === 0) ||\n this.date === null || this.isInvalidDate() ||\n this.timeFormControl.hasError('required') ||\n this.timeFormControl.invalid;\n }\n\n // Returns whether the date input has an invalid date.\n isInvalidDate(): boolean {\n return isNaN(DateTime.fromJSDate(this.date).toMillis());\n }\n\n // Returns whether the date selected by the user falls outside the current\n // date range.\n dateNotInRange(): boolean {\n const dateTime = DateTime.fromJSDate(this.getSelectedDate());\n if (!this.dateRange) {\n return false;\n }\n return !(this.dateRange.contains(dateTime));\n }\n}\n","module.exports = \"::ng-deep [class*=\\\"timeline\\\"] .c3-xgrid-focus {\\n visibility: visible !important;\\n}\\n\\n::ng-deep .timeline .c3 {\\n cursor: default !important;\\n}\\n\\n::ng-deep .inEditMode .timeline .c3 {\\n cursor: pointer !important;\\n}\\n\\n/* Only display icons on flags in the CustomizableGraph if in edit mode. */\\n\\n::ng-deep app-customizable-graph.inEditMode .showIcon {\\n visibility: visible !important;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-custom\\\"] {\\n position: absolute;\\n display: block;\\n font-size: 11px;\\n border-style: solid;\\n padding: 3px;\\n border-width: 1px;\\n border-color: grey;\\n border-radius: 3px;\\n min-height: 25px;\\n width: 200px;\\n max-height: 100px;\\n background-color: white;\\n overflow: auto;\\n color: white;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-whole\\\"] {\\n position: absolute;\\n display: block;\\n min-height: 25px;\\n width: 0px;\\n max-height: 100px;\\n border-left-style: solid;\\n border-width: 1px;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-title-custom\\\"] {\\n margin: 0px;\\n font-size: small;\\n text-align: center;\\n max-width: 120px;\\n display: inline-block;\\n vertical-align: bottom;\\n min-width: 120px;\\n overflow: auto;\\n margin-top: 5px;\\n overflow-wrap: break-word;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-details-custom\\\"] {\\n display: none;\\n overflow: auto;\\n text-align: center;\\n overflow-wrap: break-word;\\n max-width: 120px;\\n}\\n\\n::ng-deep [id*=\\\"expand\\\"] {\\n visibility: hidden;\\n vertical-align: middle;\\n}\\n\\n::ng-deep [id*=\\\"delete\\\"] {\\n visibility: hidden;\\n vertical-align: middle;\\n}\\n\\n::ng-deep [id*=\\\"edit\\\"] {\\n visibility: hidden;\\n margin-top: 8px;\\n}\\n\\n.contents-block {\\n flex-direction: column;\\n -ms-flex-direction: column;\\n display: flex;\\n display: -ms-flexbox;\\n flex: 1 1 100%;\\n -ms-flex: 1 1 100%; /* For IE10 */\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLDhCQUE4QjtBQUNoQzs7QUFFQTtFQUNFLDBCQUEwQjtBQUM1Qjs7QUFFQTtFQUNFLDBCQUEwQjtBQUM1Qjs7QUFFQSwwRUFBMEU7O0FBQzFFO0VBQ0UsOEJBQThCO0FBQ2hDOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7RUFDZCxlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQix1QkFBdUI7RUFDdkIsY0FBYztFQUNkLFlBQVk7QUFDZDs7QUFHQTtFQUNFLGtCQUFrQjtFQUNsQixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVixpQkFBaUI7RUFDakIsd0JBQXdCO0VBQ3hCLGlCQUFpQjtBQUNuQjs7QUFHQTtFQUNFLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixxQkFBcUI7RUFDckIsc0JBQXNCO0VBQ3RCLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsZUFBZTtFQUNmLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLGFBQWE7RUFDYixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLHlCQUF5QjtFQUN6QixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLHNCQUFzQjtBQUN4Qjs7QUFDQTtFQUNFLGtCQUFrQjtFQUNsQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLDBCQUEwQjtFQUMxQixhQUFhO0VBQ2Isb0JBQW9CO0VBQ3BCLGNBQWM7RUFDZCxrQkFBa0IsRUFBRSxhQUFhO0FBQ25DIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjo6bmctZGVlcCBbY2xhc3MqPVwidGltZWxpbmVcIl0gLmMzLXhncmlkLWZvY3VzIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgLnRpbWVsaW5lIC5jMyB7XG4gIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgLmluRWRpdE1vZGUgLnRpbWVsaW5lIC5jMyB7XG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xufVxuXG4vKiBPbmx5IGRpc3BsYXkgaWNvbnMgb24gZmxhZ3MgaW4gdGhlIEN1c3RvbWl6YWJsZUdyYXBoIGlmIGluIGVkaXQgbW9kZS4gKi9cbjo6bmctZGVlcCBhcHAtY3VzdG9taXphYmxlLWdyYXBoLmluRWRpdE1vZGUgLnNob3dJY29uIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgW2NsYXNzKj1cInRvb2x0aXAtY3VzdG9tXCJdIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiAxMXB4O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBwYWRkaW5nOiAzcHg7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IGdyZXk7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgbWluLWhlaWdodDogMjVweDtcbiAgd2lkdGg6IDIwMHB4O1xuICBtYXgtaGVpZ2h0OiAxMDBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBjb2xvcjogd2hpdGU7XG59XG5cblxuOjpuZy1kZWVwIFtjbGFzcyo9XCJ0b29sdGlwLXdob2xlXCJdIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWluLWhlaWdodDogMjVweDtcbiAgd2lkdGg6IDBweDtcbiAgbWF4LWhlaWdodDogMTAwcHg7XG4gIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XG5cblxuOjpuZy1kZWVwIFtjbGFzcyo9XCJ0b29sdGlwLXRpdGxlLWN1c3RvbVwiXSB7XG4gIG1hcmdpbjogMHB4O1xuICBmb250LXNpemU6IHNtYWxsO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1heC13aWR0aDogMTIwcHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgbWluLXdpZHRoOiAxMjBweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbn1cblxuOjpuZy1kZWVwIFtjbGFzcyo9XCJ0b29sdGlwLWRldGFpbHMtY3VzdG9tXCJdIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbiAgbWF4LXdpZHRoOiAxMjBweDtcbn1cblxuOjpuZy1kZWVwIFtpZCo9XCJleHBhbmRcIl0ge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbjo6bmctZGVlcCBbaWQqPVwiZGVsZXRlXCJdIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuOjpuZy1kZWVwIFtpZCo9XCJlZGl0XCJdIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5jb250ZW50cy1ibG9jayB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBkaXNwbGF5OiBmbGV4O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZmxleDogMSAxIDEwMCU7XG4gIC1tcy1mbGV4OiAxIDEgMTAwJTsgLyogRm9yIElFMTAgKi9cbn1cbiJdfQ== */\"","module.exports = \"\\n \\n
\\n {{this.uiConstants.CUSTOM_TIMELINE_INSTRUCTIONS}}\\n
\\n
\\n
\\n \\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// tslint:disable-next-line:max-line-length\nimport {Component, EventEmitter, Inject, Input, OnChanges, Output, SimpleChanges, ViewChild} from '@angular/core';\nimport {Interval} from 'luxon';\nimport {FhirService} from 'src/app/fhir-server/fhir.service';\nimport {CustomizableData} from 'src/app/graphs/graphdatatypes/customizabledata';\nimport {GraphData} from 'src/app/graphs/graphdatatypes/graphdata';\nimport {GraphComponent} from 'src/app/graphs/graphtypes/graph/graph.component';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * The customizable timeline lets the user plot any events they'd like to keep\n * track of as little flags along a timeline.\n */\n@Component({\n selector: 'app-customizable-timeline',\n templateUrl: './customizable-timeline.component.html',\n styleUrls: ['./customizable-timeline.component.css']\n})\nexport class CustomizableTimelineComponent implements OnChanges {\n // The GraphComponent this card holds.\n @ViewChild(GraphComponent) containedGraph!: GraphComponent;\n\n // The unique ID for this displayed card.\n @Input() id: string;\n\n /**\n * The x-axis for this card.\n */\n @Input() dateRange: Interval;\n // Data stored before deletion of the card. This is separate from this.data\n // to avoid unnecessary re-rendering of the graph.\n @Input() deletedData: any;\n\n // An event indicating that the event lines displayed on all other charts need\n // to be updated.\n @Output()\n updateEventLines =\n new EventEmitter<{[key: string]: string | CustomizableData}>();\n\n /** Propogate remove events up to the card container. */\n @Output() removeEvent = new EventEmitter();\n\n // The data for the graph contained.\n data: CustomizableData;\n\n // Whether or not this CustomizableTimeline is being edited.\n inEditMode = false;\n\n constructor(\n private fhirService: FhirService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n this.data = CustomizableData.defaultEmptySeries();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.deletedData && changes.deletedData.currentValue) {\n this.data = this.deletedData;\n this.containedGraph.data = this.data;\n }\n }\n\n // Listens for an event indicating that the points on the CustomizableGraph\n // have been changed, and emits an event with the modified eventlines\n // displayed on all other charts.\n pointsChanged($event) {\n this.updateEventLines.emit({data: this.data, id: this.id});\n }\n\n // Called when the user clicks the trashcan button on the card.\n remove() {\n this.removeEvent.emit({id: this.id, value: this.data});\n recordGoogleAnalyticsEvent(\n 'deleteCustomTimeline', 'deleteCard', new Date().toDateString());\n }\n}\n","module.exports = \".legend {\\n cursor: pointer;\\n}\\n\\n/* This is the color swatch for the legends.*/\\n\\n.legend span {\\n border-style: solid !important;\\n height: 7px;\\n margin: 3px;\\n vertical-align: center;\\n width: 7px;\\n}\\n\\n/* This is a specific style for MultiGraphCard. */\\n\\n.contents-block {\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\n.axis {\\n flex: 0 0 auto;\\n -ms-flex: 0 0 auto; /* For IE10 */\\n}\\n\\n.mat-body {\\n font-family: 'Work Sans', sans-serif;\\n font-size: 14px;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2xlZ2VuZHN0eWxlcy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBLDZDQUE2Qzs7QUFDN0M7RUFDRSw4QkFBOEI7RUFDOUIsV0FBVztFQUNYLFdBQVc7RUFDWCxzQkFBc0I7RUFDdEIsVUFBVTtBQUNaOztBQUVBLGlEQUFpRDs7QUFDakQ7RUFDRSxzQkFBc0I7RUFDdEIsMEJBQTBCLEVBQUUsYUFBYTtFQUN6QyxhQUFhO0VBQ2Isb0JBQW9CLEVBQUUsYUFBYTtFQUNuQyxZQUFZO0VBQ1osZ0JBQWdCLEVBQUUsYUFBYTtBQUNqQzs7QUFFQTtFQUNFLGNBQWM7RUFDZCxrQkFBa0IsRUFBRSxhQUFhO0FBQ25DOztBQUVBO0VBQ0Usb0NBQW9DO0VBQ3BDLGVBQWU7QUFDakIiLCJmaWxlIjoic3JjL2FwcC9jYXJkdHlwZXMvbGVnZW5kc3R5bGVzLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5sZWdlbmQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIFRoaXMgaXMgdGhlIGNvbG9yIHN3YXRjaCBmb3IgdGhlIGxlZ2VuZHMuKi9cbi5sZWdlbmQgc3BhbiB7XG4gIGJvcmRlci1zdHlsZTogc29saWQgIWltcG9ydGFudDtcbiAgaGVpZ2h0OiA3cHg7XG4gIG1hcmdpbjogM3B4O1xuICB2ZXJ0aWNhbC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogN3B4O1xufVxuXG4vKiBUaGlzIGlzIGEgc3BlY2lmaWMgc3R5bGUgZm9yIE11bHRpR3JhcGhDYXJkLiAqL1xuLmNvbnRlbnRzLWJsb2NrIHtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IC8qIEZvciBJRTEwICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94OyAvKiBGb3IgSUUxMCAqL1xuICBmbGV4OiAxIDEgMCU7XG4gIC1tcy1mbGV4OiAxIDEgMCU7IC8qIEZvciBJRTEwICovXG59XG5cbi5heGlzIHtcbiAgZmxleDogMCAwIGF1dG87XG4gIC1tcy1mbGV4OiAwIDAgYXV0bzsgLyogRm9yIElFMTAgKi9cbn1cblxuLm1hdC1ib2R5IHtcbiAgZm9udC1mYW1pbHk6ICdXb3JrIFNhbnMnLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG59Il19 */\"","module.exports = \"\\n.card-error {\\n white-space: pre-wrap;\\n word-break: break-all;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL211bHRpZ3JhcGhjYXJkL211bHRpZ3JhcGhjYXJkLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLHFCQUFxQjtBQUN2QiIsImZpbGUiOiJzcmMvYXBwL2NhcmR0eXBlcy9tdWx0aWdyYXBoY2FyZC9tdWx0aWdyYXBoY2FyZC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiXG4uY2FyZC1lcnJvciB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuIl19 */\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// tslint:disable-next-line:max-line-length\nimport {Component, EventEmitter, Input, OnChanges, OnInit, Output, QueryList, SimpleChanges, ViewChildren} from '@angular/core';\nimport * as Color from 'color';\nimport {DateTime, Interval} from 'luxon';\nimport {GraphData} from 'src/app/graphs/graphdatatypes/graphdata';\nimport {LabeledSeries} from 'src/app/graphs/graphdatatypes/labeled-series';\nimport {AxisGroup} from 'src/app/graphs/graphtypes/axis-group';\nimport {LegendInfo} from 'src/app/graphs/graphtypes/legend-info';\nimport {recordGoogleAnalyticsEvent} from 'src/constants';\n\nimport {ChartType, GraphComponent} from '../../graphs/graphtypes/graph/graph.component';\nimport {LineGraphComponent} from '../../graphs/graphtypes/linegraph/linegraph.component';\nimport * as Colors from '../../theme/verily_colors';\n\n/**\n * This card holds a label, one or more graphs on one or more axes, and a\n * dragger handle.\n */\n@Component({\n selector: 'app-multigraphcard',\n styleUrls: ['../legendstyles.css', './multigraphcard.component.css'],\n templateUrl: './multigraphcard.html',\n})\nexport class MultiGraphCardComponent implements OnChanges, OnInit {\n /** The GraphComponents this card holds. */\n @ViewChildren(GraphComponent)\n containedGraphs!: QueryList>;\n\n @Input() id: string;\n\n /**\n * The date range to use for graphs in this card\n */\n @Input() dateRange: Interval;\n\n /**\n * The AxisGroup displayed on this card.\n */\n @Input() axisGroup: AxisGroup;\n\n /**\n * The format of each object in the array is an object representing a line\n * drawn on the chart, that has a value, text, and class field. The value\n * field represents the x-position of the line to be drawn, while the class\n * represents the class name, and the text represents the text displayed near\n * the line.\n */\n @Input() eventlines: Array<{[key: string]: number | string}>;\n\n /** The x-regions to draw for this graph. */\n xRegions: Array<[DateTime, DateTime]>;\n\n /** Propogate remove events up to the card container. */\n @Output() removeEvent = new EventEmitter();\n\n /**\n * The label for this graphcard.\n */\n label: string;\n\n /**\n * The units text for this card. Blank if the axes have more than one unit.\n */\n unitsLabel = '';\n\n /** Holds the color corresponding to this card. */\n color: Color = Colors.BLUE_GREY_500; // Default color for a card component.\n\n /** Hold an instance of this enum so the HTML template can reference it. */\n ChartType: typeof ChartType = ChartType;\n\n /**\n * Maps legend categories to the corresponding series so that when you hover\n * over a legend category, it can highlight all the corresponding series.\n */\n readonly legendToSeries = new Map();\n\n /**\n * Sets up the class variables that are dependent on the @Input parameter to\n * this component, resourceCodeGroups.\n * @throws An Error if ResourceCodeGroups is undefined or contains mixed\n * clinical concepts.\n */\n ngOnInit() {\n if (!this.axisGroup) {\n throw Error(\n 'All MultiGraphCardComponents are expected to have an AxisGroup ' +\n ' as the data source, but none provided for card id ' + this.id);\n }\n this.label = this.axisGroup.label;\n this.color = this.axisGroup.displayGroup.fill;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const dateRange = changes.dateRange;\n if (dateRange && dateRange.previousValue !== dateRange.currentValue) {\n this.loadNewData();\n }\n }\n\n private addSeriesToLegendMap(series: LabeledSeries) {\n // We do not want to add the normalBound series to the legend\n if (series.legendInfo.label ===\n LineGraphComponent.NORMAL_BOUND_SERIES_NAME) {\n return;\n }\n if (!this.legendToSeries.has(series.legendInfo)) {\n this.legendToSeries.set(series.legendInfo, []);\n }\n const added: LabeledSeries[] = this.legendToSeries.get(series.legendInfo);\n added.push(series);\n\n this.legendToSeries.set(series.legendInfo, added);\n }\n\n private loadNewData() {\n Promise\n .all(this.axisGroup.axes.map(\n axis => axis.updateDateRange(this.dateRange)))\n .then(axisData => {\n this.getLabelText().then(lblText => {\n this.unitsLabel = lblText;\n });\n\n // Gather a list of all the unique legends and series displayed.\n this.legendToSeries.clear();\n for (const data of axisData) {\n for (const series of data.series) {\n this.addSeriesToLegendMap(series);\n }\n }\n\n // Kick off the promise to get all the x-regions. It will update\n // the class variable and then everything bound to it will update,\n // too.\n this.getAllXRegions();\n });\n }\n\n /**\n * Gets the label text for this card. If the axes have all matching units,\n * it returns the units; otherwise it returns a blank string.\n */\n private getLabelText(): Promise {\n return Promise\n .all(this.axisGroup.axes.map(\n axis => axis.updateDateRange(this.dateRange)))\n .then(dataArray => dataArray.map(data => data.series))\n .then(seriesNestedArray => {\n const flattened: LabeledSeries[] = [].concat(...seriesNestedArray);\n return flattened.map(series => series.unit)\n .filter(v => v !== undefined);\n })\n .then(allUnits => {\n const units = new Set(allUnits);\n if (units.size === 1 && allUnits[0] !== undefined) {\n return ' (' + allUnits[0] + ')';\n } else {\n this.updateAxisLabels();\n return '';\n }\n });\n }\n\n /**\n * Gets all the X regions for the axes contained in this group.\n */\n private getAllXRegions() {\n return Promise.all(this.axisGroup.axes.map(axis => axis.getXRegions()))\n .then(nestedXRegions => {\n this.xRegions = [].concat(...nestedXRegions);\n });\n }\n\n /**\n * If the axes on this card have different units, make sure that each\n * axis displays its units on the y-axis, for clarity.\n */\n private updateAxisLabels() {\n for (const axis of this.axisGroup.axes) {\n axis.updateDateRange(this.dateRange).then(axisData => {\n if (axisData && axis.label && axisData.series &&\n axisData.series.length > 0 && axisData.series[0].unit) {\n const units = ' (' + axisData.series[0].unit + ')';\n // Only add units if not done so already.\n if (axis.label.indexOf(units) === -1) {\n axis.label += units;\n }\n }\n });\n }\n }\n\n /**\n * Returns true if any of the LabeledSeries passed in has a datapoint\n * in the time range.\n * This is just a convenience function because this can't be evaluated\n * directly in the Angular template.\n */\n hasData(labeledSeries: LabeledSeries[]) {\n return labeledSeries.map(s => s.hasPointInRange(this.dateRange))\n .some(s => s === true);\n }\n\n /**\n * Highlights the listed series in any graph they appear in for this card.\n */\n focusOnSeries(labeledSeries: LabeledSeries[]) {\n this.containedGraphs.forEach(graph => {\n graph.focusOnSeries(labeledSeries);\n });\n }\n\n /**\n * Removes highlight from any series on this card.\n */\n resetChart() {\n this.containedGraphs.forEach(graph => {\n graph.resetChart();\n });\n }\n\n // The events below need to get propogated up to the card container.\n\n /**\n * Called when the user clicks the trashcan button on the card.\n */\n remove() {\n // We do not add a 'value' field because there is no internal value that\n // needs to be restored when the user reverts a deletion.\n this.removeEvent.emit({id: this.id});\n recordGoogleAnalyticsEvent('deleteConcept', 'deleteCard', this.label);\n }\n}\n","module.exports = \"\\n 1\\\" class=\\\"legends-block\\\">\\n \\n
\\n \\n \\n
{{series.key.label}}
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n errorError loading data for: {{axis.label}}\\n Technical details:
{{axis.errorMessage}}\\n
\\n \\n 1 ? axis.label : ''\\\" [showTicks]=\\\"axis.showTicks\\\">\\n 1 ? axis.label : ''\\\" [showTicks]=\\\"axis.showTicks\\\">\\n 1 ? axis.label : ''\\\">\\n \\n 1 ? axis.label : ''\\\">\\n \\n 1 ? axis.label : ''\\\">\\n \\n \\n
\\n
\\n
\"","module.exports = \"\\n \\n \\n \\n {{getHintText()}} \\n \\n \\n\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, ElementRef, EventEmitter, Inject, Input, Output, ViewChild} from '@angular/core';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * A Material Card that displays a label, a textbox, and a draggable handle\n * in a row.\n */\n@Component({\n selector: 'app-textboxcard',\n templateUrl: './textboxcard.component.html',\n})\nexport class TextboxcardComponent {\n @ViewChild('textArea') textAreaElement: ElementRef;\n @Input() id: string;\n\n /** Propogate remove events up to the card container. */\n @Output() removeEvent = new EventEmitter();\n\n // Holds the text typed in the input field of the textbox.\n @Input() noteString: string;\n\n inEditMode = false;\n\n\n constructor(@Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n updateValue() {\n this.textAreaElement.nativeElement.innerHTML = this.noteString;\n }\n\n // The events below need to get propogated up to the card container.\n\n // Called when the user clicks the trashcan button on the card.\n remove() {\n // We pass a 'value' field with the contents of the textbox so that, in case\n // of restoration of a deleted textbox, the previous value can be displayed.\n this.removeEvent.emit({id: this.id, value: this.noteString});\n\n recordGoogleAnalyticsEvent(\n 'deleteTextbox', 'deleteCard', new Date().toDateString());\n }\n\n edit() {\n this.inEditMode = true;\n }\n\n save() {\n this.inEditMode = false;\n }\n\n getHintText() {\n if (this.inEditMode) {\n return this.uiConstants.SAVE_TEXT_HINT;\n } else {\n return this.uiConstants.EDIT_TEXT_HINT;\n }\n }\n}\n","import {Interval} from 'luxon';\n\nimport {AnnotatedObservation} from '../fhir-resources/annotated/annotated-observation';\nimport {AnnotatedMedicationOrder} from '../fhir-resources/medication-order';\nimport {Observation} from '../fhir-resources/observation';\nimport {LOINCCodeGroup} from './resource-codes/loinc-code';\nimport {RxNormCodeGroup} from './resource-codes/rx-norm-group';\n\n/**\n * Returns the function to annotate a Blood Pressure Resource group with\n * a Blood Pressure Location.\n *\n * @param The LOINCCodeGroup for the 'Blood Pressure Details' group\n */\nfunction getBloodPressureAnnotationFunction(\n bpDetailsResourceGroup: LOINCCodeGroup) {\n return (observation: Observation,\n dateRange: Interval): Promise => {\n return bpDetailsResourceGroup.getResourceSet(dateRange).then(obsSet => {\n return AnnotatedObservation.forBloodPressure(\n observation,\n // We only pass in the first ObservationSet, since we\n // know there is only one code whose observations we\n // care about.\n obsSet[0]);\n });\n };\n}\n\n/**\n * Returns the function to annotate a Medication Monitoring Resource group with\n * Medication Administration information.\n *\n * @param The RxNormCode for the Medication Resource group\n */\nfunction getMedicationMonitoringAnnotationFunction(\n rxNormGroup: RxNormCodeGroup) {\n return (observation: Observation,\n dateRange: Interval): Promise => {\n return rxNormGroup.getResourceSet(dateRange).then(rxNorms => {\n const medOrders: AnnotatedMedicationOrder[] = [].concat.apply(\n [], rxNorms.map(rxNorm => rxNorm.orders.resourceList));\n return AnnotatedObservation.forMedicationMonitoring(\n observation, medOrders);\n });\n };\n}\n\n/**\n * List of Configurations for Resource Groups that should have a makeAnnotated\n * function set.\n *\n * Each element in the list should be a JSON object with the following\n * properties:\n * - groupName: should be the name of the ResourceCodeGroup that should have\n * its makeAnnotated attribute set.\n * - makeAnnotatedFunction: a function that takes a reference\n * ResourceCodeGroup and returns a function that should be assigned to the\n * makeAnnotated attribute.\n * - refGroup: the name of the ResourceCodeGroup that needs to be referenced\n * in order to create the makeAnnotated attribute function.\n *\n */\nexport const ANNOTATION_CONFIGURATION = [\n {\n 'groupName': 'Blood Pressure',\n 'makeAnnotatedFunction': (refGroup) =>\n getBloodPressureAnnotationFunction(refGroup),\n 'refGroup': 'Blood Pressure Details'\n },\n {\n 'groupName': 'Vancomycin',\n 'makeAnnotatedFunction': (refGroup) =>\n getMedicationMonitoringAnnotationFunction(refGroup),\n 'refGroup': 'Vancomycin Monitoring Reference'\n },\n {\n 'groupName': 'Gentamicin',\n 'makeAnnotatedFunction': (refGroup) =>\n getMedicationMonitoringAnnotationFunction(refGroup),\n 'refGroup': 'Gentamicin Monitoring Reference'\n }\n];\n","import {antibiotics, antifungals, antivirals, labResult, microbio, radiology, vitalSign} from './resource-codes/display-grouping';\n\n/**\n * Holds information for where the JSON files defining groupings and individual\n * clinical concepts are.\n */\nexport class ConceptFileConfiguration {\n /**\n * Map from DisplayGrouping to a tuple of file names that describe the groups\n * and concepts that belong to that grouping.\n * First file is the Group json file. Second file is the Concept json file.\n * These files should be located within the directory of the assetPath.\n */\n readonly fileMap;\n\n /**\n * The path to where all these files can be found.\n */\n readonly assetPath;\n\n constructor(\n private conceptsFolder = 'clinical_concept_configuration',\n\n vitalGroupFile = 'vital_sign_groups.json',\n vitalConceptsFile = 'vital_signs.json',\n\n labConceptsFile = 'lab_results.json', labGroupFile = 'lab_groups.json',\n\n radiologyConceptsFile = 'radiology_results.json',\n radiologyGroupFile = 'radiology_groups.json',\n\n antibioticConceptsFile = 'medications_antibiotics.json',\n antibioticGroupFile = 'medication_groups_antibiotics.json',\n\n antiviralConceptsFile = 'medications_antivirals.json',\n antiviralGroupFile = 'medication_groups_antivirals.json',\n\n antifungalConceptsFile = 'medications_antifungals.json',\n antifungalGroupFile = 'medication_groups_antifungals.json',\n\n microbioGroupFile = 'microbio_groups.json',\n microbioConceptsFile = 'microbio_results.json') {\n this.fileMap = new Map([\n [vitalSign, [vitalGroupFile, vitalConceptsFile]],\n [labResult, [labGroupFile, labConceptsFile]],\n [radiology, [radiologyGroupFile, radiologyConceptsFile]],\n [antibiotics, [antibioticGroupFile, antibioticConceptsFile]],\n [antivirals, [antiviralGroupFile, antiviralConceptsFile]],\n [antifungals, [antifungalGroupFile, antifungalConceptsFile]],\n [microbio, [microbioGroupFile, microbioConceptsFile]]\n ]);\n\n this.assetPath = './assets/' + this.conceptsFolder;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nimport {HttpClient} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\n\nimport {ChartType} from '../graphs/graphtypes/graph/graph.component';\n\nimport {ConceptFileConfiguration} from './concept-file-configuration';\nimport {BCHMicrobioCode} from './resource-codes/bch-microbio-code';\nimport {DiagnosticReportCode} from './resource-codes/diagnostic-report-code';\nimport {antibiotics, antifungals, antivirals, DisplayGrouping, microbio, radiology} from './resource-codes/display-grouping';\nimport {LOINCCode} from './resource-codes/loinc-code';\nimport {ResourceCode} from './resource-codes/resource-code-group';\nimport {RxNormCode} from './resource-codes/rx-norm';\n\n\n/**\n * Holds basic configuration information for clinical concept groups.\n */\nexport class GroupConfiguration {\n constructor(\n readonly groupName: string, readonly chartType: ChartType,\n readonly showOnSameAxis: boolean,\n readonly displayGrouping: DisplayGrouping,\n readonly parentGroupName?: string) {}\n}\n\n/**\n * Responsible for reading in the configuration files defined in this\n * environment and parsing them into clinical concepts and their\n * corresponding groups.\n */\n@Injectable()\nexport class ResourceCodeCreator {\n constructor(\n private http: HttpClient,\n private conceptFileConfiguration: ConceptFileConfiguration) {}\n\n private static stringToChartType = {\n 'SCATTER': ChartType.SCATTER,\n 'STEP': ChartType.STEP,\n 'MICROBIO': ChartType.MICROBIO,\n 'DIAGNOSTIC': ChartType.DIAGNOSTIC,\n 'LINE': ChartType.LINE\n };\n\n\n private loadJsonForAllGroups: Promise> =\n Promise.all(\n Array.from(this.conceptFileConfiguration.fileMap).map((entry) => {\n const displayGroup: DisplayGrouping = entry[0];\n const groupFile: string = entry[1][0];\n\n return this.http\n .get(this.conceptFileConfiguration.assetPath + '/' + groupFile)\n .toPromise()\n .then(groups => {\n // Without explicit typing here, the TS compiler complains.\n const returned: [DisplayGrouping, any] =\n [displayGroup, groups];\n return returned;\n });\n }));\n\n private loadJsonForAllConcepts: Promise> =\n Promise.all(\n Array.from(this.conceptFileConfiguration.fileMap).map((entry) => {\n const displayGroup: DisplayGrouping = entry[0];\n const conceptsFile: string = entry[1][1];\n\n return this.http\n .get(\n this.conceptFileConfiguration.assetPath + '/' +\n conceptsFile)\n .toPromise()\n .then(clinicalConcepts => {\n // Without explicit typing here, the TS compiler complains.\n const returned: [DisplayGrouping, any] =\n [displayGroup, clinicalConcepts];\n return returned;\n });\n }));\n\n /**\n * Loads in configuration for all the display groupings, including the\n * grouping name, the chart type for the grouping, whether it's displayed\n * by default\n */\n loadAllGroups: Promise> =\n this.loadJsonForAllGroups\n .then((groupsList) => {\n return groupsList.map(\n group => this.createGroupConfigurations(group[0], group[1]));\n })\n // Return one flattened map for all the display groups regardless of\n // their file source.\n .then(\n (allMaps) =>\n new Map(allMaps.map((m) => Array.from(m))\n .reduce((acc, val) => [...acc, ...val])));\n\n\n\n loadAllConcepts: Promise> =\n this.loadAllGroups.then((groupMap: Map) => {\n return this.loadJsonForAllConcepts\n .then((conceptsList) => {\n return conceptsList.map(\n concept => this.createConcepts(concept[0], concept[1]));\n })\n .then((conceptsFromFile: Array>) => {\n // Reduce into one flattened map, allowing for mixing across\n // concept groups.\n const allConceptsMap = new Map();\n for (const mapEntry of conceptsFromFile) {\n for (const entry of Array.from(mapEntry.entries())) {\n const group = entry[0];\n let resourceCodes = entry[1];\n\n if (allConceptsMap.has(group)) {\n resourceCodes =\n resourceCodes.concat(allConceptsMap.get(group));\n }\n allConceptsMap.set(group, resourceCodes);\n }\n }\n\n // Match up the display groupings to their corresponding\n // group configurations.\n const groupConfigurationToResourceCodes =\n new Map();\n allConceptsMap.forEach(\n (concepts: ResourceCode[], groupName: string) => {\n let groupConfiguration = groupMap.get(groupName);\n // If there's no group configured for a clinical concept\n // list, and the configuration was validated before running,\n // we know that there is only one clinical concept in this\n // group and that the group should be configured according\n // to its attributes.\n if (!groupConfiguration) {\n groupConfiguration = new GroupConfiguration(\n groupName, ChartType.LINE, true,\n concepts[0].displayGrouping);\n }\n\n groupConfigurationToResourceCodes.set(\n groupConfiguration, concepts);\n });\n return groupConfigurationToResourceCodes;\n });\n });\n\n /**\n * Creates a ResourceCode. The type of ResourceCode is determined by the\n * passed in displayGrouping.\n *\n * @param displayGrouping DisplayGrouping for the ResourceCode\n * @param concept\n */\n private createResourceCode(displayGrouping: DisplayGrouping, concept: any) {\n const showByDefault = concept.showByDefault ? concept.showByDefault : false;\n const displayBounds: [number, number] = concept.displayBounds ?\n [concept.displayBounds.lower, concept.displayBounds.upper] :\n undefined;\n const forceDisplayBounds =\n concept.forceDisplayBounds ? concept.forceDisplayBounds : false;\n\n if (displayGrouping === radiology) {\n return new DiagnosticReportCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n } else if (displayGrouping === microbio) {\n return new BCHMicrobioCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n } else if ([antibiotics, antifungals, antivirals].includes(\n displayGrouping)) {\n return new RxNormCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n } else {\n return new LOINCCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n }\n }\n\n /**\n * Reads in a JSON file and creates clinical concepts for each listed\n * configuration. Returns a map of listed display groupings to their\n * corresponding clinical concepts.\n */\n private createConcepts(displayGrouping: DisplayGrouping, json: any):\n Map {\n const groupToConcept = new Map();\n\n for (const concept of json) {\n const code = this.createResourceCode(displayGrouping, concept);\n // Concepts with innerComponentOnly=true are \"components\" of other\n // concepts. (See\n // http://hl7.org/fhir/DSTU2/observation-definitions.html#Observation.component\n // for more information.) In order for us to display these inner\n // components, the Resource Code needs to be created, but we do not\n // explicitly add them to a Resource Group.\n if (concept.innerComponentOnly) {\n continue;\n }\n // If the concept has no higher level grouping, then use its display\n // name as the proxy for its grouping.\n if (!concept.groupNames) {\n concept.groupNames = [concept.displayName];\n }\n\n for (const groupName of concept.groupNames) {\n const concepts = groupToConcept.get(groupName) || [];\n concepts.push(code);\n groupToConcept.set(groupName, concepts);\n }\n }\n return groupToConcept;\n }\n\n /**\n * Reads in a JSON file for display group configurations and maps\n * display group names to simple chart configuration attributes.\n */\n private createGroupConfigurations(\n displayGrouping: DisplayGrouping,\n json: any): Map {\n return json.map(\n group =>\n [group.groupName,\n new GroupConfiguration(\n group.groupName,\n ResourceCodeCreator.stringToChartType[group.graphType],\n group.displayGroupOnSameAxis, displayGrouping,\n group.parentGroupName)]);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\n\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {Axis} from '../graphs/graphtypes/axis';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ChartType} from '../graphs/graphtypes/graph/graph.component';\n\nimport {ANNOTATION_CONFIGURATION} from './annotation-mapping';\nimport {GroupConfiguration, ResourceCodeCreator} from './resource-code-creator';\nimport {BCHMicrobioCode, BCHMicrobioCodeGroup} from './resource-codes/bch-microbio-code';\nimport {DiagnosticReportCode, DiagnosticReportCodeGroup} from './resource-codes/diagnostic-report-code';\nimport {antibiotics, antifungals, antivirals, DisplayGrouping, labResult, microbio, radiology} from './resource-codes/display-grouping';\nimport {LOINCCodeGroup} from './resource-codes/loinc-code';\nimport {LOINCCode} from './resource-codes/loinc-code';\nimport {ResourceCode, ResourceCodeGroup} from './resource-codes/resource-code-group';\nimport {RxNormCode} from './resource-codes/rx-norm';\nimport {RxNormCodeGroup} from './resource-codes/rx-norm-group';\n\n// We declare a new LOINCCode referencing a DocumentReference, but do not\n// include it in the groupings below because it is not graphed/displayed in the\n// configuration sidebar.\nexport const documentReferenceLoinc =\n new LOINCCode('68608-9', undefined, 'Summary', true);\n\n/**\n * ResourceCodeManager is the centralized class where other components can\n * look to find an exhaustive listing of all the resource code groups that the\n * application may display.\n */\n@Injectable()\nexport class ResourceCodeManager {\n /** Keep the same group mapping across instances. */\n private static displayGroupMapping:\n Promise>;\n\n constructor(private sanitizer: DomSanitizer) {}\n\n /**\n * Determines ResourceCodeGroup type from the displayGrouping passed in.\n *\n * @param displayGrouping DisplayGroup to create ResourceCodeGroups with\n * @param fhirService FhirService to create ResourceCodeGroups with\n * @param chartType ChartType to create ResourceCodeGroups with\n * @param sameAxis Whether all the concepts should be shown on the same axis\n * or not.\n * @param groupName The label for the AxisGroup\n * @param conceptList List of concepts to be included in the AxisGroup.\n */\n private createResourceGroups(\n displayGrouping: DisplayGrouping, fhirService: FhirService,\n chartType: ChartType, sameAxis: boolean, groupName: string,\n conceptList: R[]): ResourceCodeGroup[] {\n const axisGroups = new Map();\n // if all concepts should be shown on the same axis, we only have one axis\n // that contains all concepts from the concept list.\n if (sameAxis) {\n axisGroups.set(groupName, conceptList);\n\n // otherwise we need an axis for each concept with the label being the\n // concept's label.\n } else {\n conceptList.forEach(concept => {\n axisGroups.set(concept.label, [concept]);\n });\n }\n\n const resourceGroups = new Array();\n axisGroups.forEach((concepts, label) => {\n let group;\n\n if (concepts[0] instanceof LOINCCode) {\n group = new LOINCCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n } else if (concepts[0] instanceof RxNormCode) {\n group = new RxNormCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n } else if (concepts[0] instanceof DiagnosticReportCode) {\n group = new DiagnosticReportCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n } else if (concepts[0] instanceof BCHMicrobioCode) {\n group = new BCHMicrobioCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n }\n if (group) {\n resourceGroups.push(group);\n }\n });\n return resourceGroups;\n }\n\n /**\n * Creates all AxisGroups.\n * @param resourceGroupMap Mapping from Axis Group label to the list of\n * ResourceCodeGroups that should be included in the axis group.\n * @param fhirService FhirService to create Axes with.\n * @param resourceCodeCreator ResourceCodeCreator to get the group\n * configurations\n * @returns List of AxisGroups\n */\n private createAxisGroups(\n resourceGroupMap: Map,\n fhirService: FhirService,\n resourceCodeCreator: ResourceCodeCreator): Promise {\n return resourceCodeCreator.loadAllGroups.then(groupConfigurationMapping => {\n // mapping of Axis group name to the list of axes in that group. Axes\n // may come from different resource Groups in the case of medications so\n // we need to keep track of the mapping and create the axis group after\n // creating all of the axes.\n const axisGroupMapping = new Map();\n resourceGroupMap.forEach((resourceGroupList, groupName) => {\n // some resources are creating only for the purpose of annotations.\n // These have an undefined chartType. We filter these resource groups\n // out because they should not be included in AxisGroups.\n const axes =\n resourceGroupList\n .filter(resourceGroup => resourceGroup.chartType !== undefined)\n .map(\n resourceGroup => new Axis(\n fhirService, this.sanitizer, resourceGroup,\n resourceGroup.label));\n if (axes.length > 0) {\n let axisGroupName = groupName;\n const groupConfig = groupConfigurationMapping.get(groupName);\n // if a Resource Group has a parent group (such as Medication\n // Administrations and Medication Monitoring), we want the Axis Group\n // name to be the parent group's name.\n if (groupConfig && groupConfig.parentGroupName) {\n axisGroupName = groupConfig.parentGroupName;\n }\n\n if (!axisGroupMapping.has(axisGroupName)) {\n axisGroupMapping.set(axisGroupName, new Array());\n }\n axisGroupMapping.get(axisGroupName).push(...axes);\n }\n });\n const axisGroups = new Array();\n axisGroupMapping.forEach((axisList, axisGroupName) => {\n // if the group is in the group configuration mapping, we use that\n // display group. Otherwise we leave the display group to be inferred\n // during AxisGroup creation.\n const displayGroup = groupConfigurationMapping.has(axisGroupName) ?\n groupConfigurationMapping.get(axisGroupName).displayGrouping :\n undefined;\n axisGroups.push(new AxisGroup(axisList, axisGroupName, displayGroup));\n });\n return axisGroups;\n });\n }\n\n /**\n * Creates a mapping of group names to a list of ResourceCodeGroups.\n * Creates all ResourceCodes and ResourceCodeGroups according to the\n * ResourceCodeCreator.\n *\n * @param fhirService the FhirService instance to create ResourceCodeGroups\n * with.\n * @param resourceCodeCreator: ResourceCodeCreator instance\n * @returns Promise that when resolves gives a mapping from group name to\n * the list of ResourceCodeGroups in that group.\n */\n private getResourceCodeGroups(\n fhirService: FhirService, resourceCodeCreator: ResourceCodeCreator):\n Promise> {\n return resourceCodeCreator.loadAllConcepts.then(\n (groupConfigurationToResourceCodes) => {\n const groupNameToResourceGroups =\n new Map();\n groupConfigurationToResourceCodes.forEach(\n (codeList: R[], config: GroupConfiguration) => {\n const resourceGroups = this.createResourceGroups(\n config.displayGrouping, fhirService, config.chartType,\n config.showOnSameAxis, config.groupName, codeList);\n groupNameToResourceGroups.set(config.groupName, resourceGroups);\n });\n return groupNameToResourceGroups;\n });\n }\n\n /**\n * Annotates ResourceCodeGroups that require additional information.\n * All ResourceCodeGroups need to be created before this method is called,\n * otherwise the group to annotate or the reference group may not be\n * created yet.\n * @param: List of all ResourceCodeGroups that were created.\n */\n annotateResourceGroups(resourceGroups: Map) {\n for (const annotation of ANNOTATION_CONFIGURATION) {\n const groups = resourceGroups.get(annotation.groupName);\n const refGroup = resourceGroups.get(annotation.refGroup);\n if ((!groups || !refGroup) || (refGroup.length > 1)) {\n continue;\n }\n for (const group of groups) {\n // Right now we only support annotating LOINCCodeGroups; could be\n // extended in the future.\n if (group instanceof LOINCCodeGroup) {\n group.setMakeAnnotated(annotation.makeAnnotatedFunction(refGroup[0]));\n }\n }\n }\n }\n\n /**\n * Returns a map where the key is a clinical concept group and the value is\n * a list of axis groups belonging to the clinical concept group.\n */\n getDisplayGroupMapping(\n fhirService: FhirService, resourceCodeCreator: ResourceCodeCreator):\n Promise> {\n if (!ResourceCodeManager.displayGroupMapping) {\n ResourceCodeManager.displayGroupMapping =\n this.getResourceCodeGroups(fhirService, resourceCodeCreator)\n .then((resourceGroupMap) => {\n this.annotateResourceGroups(resourceGroupMap);\n return this\n .createAxisGroups(\n resourceGroupMap, fhirService, resourceCodeCreator)\n .then(axisGroups => {\n const mapping = new Map();\n for (const group of axisGroups) {\n if (mapping.has(group.displayGroup)) {\n mapping.get(group.displayGroup).push(group);\n } else {\n mapping.set(group.displayGroup, [group]);\n }\n }\n return mapping;\n });\n });\n }\n return Promise.resolve(ResourceCodeManager.displayGroupMapping);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {AnnotatedMicrobioReport} from '../../fhir-resources/annotated/annotated-microbio-report';\nimport {MicrobioReport} from '../../fhir-resources/microbio-report';\nimport {FhirService} from '../../fhir-server/fhir.service';\n\nimport {AbstractResourceCodeGroup, ResourceCode} from './resource-code-group';\n\n/**\n * Represents one or more LOINC codes that should be displayed together. In the\n * case of multiple LOINC codes in a group, you should provide a label for that\n * group.\n */\nexport class BCHMicrobioCodeGroup extends\n AbstractResourceCodeGroup {\n /**\n * Gets a list of MicrobioReports corresponding to this code group. Each\n * item in the list has the same specimen type as the label of this group, and\n * each report's list of results has a code that is in this group's list of\n * codes.\n */\n getResourceFromFhir(dateRange: Interval): Promise {\n return this.fhirService.getMicrobioReports(this, dateRange)\n .then(\n reports =>\n reports.map(report => new AnnotatedMicrobioReport(report)));\n }\n\n formatRawResults(rawResults: AnnotatedMicrobioReport[]):\n Promise {\n const microbioReports = rawResults.map(result => result.report);\n return Promise.resolve(microbioReports);\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n * @override\n */\n dataAvailableInAppTimeScope(): Promise {\n return this.fhirService.microbioReportsPresentWithCodes(this, APP_TIMESPAN);\n }\n}\n\n/**\n * Holds BCHMicrobioCode codes. BCH provides a custom mapping for their\n * microbiology data since retrieving it is not yet supported in the Cerner\n * FHIR API implementation.\n */\nexport class BCHMicrobioCode extends ResourceCode {\n static readonly CODING_STRING = 'http://cerner.com/bch_mapping/';\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n // This is not an elegant way of implementing this function but since it's\n // a non-standard API server we aren't going to put much effort into\n // developing it further at this point.\n return fhirService.microbioReportsPresentWithCodes(\n new BCHMicrobioCodeGroup(\n fhirService, this.label, [this], undefined, undefined),\n APP_TIMESPAN);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {AnnotatedDiagnosticReport} from '../../fhir-resources/annotated/annotated-diagnostic-report';\nimport {FhirService} from '../../fhir-server/fhir.service';\n\nimport {AbstractResourceCodeGroup, ResourceCode} from './resource-code-group';\n\n/**\n * Represents one or more DiagnosticReport codes that should be displayed\n * together. In the case of multiple DiagnosticReport codes in a group, you\n * should provide a label for that group.\n */\nexport class DiagnosticReportCodeGroup extends AbstractResourceCodeGroup<\n AnnotatedDiagnosticReport, AnnotatedDiagnosticReport> {\n /**\n * Gets a list of AnnotatedDiagnosticReports corresponding to this code group.\n */\n getResourceFromFhir(dateRange: Interval):\n Promise {\n return this.fhirService.getAnnotatedDiagnosticReports(this, dateRange);\n }\n\n formatRawResults(rawResults: AnnotatedDiagnosticReport[]):\n Promise {\n return Promise.resolve(rawResults);\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n * @override\n */\n dataAvailableInAppTimeScope(): Promise {\n return this.fhirService.diagnosticReportsPresentWithCodes(\n this, APP_TIMESPAN);\n }\n}\n\n/**\n * Holds DiagnosticReport codes, which are technically LOINC codes. This is\n * not grouped with LOINC codes because Observations and DiagnosticReports\n * are inherently different in the Fhir and Cerner implementations.\n */\nexport class DiagnosticReportCode extends ResourceCode {\n static readonly CODING_STRING =\n 'http://hl7.org/fhir/dstu2/valueset-report-codes.html';\n // CODING_STRING could also equal http://loinc.org\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n // Currently utilizing code that is very similar to BCHMicrobioCode\n return fhirService.diagnosticReportsPresentWithCodes(\n new DiagnosticReportCodeGroup(\n fhirService, this.label, [this], undefined, undefined),\n APP_TIMESPAN);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport * as Color from 'color';\nimport * as Colors from '../../theme/verily_colors';\n\nexport const ALL_DISPLAY_GROUPS_MAP = new Map();\n\n/**\n * Represents the category that a certain chart's data might fall into, for\n * example a MedicationConcept such as \"Antibiotic\" or a ClinicalConcept such as\n * \"Lab result\"\n */\nexport class DisplayGrouping {\n static colorIdx = 0;\n fill: Color;\n outline: Color;\n\n constructor(readonly label: string, color?: Color, outline?: Color) {\n let tempColor: Color = color;\n if (color === undefined) {\n tempColor = Colors.getDataColors()[DisplayGrouping.colorIdx];\n DisplayGrouping.colorIdx =\n (DisplayGrouping.colorIdx + 1) % Colors.getDataColors().length;\n }\n this.fill = tempColor;\n this.outline = outline ? outline : tempColor;\n ALL_DISPLAY_GROUPS_MAP.set(label, this);\n }\n}\n\nexport const labResult = new DisplayGrouping('Lab Results', Colors.LIME);\nexport const vitalSign = new DisplayGrouping('Vital Signs', Colors.ORANGE);\nexport const antibiotics = new DisplayGrouping('Antibiotics', Colors.TURQUOISE);\nexport const antivirals = new DisplayGrouping('Antivirals', Colors.GOLD);\nexport const antifungals = new DisplayGrouping('Antifungals', Colors.GREEN);\nexport const microbio = new DisplayGrouping('Microbiology', Colors.CYAN);\n// We declare more DisplayGroupings related to Microbiology results that are\n// used to classify points on the Microbiology chart.\nexport const posPrelimMB = new DisplayGrouping(\n 'Check Result Preliminary', Color('#e4e2e2'), Colors.ABNORMAL);\nexport const negPrelimMB = new DisplayGrouping(\n 'Negative Preliminary', Color('#e4e2e2'), Colors.BLUE_A700);\nexport const posFinalMB =\n new DisplayGrouping('Check Result Final', Colors.ABNORMAL);\nexport const negFinalMB =\n new DisplayGrouping('Negative Final', Colors.BLUE_A700);\n// We declare DisplayGroupings that correspond to report statuses that we might\n// encounter rarely.\nexport const posOtherNB =\n new DisplayGrouping('Check Result, Other', Colors.DEEP_GOLD);\nexport const negOtherMB =\n new DisplayGrouping('Negative, Other', Colors.DEEP_GOLD);\n// Radiology Report categories\nexport const radiology = new DisplayGrouping('Radiology', Colors.PINK_900);\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {AnnotatedObservation} from '../../fhir-resources/annotated/annotated-observation';\nimport {Observation} from '../../fhir-resources/observation';\nimport {ObservationSet} from '../../fhir-resources/sets/observation-set';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport {ChartType} from '../../graphs/graphtypes/graph/graph.component';\n\nimport {DisplayGrouping} from './display-grouping';\nimport {ResourceCode} from './resource-code-group';\nimport {AbstractResourceCodeGroup} from './resource-code-group';\n\n/**\n * Holds LOINC codes.\n */\nexport class LOINCCode extends ResourceCode {\n static readonly CODING_STRING = 'http://loinc.org';\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n return fhirService.observationsPresentWithCode(this, APP_TIMESPAN);\n }\n}\n\n/**\n * Represents one or more LOINC codes that should be displayed together. In the\n * case of multiple LOINC codes in a group, you should provide a label for that\n * group.\n */\nexport class LOINCCodeGroup extends\n AbstractResourceCodeGroup {\n constructor(\n /** FHIR service for retrieving data */\n readonly fhirService: FhirService,\n /** The label for this resource code group. */\n readonly label: string,\n /** The resource codes to display on this Axis. */\n readonly resourceCodes: ResourceCode[],\n /** The display grouping for this resource code group. */\n readonly displayGrouping: DisplayGrouping,\n /** The chart type for this Axis. */\n readonly chartType: ChartType,\n /**\n * The (optional) function that will make an observation into an\n * AnnotatedObservation so that the graph can show the appropriate\n * tooltip.\n */\n private makeAnnotated?: (observation: Observation, dateRange: Interval) =>\n Promise) {\n super(fhirService, label, resourceCodes, displayGrouping, chartType);\n }\n\n setMakeAnnotated(\n makeAnnotatedFunction: (observation: Observation, dateRange: Interval) =>\n Promise) {\n this.makeAnnotated = makeAnnotatedFunction;\n }\n\n /**\n * Gets one ObservationSet for each LOINCCode in the rawResults, and returns\n * a list of those ObservationSets.\n * @param rawResults: List of AnnotatedObservations to group into\n * ObservationSets\n * @returns: list of ObservationSets. One ObservationSet for each LOINCCode\n * found in the rawResults.\n */\n formatRawResults(rawResults: AnnotatedObservation[]):\n Promise {\n const mapObs = new Map();\n let maxPrecision = 0;\n for (const annotatedObservation of rawResults) {\n const observation = annotatedObservation.observation;\n // From this point on, each observation should have a value,\n // result, or interpretation. All observations that just had\n // innerComponents have been flattened out.\n let obsList = mapObs.get(observation.label);\n if (!obsList) {\n obsList = new Array();\n }\n obsList.push(annotatedObservation);\n if (observation.precision > maxPrecision) {\n maxPrecision = observation.precision;\n }\n mapObs.set(observation.label, obsList);\n }\n this.precision = maxPrecision;\n const doubleAnnotationArray = Array.from(mapObs.values());\n\n return Promise.all(doubleAnnotationArray.map(\n singleAnnotationArray =>\n Promise.all(singleAnnotationArray)\n .then(\n resolvedAnnotations =>\n new ObservationSet(resolvedAnnotations))));\n }\n\n /**\n * Gets list of Observations from the FHIR server and makes them annotated\n * if makeAnnotated function is defined.\n * If an Observation contains \"inner components\", this returns separate\n * Observations for those.\n * @param dateRange: date range to get results from FHIR for\n * @returns: List of Annotated Observations\n */\n getResourceFromFhir(dateRange: Interval): Promise {\n return this.fhirService.getObservationsForCodeGroup(this, dateRange)\n .then(\n observationDoubleArray => {\n // Unnest the inner and outer observations into one flattened\n // array per concept group.\n return observationDoubleArray.map(\n obsSingleArray =>\n Array.from(obsSingleArray)\n .reduce((acc: Observation[], observation) => {\n // The outer component may not have a\n // value or result.\n if (observation.value || observation.result ||\n observation.interpretation) {\n acc.push(observation);\n }\n // Add separate ObservationLists for\n // each inner component.\n if (observation.innerComponents.length > 0) {\n for (const innerComponent of\n observation.innerComponents) {\n acc.push(innerComponent);\n }\n }\n return acc;\n }, []));\n },\n rejection => {\n // If there is any error with constructing an Observation for any\n // code in this code group, throw the error.\n throw rejection;\n })\n .then(flattened => {\n const resultList = new Array>();\n flattened.forEach(conceptList => {\n for (const observation of conceptList) {\n if (this.makeAnnotated) {\n resultList.push(this.makeAnnotated(observation, dateRange));\n } else {\n resultList.push(\n Promise.resolve(new AnnotatedObservation(observation)));\n }\n }\n });\n return Promise.all(resultList);\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\n\nimport {TimestampedObject} from '../../fhir-resources/sets/fhir-resource-set';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport {ChartType} from '../../graphs/graphtypes/graph/graph.component';\nimport {DisplayGrouping} from './display-grouping';\n\n/**\n * A code specifying the medication or observation type as well as the specific\n * medication or observation.\n */\nexport abstract class ResourceCode {\n /**\n * The string that holds the FHIR address for the coding system. Every\n * extending class should override this constant, although there is no way\n * we can syntactically enforce this in Typescript.\n */\n static readonly CODING_STRING;\n\n private static readonly CODE_STRING_TO_CODE:\n {[code: string]: ResourceCode} = {};\n\n static fromCodeString(code: string): ResourceCode {\n return ResourceCode.CODE_STRING_TO_CODE[code];\n }\n\n constructor(\n readonly codeString: string, readonly displayGrouping: DisplayGrouping,\n readonly label: string, readonly showByDefault = false,\n /* Absolute axis bounds for the graph displaying this ResourceCode. */\n readonly displayBounds?: [number, number],\n /* Whether or not to force the axis bounds, even if a smaller range\n containing all the data can be calculated. */\n readonly forceDisplayBounds = false) {\n const matchingCode = ResourceCode.CODE_STRING_TO_CODE[codeString];\n if (matchingCode && matchingCode.label !== label) {\n throw Error(\n 'A Resource Code has already been created with this code string but a different label: ' +\n codeString);\n }\n ResourceCode.CODE_STRING_TO_CODE[codeString] = matchingCode || this;\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n */\n abstract dataAvailableInAppTimeScope(fhirService: FhirService):\n Promise;\n}\n\n/**\n * A class that holds a group of resource codes that should be displayed on\n * the same Axis together.\n */\nexport class ResourceCodeGroup {\n /* Whether or not to show this ResourceCodeGroup by default. This is true\n * when any ResourceCode in the group should be shown as default.*/\n readonly showByDefault: boolean;\n\n // The number of decimal places to show for any value associated with this\n // resource group. The default is 0, to minimize errors caused by unnecessary\n // trailing zeros.\n precision = 0;\n\n /**\n * When we've decided whether this resource code group has data available\n * in the app, it doesn't change over the course of the app lifetime, so we\n * cache it.\n */\n resolvedDataAvailableInAppTimeScope: boolean = undefined;\n\n constructor(\n readonly fhirService: FhirService,\n /** The label for this resource code group. */\n readonly label: string,\n /** The resource codes to display on this Axis. */\n readonly resourceCodes: ResourceCode[],\n /** The display grouping for this resource code group. */\n readonly displayGrouping: DisplayGrouping,\n /** The chart type for this Axis. */\n readonly chartType: ChartType) {\n this.showByDefault = this.resourceCodes.some(code => code.showByDefault);\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n */\n dataAvailableInAppTimeScope(): Promise {\n if (this.resolvedDataAvailableInAppTimeScope !== undefined) {\n return Promise.resolve(this.resolvedDataAvailableInAppTimeScope);\n }\n return Promise\n .all(this.resourceCodes.map(\n rc => rc.dataAvailableInAppTimeScope(this.fhirService)))\n .then(bools => {\n this.resolvedDataAvailableInAppTimeScope =\n bools.reduce((result, next) => result = result || next);\n return this.resolvedDataAvailableInAppTimeScope;\n });\n }\n}\n\nexport abstract class AbstractResourceCodeGroup<\n T, R extends TimestampedObject> extends ResourceCodeGroup {\n /**\n * Looks in the cache to see if data for this time interval exists. If not,\n * calls the implementing class's getResourceFromFhir function and caches\n * its data, then returns the data for the given time interval.\n */\n getResourceSet(dateRange: Interval): Promise {\n return this.getResourceFromFhir(dateRange).then(rawResults => {\n return this.formatRawResults(rawResults);\n });\n }\n\n /**\n * Formats raw results from the cache to results expected by the rendering\n * code.\n *\n * Note: This should really be a private method and never called by anything\n * except for getResourceSet. Since it is abstract though, we cannot make it\n * private.\n *\n * @param rawResults raw results from the cache that should be formatted.\n */\n abstract formatRawResults(rawResults: R[]): Promise;\n\n /**\n * This function should make the FHIR calls to get promises for the\n * resources corresponding to this resource code group.\n */\n abstract getResourceFromFhir(dateRange: Interval): Promise;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\n\nimport {MedicationAdministration} from '../../fhir-resources/medication-administration';\nimport {AnnotatedMedicationOrder, MedicationOrder, MedicationOrderSet} from '../../fhir-resources/medication-order';\n\nimport {AbstractResourceCodeGroup} from './resource-code-group';\nimport {RxNormCode} from './rx-norm';\n\n/**\n * Represents one or more RxNorm codes that should be displayed together. In the\n * case of multiple RxNorm codes in a group, you should provide a label for that\n * group.\n */\nexport class RxNormCodeGroup extends\n AbstractResourceCodeGroup {\n medicationOrderCache = new Map();\n\n /**\n * Gets all Medication Administrations in this group from FHIR for the given\n * date range.\n * @param dateRange date range to get medication administrations for\n */\n getResourceFromFhir(dateRange: Interval):\n Promise {\n return this.fhirService.getMedicationAdministrationsWithCodeGroup(\n this, dateRange);\n }\n\n /**\n * Fills out the order and administration information for each\n * RxNormCode in this group, and returns a list of the populated RxNormCodes.\n * This is a roundabout process because the Cerner implementation of the\n * FHIR standard doesn't allow for searching MedicationOrders by RxNorm code,\n * so we have to search for MedicationAdministrations by RxNorm code and work\n * up from there.\n */\n formatRawResults(rawResults: MedicationAdministration[]):\n Promise {\n const groupedByOrder = this.groupAdministrationsByOrderId(rawResults);\n return this.getMedicationOrdersAndMapToMed(groupedByOrder);\n }\n\n /**\n * Takes a list of lists of MedicationAdministrations and groups them by their\n * order IDs. Each list represents a set of MedicationAdministrations for a\n * specific RxNorm, but they're not arranged by order. For example:\n *\n * [[admin1_rxnorm1_orderA, admin2_rxnorm1_orderB, admin3_rxnorm1_orderB],\n * [admin1_rxnorm2_orderC, admin2_rxnorm2_orderC],\n * [admin1_rxnorm3_orderD]]\n *\n * would yield:\n *\n * {orderA: [admin1_rxnorm1_orderA],\n * orderB: [admin2_rxnorm1_orderB, admin3_rxnorm1_orderB],\n * orderC: [admin1_rxnorm2_orderC, admin2_rxnorm2_orderC],\n * orderD: [admin1_rxnorm3_orderD]\n * }\n * @param medAdmins A list of lists of MedicationAdministrations. See above.\n * @returns A map of order IDs to a list of corresponding\n * MedicationAdministrations.\n */\n private groupAdministrationsByOrderId(medAdmins: MedicationAdministration[]):\n Map {\n let groupedByOrder = new Map();\n // Group medication administrations by medication order.\n groupedByOrder = medAdmins.reduce(\n (groups: Map,\n medAdmin: MedicationAdministration) => {\n // Append this administration to whatever order list it belongs to.\n const orderId: string = medAdmin.medicationOrderId;\n if (!groups.has(orderId)) {\n groups.set(orderId, new Array());\n }\n groups.set(orderId, groups.get(orderId).concat(medAdmin));\n return groups;\n },\n // Use whatever existed in groupedByOrder prior to this iteration as\n // the basis for the reducer to add to.\n groupedByOrder);\n\n return groupedByOrder;\n }\n\n /**\n * Transforms a map with keys of MedicationOrder IDs and values of\n * MedicationAdministrations to a list of RxNormCodes, with the RxNormCodes\n * containing their corresponding MedicationOrders, and the medicationOrders\n * containing their corresponding MedicationAdministrations. For example:\n *\n * {orderA: [admin1_rxnorm1_orderA],\n * orderB: [admin2_rxnorm1_orderB, admin3_rxnorm1_orderB],\n * orderC: [admin1_rxnorm2_orderC, admin2_rxnorm2_orderC],\n * orderD: [admin1_rxnorm3_orderD]\n * }\n *\n * would yield:\n *\n * [RxNorm1 = {orders:\n * [OrderA {administrationsForOrder: [admin1_rxnorm1_orderA]},\n * OrderB {administrationsForOrder: [admin2_rxnorm1_orderB,\n * admin3_rxnorm1_orderB]}]}\n * RxNorm2 = {orders:\n * [OrderC {administrationsForOrder: [admin1_rxnorm2_orderC,\n * admin2_rxnorm2_orderC]}]}\n * RxNorm3 = {orders:\n * [OrderD {administrationsForOrder: [admin1_rxnorm3_orderD]}]}\n *\n * @param groupedByOrder A map with keys of MedicationOrder IDs and values of\n * MedicationAdministrations for those MedicationOrders.\n * @returns A list of RxNormCodes with orders populated\n * @throws Error if the incoming parameter has medication administrations that\n * did not come from the same order for the same med\n */\n private getMedicationOrdersAndMapToMed(\n groupedByOrder: Map):\n Promise {\n const allPromises = Array.from(groupedByOrder.keys()).map(orderId => {\n if (this.medicationOrderCache.has(orderId)) {\n return Promise.resolve(this.medicationOrderCache.get(orderId));\n } else {\n return this.fhirService.getMedicationOrderWithId(orderId).then(\n order => {\n this.medicationOrderCache.set(orderId, order);\n return order;\n },\n rejection => {\n // If there are any errors getting a MedicationOrder for\n // this RxNormCode[], throw the error.\n throw rejection;\n });\n }\n });\n\n // Resolve all the promises and set the corresponding orders for each\n // RxNorm.\n const groupedByMed = new Map();\n return Promise.all(allPromises)\n .then(orders => {\n orders.map(\n (order: MedicationOrder) => {\n const orderId = order.orderId;\n const medicationAdminsForOrder =\n Array.from(groupedByOrder.get(orderId).values());\n // Verify all the administrations have the same RxNormCode and\n // same Order ID.\n const rxNormCodeSet = new Set(\n medicationAdminsForOrder.map(admin => admin.rxNormCode));\n if (rxNormCodeSet.size !== 1) {\n throw Error(\n 'Administrations for order ' + orderId +\n ' are for multiple RxNorms: ' +\n Array.from(rxNormCodeSet.values()));\n }\n\n const orderSet = new Set(medicationAdminsForOrder.map(\n admin => admin.medicationOrderId));\n if (rxNormCodeSet.size !== 1) {\n throw Error(\n 'Administrations for order ' + orderId +\n ' report multiple order IDs: ' + Array.from(orderSet));\n }\n\n // Add the order to the map for the RxNorm code.\n const rxCode = rxNormCodeSet.values().next().value;\n const annotatedOrder = new AnnotatedMedicationOrder(\n order, medicationAdminsForOrder);\n if (groupedByMed.has(rxCode)) {\n groupedByMed.set(\n rxCode, groupedByMed.get(rxCode).concat(annotatedOrder));\n } else {\n groupedByMed.set(rxCode, new Array(annotatedOrder));\n }\n },\n rejection => {\n // If there are any errors constructing MedicationOrders for\n // this RxNormCode[], throw the error.\n throw rejection;\n });\n })\n .then(\n _ => {\n Array.from(groupedByMed.entries()).forEach(medEntry => {\n const rxNorm = medEntry[0];\n const medOrders = medEntry[1];\n rxNorm.orders = new MedicationOrderSet(medOrders);\n });\n // Return all the populated RxNorms.\n return Array.from(groupedByMed.keys());\n },\n rejection => {\n // If any promise is rejected, throw the same rejection.\n throw rejection;\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport * as Colors from '../../theme/verily_colors';\n\nimport {DisplayGrouping} from './display-grouping';\nimport {ResourceCode} from './resource-code-group';\n\nexport class MedicationConceptGroup extends DisplayGrouping {}\n\nexport const ANTIBIOTIC =\n new MedicationConceptGroup('Antibiotic', Colors.DEEP_TURQUOISE);\n\nexport const MEDICATION_GROUPS = [ANTIBIOTIC];\n\n/**\n * Holds RXNorm codes and orders corresponding to them.\n */\nexport class RxNormCode extends ResourceCode {\n static readonly CODING_STRING = 'http://www.nlm.nih.gov/research/umls/rxnorm';\n\n /* Contains a set of medication orders for this RxNorm code. */\n orders: MedicationOrderSet;\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n return fhirService.medicationsPresentWithCode(this, APP_TIMESPAN);\n }\n}\n","module.exports = \".configurationCard {\\n background-color: transparent;\\n border-left-style: solid;\\n border-left-width: 5px;\\n height: 40px !important;\\n padding: 3px;\\n}\\n\\n\\n.disableDragging {\\n color: gray;\\n cursor: not-allowed;\\n padding-top: 4px;\\n}\\n\\n\\n.listItem {\\n display: inline-block;\\n height: -webkit-fit-content;\\n height: -moz-fit-content;\\n height: fit-content;\\n padding-left: 5px !important;\\n}\\n\\n\\n.label {\\n height: -webkit-fit-content;\\n height: -moz-fit-content;\\n height: fit-content;\\n line-height: 15px;\\n}\\n\\n\\n.tinytext {\\n font-size: 12px;\\n line-height: 15px;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS1zZWxlY3Rvci1tZW51L2RhdGEtc2VsZWN0b3ItZWxlbWVudC9kYXRhLXNlbGVjdG9yLWVsZW1lbnQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLDZCQUE2QjtFQUM3Qix3QkFBd0I7RUFDeEIsc0JBQXNCO0VBQ3RCLHVCQUF1QjtFQUN2QixZQUFZO0FBQ2Q7OztBQUdBO0VBQ0UsV0FBVztFQUNYLG1CQUFtQjtFQUNuQixnQkFBZ0I7QUFDbEI7OztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLDJCQUFtQjtFQUFuQix3QkFBbUI7RUFBbkIsbUJBQW1CO0VBQ25CLDRCQUE0QjtBQUM5Qjs7O0FBRUE7RUFDRSwyQkFBbUI7RUFBbkIsd0JBQW1CO0VBQW5CLG1CQUFtQjtFQUNuQixpQkFBaUI7QUFDbkI7OztBQUVBO0VBQ0UsZUFBZTtFQUNmLGlCQUFpQjtBQUNuQiIsImZpbGUiOiJzcmMvYXBwL2RhdGEtc2VsZWN0b3ItbWVudS9kYXRhLXNlbGVjdG9yLWVsZW1lbnQvZGF0YS1zZWxlY3Rvci1lbGVtZW50LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29uZmlndXJhdGlvbkNhcmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC13aWR0aDogNXB4O1xuICBoZWlnaHQ6IDQwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZzogM3B4O1xufVxuXG5cbi5kaXNhYmxlRHJhZ2dpbmcge1xuICBjb2xvcjogZ3JheTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgcGFkZGluZy10b3A6IDRweDtcbn1cblxuLmxpc3RJdGVtIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBoZWlnaHQ6IGZpdC1jb250ZW50O1xuICBwYWRkaW5nLWxlZnQ6IDVweCAhaW1wb3J0YW50O1xufVxuXG4ubGFiZWwge1xuICBoZWlnaHQ6IGZpdC1jb250ZW50O1xuICBsaW5lLWhlaWdodDogMTVweDtcbn1cblxuLnRpbnl0ZXh0IHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbn1cbiJdfQ== */\"","module.exports = \"
\\n \\n \\n
\\n
\\n
\\n {{axisGroup.label}}\\n
\\n
\\n {{uiConstants.NO_DATA_AVAILABLE_TMPL + appTimeIntervalString}}\\n
\\n
\\n
\\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {AfterViewInit, Component, Inject, Input} from '@angular/core';\nimport {APP_TIMESPAN, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {AxisGroup} from '../../graphs/graphtypes/axis-group';\n\n/**\n * Represents one element in a list or menu of ResourceCodesForCards\n * that can be added to the main CardContainer.\n */\n@Component({\n selector: 'app-data-selector-element',\n templateUrl: './data-selector-element.component.html',\n styleUrls: ['./data-selector-element.component.css']\n})\nexport class DataSelectorElementComponent implements AfterViewInit {\n /**\n * The ResourceCodes for the card represented by this DataSelectorElement.\n */\n @Input() axisGroup: AxisGroup;\n\n /**\n * Hold an instance of the app time interval so we can display it in the HTML\n */\n readonly appTimeIntervalString = APP_TIMESPAN.start.toFormat('MM/dd/yyyy') +\n ' and ' + APP_TIMESPAN.end.toFormat('MM/dd/yyyy');\n\n /**\n * Whether there is data available within the app timespan for this card.\n */\n dataAvailable = true;\n\n constructor(@Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n ngAfterViewInit() {\n // We have to wait until after view initialization so that the @Input\n // element binding happens.\n this.axisGroup.dataAvailableInAppTimeScope().then(available => {\n this.dataAvailable = available;\n });\n }\n}\n","module.exports = \".addCardInline {\\n color: rgb(248, 248, 248);\\n display: inline-block;\\n opacity: 0.15;\\n transition: opacity 0.3s;\\n /* Needed so that there's not enough space between the cards to hold the icon,\\n just enough to hold the line placeholder.*/\\n margin-bottom:-17px;\\n margin-top:-17px;\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex-direction: row;\\n -ms-flex-direction: row; /* For IE10 */\\n align-content: center;\\n -ms-flex-line-pack: center; /* Align content: center conversion for IE10 */\\n justify-content: flex-start;\\n -ms-flex-pack: start; /* Justify content: start conversion for IE10 */\\n align-items: center;\\n -ms-flex-align: center; /* Align items: center conversion for IE10 */\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\nspan {\\n border: 2px dashed rgb(248, 248, 248);\\n /* Only outline the bottom instead of all four sides.*/\\n border-style: none none dotted;\\n display: inline-block;\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\n.addCardInline:hover {\\n opacity: 1;\\n}\\n\\n.conceptSelector {\\n padding-left: 0px !important;\\n padding-right: 0px !important;\\n min-width: 200px;\\n}\\n\\n.mainConceptSelector {\\n border-left-style: solid;\\n border-left-width: 5px;\\n}\\n\\n::ng-deep .mat-menu-item {\\n line-height: 20px !important;\\n}\\n\\n::ng-deep .mat-list-item-content {\\n margin-top: 8px;\\n}\\n\\n::ng-deep .mat-autocomplete-panel .mat-list-item-content {\\n margin-top: -8px; /* Styling for autocomplete menu items needs to be different.*/\\n}\\n\\n::ng-deep .mat-option {\\n height: -webkit-fit-content !important;\\n height: -moz-fit-content !important;\\n height: fit-content !important;\\n overflow: visible !important;\\n padding: 0px !important;\\n}\\n\\n.conceptForm {\\n margin-left: 10px;\\n margin-right: 10px;\\n}\\n\\n::ng-deep .autoMenu.mat-menu-panel {\\n min-width: 300px;\\n}\\n\\n.conceptFormField {\\n width: 100%;\\n}\\n\\nbutton {\\n font-family: 'Work Sans', sans-serif;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS1zZWxlY3Rvci1tZW51L2RhdGEtc2VsZWN0b3ItbWVudS5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQixhQUFhO0VBQ2Isd0JBQXdCO0VBQ3hCOzRDQUMwQztFQUMxQyxtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGFBQWE7RUFDYixvQkFBb0IsRUFBRSxhQUFhO0VBQ25DLG1CQUFtQjtFQUNuQix1QkFBdUIsRUFBRSxhQUFhO0VBQ3RDLHFCQUFxQjtFQUNyQiwwQkFBMEIsR0FBRyw4Q0FBOEM7RUFDM0UsMkJBQTJCO0VBQzNCLG9CQUFvQixHQUFHLCtDQUErQztFQUN0RSxtQkFBbUI7RUFDbkIsc0JBQXNCLEdBQUcsNENBQTRDO0VBQ3JFLFlBQVk7RUFDWixnQkFBZ0IsRUFBRSxhQUFhO0FBQ2pDOztBQUVBO0VBQ0UscUNBQXFDO0VBQ3JDLHNEQUFzRDtFQUN0RCw4QkFBOEI7RUFDOUIscUJBQXFCO0VBQ3JCLFlBQVk7RUFDWixnQkFBZ0IsRUFBRSxhQUFhO0FBQ2pDOztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsNEJBQTRCO0VBQzVCLDZCQUE2QjtFQUM3QixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx3QkFBd0I7RUFDeEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGdCQUFnQixFQUFFLDhEQUE4RDtBQUNsRjs7QUFFQTtFQUNFLHNDQUE4QjtFQUE5QixtQ0FBOEI7RUFBOUIsOEJBQThCO0VBQzlCLDRCQUE0QjtFQUM1Qix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0Usb0NBQW9DO0FBQ3RDIiwiZmlsZSI6InNyYy9hcHAvZGF0YS1zZWxlY3Rvci1tZW51L2RhdGEtc2VsZWN0b3ItbWVudS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmFkZENhcmRJbmxpbmUge1xuICBjb2xvcjogcmdiKDI0OCwgMjQ4LCAyNDgpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG9wYWNpdHk6IDAuMTU7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcztcbiAgLyogTmVlZGVkIHNvIHRoYXQgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIGJldHdlZW4gdGhlIGNhcmRzIHRvIGhvbGQgdGhlIGljb24sXG4gIGp1c3QgZW5vdWdoIHRvIGhvbGQgdGhlIGxpbmUgcGxhY2Vob2xkZXIuKi9cbiAgbWFyZ2luLWJvdHRvbTotMTdweDtcbiAgbWFyZ2luLXRvcDotMTdweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OyAvKiBGb3IgSUUxMCAqL1xuICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4gIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogQWxpZ24gY29udGVudDogY2VudGVyIGNvbnZlcnNpb24gZm9yIElFMTAgKi9cbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAtbXMtZmxleC1wYWNrOiBzdGFydDsgIC8qIEp1c3RpZnkgY29udGVudDogc3RhcnQgY29udmVyc2lvbiBmb3IgSUUxMCAqL1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyOyAgLyogQWxpZ24gaXRlbXM6IGNlbnRlciBjb252ZXJzaW9uIGZvciBJRTEwICovXG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbn1cblxuc3BhbiB7XG4gIGJvcmRlcjogMnB4IGRhc2hlZCByZ2IoMjQ4LCAyNDgsIDI0OCk7XG4gIC8qIE9ubHkgb3V0bGluZSB0aGUgYm90dG9tIGluc3RlYWQgb2YgYWxsIGZvdXIgc2lkZXMuKi9cbiAgYm9yZGVyLXN0eWxlOiBub25lIG5vbmUgZG90dGVkO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbn1cblxuLmFkZENhcmRJbmxpbmU6aG92ZXIge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uY29uY2VwdFNlbGVjdG9yIHtcbiAgcGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gIG1pbi13aWR0aDogMjAwcHg7XG59XG5cbi5tYWluQ29uY2VwdFNlbGVjdG9yIHtcbiAgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC13aWR0aDogNXB4O1xufVxuXG46Om5nLWRlZXAgLm1hdC1tZW51LWl0ZW0gIHtcbiAgbGluZS1oZWlnaHQ6IDIwcHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbjo6bmctZGVlcCAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LWxpc3QtaXRlbS1jb250ZW50IHtcbiAgbWFyZ2luLXRvcDogLThweDsgLyogU3R5bGluZyBmb3IgYXV0b2NvbXBsZXRlIG1lbnUgaXRlbXMgbmVlZHMgdG8gYmUgZGlmZmVyZW50LiovXG59XG5cbjo6bmctZGVlcCAubWF0LW9wdGlvbiB7XG4gIGhlaWdodDogZml0LWNvbnRlbnQgIWltcG9ydGFudDtcbiAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDtcbiAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XG59XG5cbi5jb25jZXB0Rm9ybSB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbjo6bmctZGVlcCAuYXV0b01lbnUubWF0LW1lbnUtcGFuZWwge1xuICBtaW4td2lkdGg6IDMwMHB4O1xufVxuXG4uY29uY2VwdEZvcm1GaWVsZCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG5idXR0b24ge1xuICBmb250LWZhbWlseTogJ1dvcmsgU2FucycsIHNhbnMtc2VyaWY7XG59Il19 */\"","module.exports = \"
\\n \\n \\n \\n
\\n\\n \\n \\n \\n \\n \\n \\n\\n\\n
\\n \\n \\n \\n \\n \\n
\\n \\n \\n \\n search\\n \\n \\n \\n \\n \\n \\n \\n
\\n
\\n \\n \\n \\n \\n
\\n \\n \\n \\n
\\n
\\n
\\n
\\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, OnInit, Output, ViewChild} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {MatAutocompleteTrigger, MatMenuTrigger} from '@angular/material';\nimport {Observable} from 'rxjs';\nimport {map, startWith} from 'rxjs/operators';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from '../conceptmappings/resource-code-manager';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {DisplayGrouping} from '../conceptmappings/resource-codes/display-grouping';\nimport {SetupDataService} from '../setup/setup-data.service';\n\n/**\n * Shows a button with expanding menus for selecting data elements to display.\n */\n@Component({\n selector: 'app-data-selector-menu',\n templateUrl: './data-selector-menu.component.html',\n styleUrls: ['./data-selector-menu.component.css']\n})\nexport class DataSelectorMenuComponent {\n /** The trigger for the main menu displayed. */\n @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;\n /** The trigger for the autocomplete panel displayed. */\n @ViewChild(MatAutocompleteTrigger)\n autocompleteTrigger: MatAutocompleteTrigger;\n\n /**\n * An array of DisplayGroupings and AxisGroup that belong to that\n * grouping.\n */\n displayGroupings: Array<[DisplayGrouping, AxisGroup[]]>;\n\n /** An event that is emitted when the user requests to add a new card. */\n @Output() addCard = new EventEmitter();\n /** An event that is emitted when the user requests to add a textbox. */\n @Output() addTextbox = new EventEmitter();\n /**\n * An event that is emitted when the user requests to add a custom timeline.\n */\n @Output() addCustomTimeline = new EventEmitter();\n\n /** All AxisGroup that correspond to cards displayed on the page. */\n allConcepts: AxisGroup[];\n\n /**\n * The FormControl used to monitor changes in the user input of the\n * autocomplete field.\n */\n readonly conceptCtrl = new FormControl();\n filteredConcepts: Observable;\n\n constructor(\n setupDataService: SetupDataService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n setupDataService.displayGroupMapping.then((displayGroups) => {\n const temp = Array.from(displayGroups.values());\n this.allConcepts = [].concat.apply([], temp);\n this.displayGroupings = Array.from(displayGroups.entries());\n\n // Watch for changes to the user input on the autocomplete panel.\n this.filteredConcepts = this.conceptCtrl.valueChanges.pipe(\n startWith(\n ''), // The autocomplete input starts with nothing typed in.\n map(concept => concept ? this.filter(concept, this.allConcepts) :\n this.allConcepts.slice()));\n });\n }\n\n // Listens for an event indicating that the user has selected to add the\n // concept card from the top toolbar. The label for the card is sent as an\n // event to CardContainer.\n private addConceptCard(label: string) {\n this.addCard.emit(label);\n\n recordGoogleAnalyticsEvent('addConcept', 'addCard', label);\n }\n\n // Emits an event indicating to CardContainer to add a blank textbox at the\n // top of the page.\n private textbox() {\n this.addTextbox.emit();\n\n recordGoogleAnalyticsEvent(\n 'addTextbox', 'addCard', new Date().toDateString());\n }\n\n private customTimeline() {\n this.addCustomTimeline.emit();\n\n recordGoogleAnalyticsEvent(\n 'addCustomTimeline', 'addCard', new Date().toDateString());\n }\n\n // Filter the concepts shown on the autocomplete menu.\n filter(concept, allConcepts): AxisGroup[] {\n return allConcepts.filter(\n option =>\n option.label.toLowerCase().indexOf(concept.toLowerCase()) === 0);\n }\n\n // We close the menu after an option is selected by autocomplete.\n private closeMenus() {\n this.menuTrigger.closeMenu();\n this.autocompleteTrigger.closePanel();\n }\n\n // Listen for the event indicating that an option has been selected in the\n // autocomplete menu.\n private selectOption($event) {\n this.addConceptCard($event.option.value);\n this.closeMenus();\n }\n}\n","module.exports = \"
\\n Browser version: {{browserVersion}}
\\n Authentication information:
\\n URL Parameters: {{parameters}}
\\n\\n Errors surfaced:
\\n
\\n {{error}}\\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nimport 'fhirclient';\n\nimport {Component} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\n\nimport {DebuggerService} from './debugger.service';\n\n@Component({\n selector: 'app-debugger',\n templateUrl: './debugger.component.html',\n})\n\n/**\n * This debugger component surfaces errors stored in the debug service to the\n * UI.\n */\nexport class DebuggerComponent {\n browserVersion: string;\n parameters = new Array();\n\n constructor(\n readonly debugService: DebuggerService, private route: ActivatedRoute) {\n this.browserVersion = navigator.appVersion;\n\n this.route.queryParams.subscribe(params => {\n this.parameters.push(JSON.stringify(params));\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\n\n/**\n * This service accumulates any errors sent to it in the app into an array of\n * strings so that they can be surfaced in the UI.\n */\n@Injectable({providedIn: 'root'})\nexport class DebuggerService {\n errors: string[] = [];\n\n logError(error: string) {\n this.errors.push(error);\n }\n}\n","module.exports = \".previewSave {\\n background-color:#202020; /* GREY_900 */\\n display: -ms-flexbox;\\n display: flex;\\n padding: 15px;\\n width: 90%;\\n overflow: auto;\\n max-height: 80%;\\n /* Disable selecting/highlighting on the page. */\\n -webkit-touch-callout: none; /* iOS Safari */\\n -webkit-user-select: none; /* Safari */\\n -moz-user-select: none; /* Firefox */\\n -ms-user-select: none; /* Internet Explorer/Edge */\\n user-select: none; /* Chrome and Opera */\\n}\\n\\n::ng-deep .previewSave > * {\\n pointer-events: none !important;\\n}\\n\\n.mat-dialog-actions {\\n float: right;\\n}\\n\\nh1 {\\n font-family: 'Montserrat', sans-serif;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGlhbG9ncy9jb25maXJtLXNhdmUvY29uZmlybS1zYXZlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSx3QkFBd0IsRUFBRSxhQUFhO0VBQ3ZDLG9CQUFhO0VBQWIsYUFBYTtFQUNiLGFBQWE7RUFDYixVQUFVO0VBQ1YsY0FBYztFQUNkLGVBQWU7RUFDZixnREFBZ0Q7RUFDaEQsMkJBQTJCLEVBQUUsZUFBZTtFQUM1Qyx5QkFBeUIsRUFBRSxXQUFXO0tBQ25DLHNCQUFzQixFQUFFLFlBQVk7TUFDbkMscUJBQXFCLEVBQUUsMkJBQTJCO1VBQzlDLGlCQUFpQixFQUFFLHFCQUFxQjtBQUNsRDs7QUFFQTtFQUNFLCtCQUErQjtBQUNqQzs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLHFDQUFxQztBQUN2QyIsImZpbGUiOiJzcmMvYXBwL2RpYWxvZ3MvY29uZmlybS1zYXZlL2NvbmZpcm0tc2F2ZS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnByZXZpZXdTYXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjojMjAyMDIwOyAvKiBHUkVZXzkwMCAqL1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiAxNXB4O1xuICB3aWR0aDogOTAlO1xuICBvdmVyZmxvdzogYXV0bztcbiAgbWF4LWhlaWdodDogODAlO1xuICAvKiBEaXNhYmxlIHNlbGVjdGluZy9oaWdobGlnaHRpbmcgb24gdGhlIHBhZ2UuICovXG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsgLyogaU9TIFNhZmFyaSAqL1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyAvKiBTYWZhcmkgKi9cbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsgLyogRmlyZWZveCAqL1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOyAvKiBJbnRlcm5ldCBFeHBsb3Jlci9FZGdlICovXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IC8qIENocm9tZSBhbmQgT3BlcmEgKi9cbn1cblxuOjpuZy1kZWVwIC5wcmV2aWV3U2F2ZSA+ICoge1xuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ubWF0LWRpYWxvZy1hY3Rpb25zIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuXG5oMSB7XG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG59Il19 */\"","module.exports = \"

\\n Save a static image of this page to a PowerChart clinical note?\\n

\\n
Preview:
\\n
\\n
\\n \\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {AfterViewInit, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';\n\n@Component({\n selector: 'app-confirm-save',\n templateUrl: './confirm-save.component.html',\n styleUrls: ['./confirm-save.component.css']\n})\nexport class ConfirmSaveComponent implements AfterViewInit {\n innerHtml: string;\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) readonly data: HTMLCanvasElement) {}\n\n ngAfterViewInit() {\n this.data.setAttribute('id', 'previewImg');\n this.data.setAttribute('style', 'width:500px');\n document.getElementById('previewCanvas').appendChild(this.data);\n }\n\n // The user does not wish to save the snapshot.\n onExit() {\n this.dialogRef.close();\n }\n\n // The user wishes to save the snapshot.\n onConfirm() {\n this.dialogRef.close({\n save: true,\n });\n }\n}\n","module.exports = \"

{{uiConstants.REMOVE_CARD}}

\\n
\\n \\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * Shows a dialog asking the user to confirm whether or not they wish to delete\n * the card.\n */\n@Component({\n selector: 'app-delete-dialog',\n templateUrl: './delete-dialog.component.html',\n styleUrls: ['../../cardcontainer/cardcontainer.component.css']\n})\nexport class DeleteDialogComponent {\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n // The user does not wish to delete the card.\n onExit() {\n this.dialogRef.close();\n }\n\n // The user wishes to delete the card.\n onConfirm() {\n this.dialogRef.close({\n delete: true,\n });\n }\n}\n","module.exports = \".stepContent {\\n margin-bottom: 30px;\\n margin-top: 10px;\\n font-size: 20px;\\n}\\n\\n::ng-deep .mat-horizontal-content-container {\\n padding-bottom: 0px !important;\\n}\\n\\n.stepperButtons {\\n float: right;\\n}\\n\\n.stepperButtons button {\\n margin-right: 5px;\\n}\\n\\n::ng-deep .mat-dialog-container {\\n max-height: 500px !important;\\n}\\n\\nimg {\\n max-width: 100%;\\n}\\n\\n.divider {\\n margin-bottom: 20px;\\n margin-top: 10px;\\n border-top-width: 5px !important;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGlhbG9ncy9oZWxwLWRpYWxvZy9oZWxwLWRpYWxvZy5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsbUJBQW1CO0VBQ25CLGdCQUFnQjtFQUNoQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsOEJBQThCO0FBQ2hDOztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixnQkFBZ0I7RUFDaEIsZ0NBQWdDO0FBQ2xDIiwiZmlsZSI6InNyYy9hcHAvZGlhbG9ncy9oZWxwLWRpYWxvZy9oZWxwLWRpYWxvZy5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnN0ZXBDb250ZW50IHtcbiAgbWFyZ2luLWJvdHRvbTogMzBweDtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG46Om5nLWRlZXAgLm1hdC1ob3Jpem9udGFsLWNvbnRlbnQtY29udGFpbmVyIHtcbiAgcGFkZGluZy1ib3R0b206IDBweCAhaW1wb3J0YW50O1xufVxuXG4uc3RlcHBlckJ1dHRvbnMge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5zdGVwcGVyQnV0dG9ucyBidXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZGlhbG9nLWNvbnRhaW5lciB7XG4gIG1heC1oZWlnaHQ6IDUwMHB4ICFpbXBvcnRhbnQ7XG59XG5cbmltZyB7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmRpdmlkZXIge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBib3JkZXItdG9wLXdpZHRoOiA1cHggIWltcG9ydGFudDtcbn0iXX0= */\"","module.exports = \"
\\n \\n
\\n\\n \\n \\n {{index +1}}\\n \\n \\n
\\n
\\n MedTimeLine Configuration Screen\\n
\\n \\n
\\n
\\n \\n
\\n
\\n\\n \\n
\\n
\\n
\\n Click on the current date range to open the datepicker.\\n
\\n \\n
\\n \\n
\\n
\\n Choose a patient encounter or pre-set time period on the left.\\n
\\n \\n
\\n \\n
\\n
\\n Alternatively, choose a custom date range.\\n
\\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n The Custom Timeline feature allows you to enter custom events.\\n
\\n
\\n
\\n Click the pencil icon to enter edit mode.\\n
\\n \\n
\\n \\n
\\n
\\n Click the timeline at a place where you would like to add a flag.\\n
\\n \\n
\\n \\n
\\n
\\n In the dialog box, enter a title, description, and select a color for the flag.\\n
\\n \\n
\\n \\n
\\n
\\n You can also manually adjust the date and/or time.\\n
\\n
\\n While in edit mode, you can edit an existing flag, which will open up the dialog box again.\\n
\\n \\n
\\n \\n
\\n
\\n You can also remove flags while in edit mode.\\n
\\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n You can enter notes in the main timeline display area.\\n
\\n
\\n
\\n Click the pencil icon to enter edit mode.\\n
\\n \\n
\\n \\n
\\n
\\n Type in your notes, and click the save button to save the note.\\n
\\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n You can add, remove, and rearrange timelines to optimize the data view for specific patients.\\n
\\n
\\n
\\n To add a timeline, click the plus sign, then select Add Data Timeline.\\n Select the timeline type you want to add, then select the specific timeline.\\n
\\n \\n
\\n \\n
\\n You can also add another Custom Timeline or text notes. You can also search for concept through the autocomplete\\n input.\\n
\\n \\n \\n
\\n To remove a timeline, hover your cursor over the timeline you want to remove. Click the X in the upper left\\n corner of the timeline.\\n
\\n \\n \\n
\\n You can undo a deletion of a card, as well.\\n
\\n \\n \\n
\\n To rearrange timelines, click the label or colored handle on the left hand side of the timeline you want to\\n move, and hold the mouse button and drag and drop the timeline to your desired location.\\n
\\n \\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n Timelines are categorized and color-coded by a vertical bar on the leftmost side of the data timeline.\\n
\\n
\\n
\\n You can hover over plotted data point and additional data displays in a tooltip.\\n
\\n \\n \\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n
\"","import {Component} from '@angular/core';\nimport {MatDialogRef} from '@angular/material';\n\n\n/**\n * This class holds the logic and template for a tutorial stepper dialog.\n */\n@Component({\n selector: 'app-help-dialog',\n templateUrl: './help-dialog.component.html',\n styleUrls: ['./help-dialog.component.css']\n})\nexport class HelpDialogComponent {\n constructor(public dialogRef: MatDialogRef) {}\n\n onExit() {\n this.dialogRef.close();\n }\n}\n","module.exports = \"::ng-deep .ifuViewer {\\n height: 300px;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGlhbG9ncy9pZnUtZGlhbG9nL2lmdS1kaWFsb2cuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGFBQWE7QUFDZiIsImZpbGUiOiJzcmMvYXBwL2RpYWxvZ3MvaWZ1LWRpYWxvZy9pZnUtZGlhbG9nLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyI6Om5nLWRlZXAgLmlmdVZpZXdlciB7XG4gIGhlaWdodDogMzAwcHg7XG59XG4iXX0= */\"","module.exports = \"

MedTimeLine Instructions For Use

\\n
\\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component} from '@angular/core';\nimport {MatDialogRef} from '@angular/material';\n\n@Component({\n selector: 'app-ifu-dialog',\n templateUrl: './ifu-dialog.component.html',\n styleUrls: ['./ifu-dialog.component.css']\n})\nexport class IfuDialogComponent {\n constructor(public dialogRef: MatDialogRef) {}\n\n onExit() {\n this.dialogRef.close();\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DiagnosticReport} from '../diagnostic-report';\nimport {Narrative} from '../narrative';\nimport {TimestampedObject} from '../sets/fhir-resource-set';\n\n/**\n * A diagnostic report with Narrative text extended.\n * Necessary because Narrative is not officially part of the\n * DSTU2 standard of FHIR, but it is an attribute on the\n * DomainResource model that DiagnosticReport is built on top of\n */\nexport class AnnotatedDiagnosticReport extends TimestampedObject {\n readonly report: DiagnosticReport;\n\n /** Text containing details of the radiology report */\n readonly text: Narrative;\n\n /** HTML string reflecting the content inside the url. */\n readonly attachmentHtml: string;\n\n constructor(report: DiagnosticReport, attachmentHtml?: string) {\n super(report.timestamp);\n\n // Grabbing information from the html text in json only if\n // it exists\n if (report.json.text) {\n this.text = new Narrative(report.json.text);\n }\n\n if (attachmentHtml) {\n this.attachmentHtml = attachmentHtml;\n }\n\n this.report = report;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\n\nimport {MicrobioReport} from '../microbio-report';\nimport {TimestampedObject} from '../sets/fhir-resource-set';\n\n/**\n * A microbio report with the timestamp for a specific culture type extended.\n * Necessary because Cerner's implementation of the microbio data\n * does not include the timestamp with the report, but rather with\n * the object.\n */\nexport class AnnotatedMicrobioReport extends TimestampedObject {\n readonly report: MicrobioReport;\n\n constructor(report: MicrobioReport) {\n // Get the timestamp from the collection time of the specimen.\n let timestamp;\n const specimen = report.specimen;\n if (specimen) {\n timestamp = specimen.collectedDateTime ?\n specimen.collectedDateTime :\n (specimen.collectedPeriod ? specimen.collectedPeriod.start :\n undefined);\n }\n super(timestamp);\n this.report = report;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Duration} from 'luxon';\n\nimport {UI_CONSTANTS} from '../../../constants';\nimport {AnnotatedMedicationOrder} from '../medication-order';\nimport {Observation} from '../observation';\nimport {ResultClassWithTimestamp} from '../sets/fhir-resource-set';\nimport {ObservationSet} from '../sets/observation-set';\n\n/**\n * An Observation with additional information to display in its tooltip.\n */\nexport class AnnotatedObservation extends ResultClassWithTimestamp {\n constructor(\n readonly observation: Observation,\n /**\n * The items in this list are [label, value] pairs to be displayed in\n * a tooltip.\n * This array should be treated as immutable.\n */\n readonly annotationValues = new Array<[string, string]>()) {\n super(observation.label, observation.requestId, observation.timestamp);\n }\n\n /**\n * Makes an AnnotatedObservation for medication monitoring.\n * The annotations read out how long it's been since the prior medication\n * dose, and how long it was until the next medication dose was given.\n * @param observation The monitoring observation to annotate\n * @param medicationOrderSet The medication orders containing the doses of the\n * corresponding medication\n * @throws Error if there are two medication orders in MedicationOrderSet\n * that contain the timestamp of the observation\n */\n static forMedicationMonitoring(\n observation: Observation,\n medicationOrders: AnnotatedMedicationOrder[]): AnnotatedObservation {\n // Look in the medication order set's administrations and find the ones\n // closest in time to this observation.\n let timeSinceLast: Duration;\n let timeBeforeNext: Duration;\n const annotations = new Array<[string, string]>();\n\n if (medicationOrders.length > 0) {\n // Flatten all medication admins within the orders into one list and sort\n const allAdmins = [].concat.apply(\n [],\n medicationOrders.map(\n order => order.medicationAdministrationSet.resourceList));\n const sortedAdmins = allAdmins.sort(\n (a, b) => a.medAdministration.timestamp.toMillis() -\n b.medAdministration.timestamp.toMillis());\n\n let idx = 0;\n while (idx < sortedAdmins.length &&\n sortedAdmins[idx].medAdministration.timestamp <\n observation.timestamp) {\n idx++;\n }\n\n // It's guaranteed that there's a dose before the monitoring point and a\n // dose after the monitoring point since we check to make sure\n // the observation is between the first and last administrations.\n // Here we look up those dose numbers and the time difference between\n // the doses and the monitoring point.\n const doseBeforeObs = sortedAdmins[idx - 1];\n const doseAfterObs = sortedAdmins[idx];\n\n timeSinceLast =\n observation.timestamp.diff(doseBeforeObs.medAdministration.timestamp);\n\n timeBeforeNext =\n doseAfterObs.medAdministration.timestamp.diff(observation.timestamp);\n\n annotations.push([\n UI_CONSTANTS.TIME_SINCE_PREVIOUS_DOSE, timeSinceLast.toFormat('h:mm')\n ]);\n\n annotations.push([\n UI_CONSTANTS.TIME_BEFORE_NEXT_DOSE, timeBeforeNext.toFormat('h:mm')\n ]);\n }\n return new AnnotatedObservation(observation, annotations);\n }\n\n /**\n * Makes an AnnotatedObservation for blood pressure, with information about\n * the blood pressure location.\n * @param observation The monitoring observation to annotate\n * @param locationSet The ObservationSet containing Blood Pressure location\n * observations.\n * @throws Error if there are two observations in locationSet\n * that contain the timestamp of the observation\n */\n static forBloodPressure(\n observation: Observation,\n locationSet: ObservationSet): AnnotatedObservation {\n const annotations = new Array<[string, string]>();\n // Find the medication order set that coincides in time with this\n // administration (if any).\n if (locationSet) {\n for (const locationObs of locationSet.resourceList) {\n if (locationObs.observation.timestamp.equals(observation.timestamp)) {\n annotations.push(\n ['Blood Pressure Location', locationObs.observation.result]);\n }\n }\n }\n\n return new AnnotatedObservation(observation, annotations);\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * FHIR type from the DSTU2 version of the standard. Used for containing\n * or referencing attachments (additional data content defined in other formats).\n * Fhir Documentation: https://www.hl7.org/fhir/datatypes.html#Attachment\n */\nexport class Attachment {\n /** Mime type of the content: Ex: text/html, application/pdf */\n readonly contentType: string;\n /** Fhir link to location of data */\n readonly url: string;\n\n constructor(jsonPresentedForm: any) {\n this.contentType = jsonPresentedForm.contentType;\n this.url = jsonPresentedForm.url;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {DateTime} from 'luxon';\n\nimport {DiagnosticReportCode} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {ResultError} from '../result-error';\n\nimport {Attachment} from './attachment';\nimport {ResultClassWithTimestamp} from './sets/fhir-resource-set';\n\n/**\n * FHIR element for DiagnosticReportStatus, from the DSTU2 version of the\n * standard.\n * https://www.hl7.org/fhir/valueset-diagnostic-report-status.html\n */\nexport enum DiagnosticReportStatus {\n Registered = 'Registered',\n Partial = 'Partial',\n Preliminary = 'Preliminary',\n Final = 'Final',\n Amended = 'Amended',\n Corrected = 'Corrected',\n Appended = 'Appended',\n Cancelled = 'Cancelled',\n EnteredInError = 'Enteredinerror',\n Unknown = 'Unknown'\n}\n\nconst statusToEnumMap = new Map([\n ['registered', DiagnosticReportStatus.Registered],\n ['partial', DiagnosticReportStatus.Partial],\n ['preliminary', DiagnosticReportStatus.Preliminary],\n ['final', DiagnosticReportStatus.Final],\n ['amended', DiagnosticReportStatus.Amended],\n ['corrected', DiagnosticReportStatus.Corrected],\n ['appended', DiagnosticReportStatus.Appended],\n ['cancelled', DiagnosticReportStatus.Cancelled],\n ['entered-in-error', DiagnosticReportStatus.EnteredInError],\n ['unknown', DiagnosticReportStatus.Unknown],\n]);\n\n/**\n * FHIR element for DiagnosticServiceSectionCodes, from the DSTU2 version\n * of the standard. Used to represent the department/diagnostic service\n * that created the request. The section codes that we are currently\n * using are not in the FHIR documentation, but are in the examples\n * given in the Cerner sandbox environment.\n * TODO: Add more codes when we get more data. (Issue #30)\n * http://hl7.org/fhir/DSTU2/valueset-diagnostic-service-sections.html\n */\nexport enum DiagnosticServiceSectionCodes {\n RadiologyReport = 'RAD',\n CTReport = 'CT'\n}\n\nconst categoryToEnumMap = new Map([\n ['RADRPT', DiagnosticServiceSectionCodes.RadiologyReport],\n ['CT Report', DiagnosticServiceSectionCodes.CTReport],\n]);\n\n/**\n * FHIR resource for DiagnosticReport, from the DSTU2 version of the standard.\n * https://www.hl7.org/fhir/DSTU2/diagnosticreport.html\n *\n * Cerner currently only supports radiology reports\n */\nexport class DiagnosticReport extends ResultClassWithTimestamp {\n /**\n * Request ID of the request that obtained this report data.\n * Returned by Cerner; not a FHIR standard.\n * TODO: Issue #24\n */\n readonly requestId: string;\n\n readonly id: string;\n\n /** Status for this test */\n readonly status: DiagnosticReportStatus;\n\n /** Category of the report*/\n readonly category: DiagnosticServiceSectionCodes;\n\n /** Report code */\n readonly code: ResourceCode;\n\n /**\n * Not readonly to allow editing in fhir-service\n * Attachment representing html/pdf version of the report.\n */\n presentedForm = new Array();\n\n /** Json returned from FHIR; source of truth */\n readonly json: any;\n\n constructor(json: any, requestId: string) {\n super(\n DiagnosticReport.getLabel(json, requestId), requestId,\n DiagnosticReport.getTimestamp(json));\n\n this.requestId = requestId;\n this.json = json;\n\n if (json.id) {\n this.id = json.id;\n }\n\n if (!json.status) {\n throw new ResultError(\n new Set([this.requestId]), 'The report needs a status to be useful.',\n json);\n }\n this.status = statusToEnumMap.get(json.status);\n\n if (json.category) {\n this.category = categoryToEnumMap.get(json.category.text);\n }\n if (json.presentedForm) {\n for (const presented of json.presentedForm) {\n this.presentedForm.push(new Attachment(presented));\n }\n }\n if (json.code) {\n this.code = DiagnosticReportCode.fromCodeString(json.code.text);\n }\n }\n /**\n * Helper function to extract the label to satisfy the requirement\n * for labels in the ResultClassWithTimestamp.\n * Label currently just text of the code, which is 'RADRPT' in the\n * Cerner examples.\n * @param json The JSON retrieved from the server.\n */\n private static getLabel(json: any, requestId: string) {\n let label;\n if (json.code) {\n label = json.code.text;\n } else {\n throw new ResultError(\n new Set([requestId]), 'The report needs a code to be useful.', json);\n }\n return label;\n }\n\n static getTimestamp(json): DateTime {\n return DateTime.fromISO(json.effectiveDateTime);\n }\n}\n","import {fixUnitAbbreviations} from '../utils/unit_utils';\n\n// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * This object represents relevant components of dosage information, provided\n * in MedicationOrders and MedicationAdministrations.\n */\nexport class Dosage {\n readonly quantity: number;\n readonly unit: string;\n readonly route: string;\n readonly text: string;\n\n constructor(json: any) {\n if (json.dosage) {\n if (json.dosage.quantity) {\n this.quantity = json.dosage.quantity.value;\n this.unit = fixUnitAbbreviations(json.dosage.quantity.unit);\n }\n if (json.dosage.route) {\n this.route = json.dosage.route.text;\n }\n /*\n * The text for the dosage usually contains information about the rate of\n * administration, however the format across different\n * MedicationAdministrations is not consistent. Ex: \"500 mg IV q6hr\" vs\n * \"250 mg = 1 caps Oral Once\"\n */\n this.text = json.dosage.text;\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\nimport {ResultError} from '../result-error';\n\n/**\n * This object represents basic information about an Encounter: what its\n * reason and type were, when it happened, and its ID.\n */\nexport class Encounter {\n readonly encounterId: string;\n readonly period: Interval;\n readonly requestId: string;\n\n constructor(json: any, requestId: string) {\n this.encounterId = json.id;\n this.requestId = requestId;\n\n if (!json.period) {\n throw new ResultError(\n new Set([this.requestId]), 'An encounter must have a time period.',\n json);\n }\n\n const startTime = Encounter.getStartTime(json, this.requestId);\n const endTime = Encounter.getEndTime(json, requestId);\n\n if (endTime < startTime) {\n throw new ResultError(\n new Set([this.requestId]),\n 'The start time comes before the end time.', json);\n }\n if (startTime > DateTime.local()) {\n throw new ResultError(\n new Set([this.requestId]), 'The start time is in the future.', json);\n }\n this.period = Interval.fromDateTimes(startTime, endTime);\n }\n\n /* Extracts the start time from JSON representing an Encounter. */\n static getStartTime(json: any, requestId?: string): DateTime {\n if (!json.period.start) {\n throw new ResultError(\n new Set([requestId]), 'An encounter must have a start date.', json);\n }\n return DateTime.fromISO(json.period.start).toLocal();\n }\n\n /* Extracts the end time from JSON representing an Encounter. */\n static getEndTime(json: any, requestId?: string): DateTime {\n let endTime = json.period.end ?\n DateTime.fromISO(json.period.end).toLocal() :\n undefined;\n if (endTime === undefined || (endTime > DateTime.local())) {\n endTime = DateTime.local();\n }\n return endTime;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\nimport {FhirResourceType} from 'src/constants';\n\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../result-error';\nimport {fixUnitAbbreviations} from '../utils/unit_utils';\n\nimport {Dosage} from './dosage';\nimport {ContainedMedication} from './medication';\nimport {FhirResourceSet, ResultClass, ResultClassWithTimestamp} from './sets/fhir-resource-set';\n\n\n/**\n * FHIR element for MedicationAdministrationStatus, from the DSTU2 version of\n * the standard. http://hl7.org/fhir/DSTU2/valueset-medication-admin-status.html\n */\nexport enum MedicationAdministrationStatus {\n IN_PROGRESS = 'In Progress',\n ON_HOLD = 'On Hold',\n COMPLETED = 'Completed',\n ENTERED_IN_ERROR = 'Entered in Error',\n STOPPED = 'Stopped'\n}\n\nconst statusToEnumMap = new Map([\n ['in-progress', MedicationAdministrationStatus.IN_PROGRESS],\n ['on-hold', MedicationAdministrationStatus.ON_HOLD],\n ['completed', MedicationAdministrationStatus.COMPLETED],\n ['entered-in-error', MedicationAdministrationStatus.ENTERED_IN_ERROR],\n ['stopped', MedicationAdministrationStatus.STOPPED],\n]);\n\n\n/**\n * This object represents a FHIR MedicationAdministration. It does not contain\n * all the information in a standard MedicationAdministration (see\n * https://www.hl7.org/fhir/DSTU2/medicationadministration.html) but instead\n * stores only the information we're interested in seeing.\n */\nexport class MedicationAdministration extends ResultClassWithTimestamp {\n static readonly MED_RESOURCE_TYPE = 'Medication';\n\n readonly wasNotGiven: boolean;\n readonly dosage: Dosage;\n readonly containedMedications: ContainedMedication[] = [];\n readonly effectiveDateTime: DateTime;\n readonly rxNormCode: RxNormCode;\n readonly medicationOrderId: string;\n readonly status: MedicationAdministrationStatus;\n\n /**\n * Makes an MedicationAdministration out of a JSON object that represents a\n * a FHIR MedicationAdministration.\n * https://www.hl7.org/fhir/DSTU2/medicationadministration.html\n * @param json A JSON object that represents a FHIR MedicationAdministration.\n * @param requestId The x-request-id of the request that acquired this\n * medication administration's data.\n */\n constructor(json: any, requestId: string) {\n super(\n json.medicationReference ? json.medicationReference.display :\n json.medicationCodeableConcept ?\n json.medicationCodeableConcept.text :\n null,\n requestId, MedicationAdministration.getTimestamp(json));\n this.rxNormCode = ResultClass.extractMedicationEncoding(json);\n this.medicationOrderId = json.prescription && json.prescription.reference ?\n json.prescription.reference.replace(\n FhirResourceType.MedicationOrder + '/', '') :\n null;\n\n this.dosage = new Dosage(json);\n this.wasNotGiven = json.wasNotGiven;\n this.status = statusToEnumMap.get(json.status);\n\n if (json.contained && json.contained.length > 0) {\n // We first find the element that lists the \"ingredients\" of this\n // MedicationAdministration with each corresponding dosage and reference\n // id. This element of \"contained\" will have the same id as the overall\n // MedicationAdministration's medicationReference number.\n const referenceId =\n json.medicationReference ? json.medicationReference.reference : null;\n\n const ingredientReferences = new Map();\n if (referenceId) {\n const index = json.contained.findIndex(\n el =>\n (el.resourceType ===\n MedicationAdministration.MED_RESOURCE_TYPE &&\n el.product && el.id === referenceId.replace('#', '')));\n const listOfIngredients = json.contained[index];\n if (listOfIngredients && listOfIngredients.product.ingredient) {\n for (const el of listOfIngredients.product.ingredient) {\n if (el.item && el.amount) {\n ingredientReferences.set(el.item.reference.replace('#', ''), el);\n }\n }\n }\n // Remove the element similar to a \"list of ingredients\" from contained.\n if (index > -1) {\n json.contained.splice(index, 1);\n }\n }\n if (ingredientReferences.size > 0 && json.contained.length > 1) {\n // We map the Medications in the list of ingredients to JSON elements\n // containing the RxNorms for each ingredient.\n for (const ing of json.contained) {\n this.containedMedications.push(new ContainedMedication(\n ing, ingredientReferences, this.requestId));\n }\n }\n }\n\n if (!(this.rxNormCode && this.label)) {\n // If a MedicationAdministration has \"Contained\" portions of different\n // ingredients, then there might not be one single RxNorm corresponding to\n // this administration.\n\n // We throw an error if all contained medications do not\n // have an RxNormCode, or if there are no contained medications.\n if (this.containedMedications.length === 0 ||\n (this.containedMedications.length > 0 &&\n this.containedMedications.every(med => (med.code === undefined)))) {\n throw new ResultError(\n new Set([this.requestId]),\n 'JSON must include RxNormCode and a label' +\n ' to be included as a MedicationAdministration.',\n json);\n }\n }\n }\n static getTimestamp(json): DateTime {\n return json.effectiveTimeDateTime ?\n DateTime.fromISO(json.effectiveTimeDateTime).toUTC() :\n json.effectiveTimePeriod ?\n DateTime.fromISO(json.effectiveTimePeriod.start).toUTC() :\n null;\n }\n}\n\n/**\n * A set of MedicalAdministrations that belong together as part of the same\n * series.\n */\nexport class MedicationAdministrationSet extends\n FhirResourceSet {\n readonly maxDose: number;\n readonly minDose: number;\n readonly unit: string;\n readonly rxNormCode: RxNormCode;\n\n /**\n * Constructor for MedicationAdministrationSet.\n * @param medicationAdministrationList The list of MedicationAdministrations\n * belonging together.\n * @throws Error if the administrations have different labels or RxNorms,\n * or if there is not a label, or if the administrations have different\n * units.\n */\n constructor(medicationAdministrationList: AnnotatedAdministration[]) {\n super(medicationAdministrationList);\n\n const rxNorms =\n medicationAdministrationList.map(x => x.medAdministration.rxNormCode);\n if (new Set(rxNorms).size > 1) {\n throw new ResultError(\n this.requestIds,\n `Different RxNorms for administrations: ${rxNorms}.`);\n }\n this.rxNormCode = rxNorms[0];\n\n this.minDose = Math.min(...medicationAdministrationList.map(\n x => x.medAdministration.dosage.quantity));\n this.maxDose = Math.max(...medicationAdministrationList.map(\n x => x.medAdministration.dosage.quantity));\n\n const units = new Set(\n medicationAdministrationList.map(x => x.medAdministration.dosage.unit));\n if (units.size > 1) {\n throw new ResultError(\n this.requestIds,\n `Different units in the administration set: ${\n Array.from(units.values())}.`);\n }\n this.unit = fixUnitAbbreviations(Array.from(units.values())[0]);\n }\n}\n\n/**\n * A MedicationAdministration with additional information relating it to\n * the other administrations in the same order.\n */\nexport class AnnotatedAdministration extends ResultClass {\n /** The medication administration to be annotated. */\n readonly medAdministration: MedicationAdministration;\n\n /**\n * The annotated dose for the dose prior to this one. Undefined if this is\n * the first dose.\n */\n readonly previousDose: AnnotatedAdministration;\n\n constructor(\n medAdmin: MedicationAdministration, prevDose?: AnnotatedAdministration) {\n super(medAdmin.label, medAdmin.requestId);\n this.medAdministration = medAdmin;\n this.previousDose = prevDose;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Disable this check because it's for IE 11 compatibility and we're not worried\n// about that in our testing code.\n/* tslint:disable:object-literal-shorthand*/\n\nimport {AnnotatedAdministration, MedicationAdministration, MedicationAdministrationSet} from '../fhir-resources/medication-administration';\nimport {FhirResourceSet, ResultClass} from '../fhir-resources/sets/fhir-resource-set';\nimport {MedicationConceptGroup, RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../result-error';\nimport {fixUnitAbbreviations} from '../utils/unit_utils';\n\n/**\n * FHIR element for MedicationOrderStatus, from the DSTU2 version of the\n * standard.\n * http://hl7.org/fhir/DSTU2/valueset-medication-order-status.html\n */\nexport const MedicationOrderStatus = {\n ACTIVE: 'active',\n ON_HOLD: 'on-hold',\n COMPLETED: 'completed',\n ENTERED_IN_ERROR: 'entered-in-error',\n STOPPED: 'stopped',\n DRAFT: 'draft',\n};\n\n/**\n * This object represents a FHIR MedicationOrder. It does not contain\n * all the information in a standard MedicationOrder (see\n * https://www.hl7.org/fhir/DSTU2/medicationorder.html) but instead\n * stores only the information we're interested in seeing.\n */\nexport class MedicationOrder extends ResultClass {\n readonly rxNormCode: RxNormCode;\n readonly dosageRetrievalError = 'Could not retrieve dosage instructions.';\n readonly status: string;\n readonly orderId: string;\n\n // By default, we set the instruction message as the retrieval error message,\n // and change it if we find a valid dosage instruction.\n dosageInstruction = this.dosageRetrievalError;\n /**\n * Makes an MedicationOrder out of a list of MedicationAdministrations.\n * https://www.hl7.org/fhir/DSTU2/medicationorder.html\n * @param json The json representing this MedicationOrder.\n * @param requestId The x-request-id of the request that acquired this\n * medication order's data.\n */\n constructor(private json: any, requestId: string) {\n // A MedicationOrder's label is one of the following in order of preference:\n // 1) the medication reference's display anme\n // 2) the medication encoding's text\n // 3) the order's ID\n super(\n json.medicationReference ? json.medicationReference.display :\n json.medicationCodeableConcept ?\n json.medicationCodeableConcept.text :\n json.id,\n requestId);\n\n if (json.dosageInstruction && json.dosageInstruction[0]) {\n if (json.dosageInstruction.length > 1) {\n throw new ResultError(\n new Set([this.requestId]),\n 'JSON must only include one dosage instruction.', json);\n }\n this.dosageInstruction = json.dosageInstruction[0].text;\n }\n this.orderId = json.id;\n this.status = json.status;\n\n this.rxNormCode = ResultClass.extractMedicationEncoding(json);\n\n if (!(this.rxNormCode && this.label)) {\n throw new ResultError(\n new Set([this.requestId]),\n 'JSON must include RxNormCode and a label to be included as a MedicationOrder.',\n json);\n }\n\n // Check this MedicationOrder label against the RxNorm label.\n if (this.label.toLowerCase() !== this.rxNormCode.label.toLowerCase()) {\n throw new ResultError(\n new Set([this.requestId]),\n `The label for this MedicationOrder's RxNorm code doesn't match ` +\n `the label in the data. MedicationOrder label: ${this.label}. ` +\n `RxNorm label: ${this.rxNormCode.label}.`);\n }\n }\n}\n\n/**\n * This object stores a FHIR MedicationOrder object along with additional\n * information including MedicationAdministration information.\n *\n * During initialization, it calculates first/last medication administrations\n * based on the list of medication administrations that the\n * AnnotatedMedicationOrder is initialized with. It does NOT fetch all\n * administrations for the entire order - since this is a very time consuming\n * FHIR call.\n */\nexport class AnnotatedMedicationOrder extends ResultClass {\n readonly order: MedicationOrder;\n\n /**\n * MedicationAdministrationSet associated with the order. This is based\n * on the MedicationAdministrations that this object is initialized with.\n * It may not represent all medication administrations for the entire order.\n */\n medicationAdministrationSet: MedicationAdministrationSet;\n\n /**\n * The MedicationAdministration that occured first. This comes from the list\n * of medication administrations that this object is initialized with. It\n * may not be the first administration of the whole order.\n */\n firstAdministration: MedicationAdministration;\n\n\n /**\n * The MedicationAdministration that occured last. This comes from the list\n * of medication administrations that this object is initialized with. It\n * may not be the last administration of the whole order.\n */\n lastAdministration: MedicationAdministration;\n\n constructor(\n order: MedicationOrder,\n medicationAdministrations: MedicationAdministration[]) {\n super(order.label, order.requestId);\n this.order = order;\n this.setMedicationAdministrations(medicationAdministrations);\n }\n\n /**\n * Sets the MedicationAdministration info for this AnnotatedMedicationOrder.\n * @param medicationAdministrations MedicationAdministrations associated with\n * the order.\n * @throws Error if the label for the list of administrations does not match\n * the label for this order.\n */\n private setMedicationAdministrations(medicationAdministrations:\n MedicationAdministration[]): void {\n if (!medicationAdministrations) {\n return;\n }\n const sortedMedAdmins = medicationAdministrations.sort((a, b) => {\n return a.timestamp.toMillis() - b.timestamp.toMillis();\n });\n this.firstAdministration = sortedMedAdmins[0];\n this.lastAdministration =\n sortedMedAdmins[medicationAdministrations.length - 1];\n\n const annotatedAdmins = [];\n for (let i = 0; i < sortedMedAdmins.length; i++) {\n const admin = sortedMedAdmins[i];\n // if i = 0, this is the first dose so we set the previous\n // dose to undefined. Otherwise, the previous dose is the\n // medication administration at the previous index\n const previousDose = i > 0 ? annotatedAdmins[i - 1] : undefined;\n const annotated = new AnnotatedAdministration(admin, previousDose);\n annotatedAdmins.push(annotated);\n }\n this.medicationAdministrationSet =\n new MedicationAdministrationSet(annotatedAdmins);\n }\n}\n\n/**\n * A set of MedicationOrders that belong together as part of the same\n * series, representing all orders for the medicine in a given time period.\n */\nexport class MedicationOrderSet extends\n FhirResourceSet {\n /*\n * The RxNormCode for this set of data. All data in this set\n * must have the same RxNormCode.\n */\n readonly rxNormCode: RxNormCode;\n readonly medicationConcept: MedicationConceptGroup;\n\n readonly maxDose: number;\n readonly minDose: number;\n readonly unit: string;\n\n /**\n * Constructor for MedicationOrderSet.\n * @param MedicationOrderList The list of MedicationOrders belonging\n * together. This list is sorted by first MedicationAdministration for\n * each order.\n * @throws Error if the observations have different labels/RxNormCodes, or\n * if there is not a label/RxNormCode.\n */\n constructor(medicationOrderList: AnnotatedMedicationOrder[]) {\n // Sort the list by first administration.\n medicationOrderList = medicationOrderList.sort((a, b) => {\n return a.firstAdministration.timestamp.toMillis() -\n b.firstAdministration.timestamp.toMillis();\n });\n super(medicationOrderList);\n // Set the RxNormCode and MedicationConceptGroup for this\n // MedicationOrderSet.\n if (medicationOrderList.length > 0) {\n const firstRxNorm = medicationOrderList[0].order.rxNormCode;\n if (!firstRxNorm) {\n throw new ResultError(\n this.requestIds,\n 'The first resource does not have an RxNorm code.');\n }\n\n for (const rs of medicationOrderList) {\n if (rs.order.rxNormCode !== firstRxNorm) {\n throw new ResultError(\n this.requestIds,\n 'The resource list in this set has mixed RxNorm codes.');\n }\n }\n this.rxNormCode = firstRxNorm;\n this.medicationConcept = this.rxNormCode.displayGrouping;\n\n this.minDose = Math.min(...medicationOrderList.map(\n x => x.medicationAdministrationSet.minDose));\n this.maxDose = Math.max(...medicationOrderList.map(\n x => x.medicationAdministrationSet.maxDose));\n\n const units = new Set(\n medicationOrderList.map(x => x.medicationAdministrationSet.unit));\n if (units.size > 1) {\n throw new ResultError(\n this.requestIds,\n `Different units in the order set: ${Array.from(units.values())}`);\n }\n this.unit = fixUnitAbbreviations(Array.from(units.values())[0]);\n }\n }\n}\n/* tslint:enable:object-literal-shorthand*/\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../result-error';\n\nimport {Dosage} from './dosage';\nimport {ResultClass} from './sets/fhir-resource-set';\n\n/**\n * This object represents relevant components of a medication contained as part\n * of a MedicationAdministration.\n * This is not a FHIR resource, and differs from the defined Medication\n * documentation at http://hl7.org/fhir/dstu2/medication.html.\n */\nexport class ContainedMedication extends ResultClass {\n readonly code: RxNormCode;\n readonly dosage: Dosage;\n readonly id: string;\n constructor(json: any, ingredients: Map, requestId: string) {\n super(json.code ? json.code.text : null, requestId);\n // We want to construct new Medications for jsons containing RxNorm codes.\n if (json.resourceType !== 'Medication') {\n throw new ResultError(\n new Set([this.requestId]), 'Resource must be of type Medication',\n json);\n }\n if (json.code) {\n if (json.code.coding) {\n this.code =\n json.code.coding\n .map(\n // Map the codes to a boolean that is true only if the\n // encoding is an RxNormCode encoding, and the RxNorm code\n // appeas in our RxNormCode list that we care about.\n (coding) => (!coding.system ||\n coding.system.indexOf(\n RxNormCode.CODING_STRING) !== -1) &&\n RxNormCode.fromCodeString(coding.code))\n // Filter out any codes that are not RxNorm codes.\n .filter((code) => !!code)[0];\n }\n }\n if (!this.code) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Medication must have RxNorm code to be useful', json);\n }\n this.id = json.id;\n const reference = ingredients.get(this.id);\n if (!reference) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Medication info must have been contained in ingredient list.', json);\n }\n if (this.id) {\n // The dosage format is different for contained\n // portions of Medications.\n const dosage = {\n dosage: {\n quantity: {\n value: reference.amount.numerator ?\n reference.amount.numerator.value :\n null,\n unit: reference.amount.numerator ? reference.amount.numerator.unit :\n null\n },\n }\n };\n this.dosage = new Dosage(dosage);\n }\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {FhirResourceType} from '../../constants';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {ResultError} from '../result-error';\n\nimport {DiagnosticReportStatus} from './diagnostic-report';\nimport {Observation} from './observation';\nimport {Specimen} from './specimen';\n\n// TODO: Issue #31 (Update mapping for string enums)\n// https://stackoverflow.com/questions/44883072/reverse-mapping-for-string-enums\nconst statusToEnumMap = new Map([\n ['registered', DiagnosticReportStatus.Registered],\n ['partial', DiagnosticReportStatus.Partial],\n ['preliminary', DiagnosticReportStatus.Preliminary],\n ['final', DiagnosticReportStatus.Final],\n ['amended', DiagnosticReportStatus.Amended],\n ['corrected', DiagnosticReportStatus.Corrected],\n ['appended', DiagnosticReportStatus.Appended],\n ['cancelled', DiagnosticReportStatus.Cancelled],\n ['entered-in-error', DiagnosticReportStatus.EnteredInError],\n ['unknown', DiagnosticReportStatus.Unknown],\n]);\n\n/**\n * Resource for MicrobioReport.\n * The parsing for this class is heavily influenced by the custom API BCH\n * built to return DiagnosticReports for microbiology data. In particular, we\n * only parse out specimens and results from the \"contained\" portion of the\n * resource instead of supporting retrieval by reference since the Cerner\n * implementation of the FHIR standard won't allow microbiology retrieval.\n *\n * This currently does not extend DiagnosticReport. TODO: Issue #24- maintain\n * More clearly delineate what belongs in FHIR resources and what is\n * added/derived\n */\nexport class MicrobioReport {\n readonly id: string;\n\n /** Specimen this report is based on */\n readonly specimen: Specimen;\n\n /** Results in the form of observations */\n readonly results = new Array();\n\n /** Status for this test */\n readonly status: DiagnosticReportStatus;\n\n /** Request ID of the request that obtained this report data */\n readonly requestId: string;\n\n constructor(json: any, requestId: string) {\n this.requestId = requestId;\n\n if (json.id) {\n this.id = json.id;\n }\n\n if (!json.status) {\n throw new ResultError(\n new Set([this.requestId]), 'The report needs a status to be useful.',\n json);\n }\n this.status = statusToEnumMap.get(json.status);\n\n // Contained resources may be either specimens or observations.\n const contained = json.contained;\n const specimens = [];\n for (const rsc of contained) {\n if (rsc.resourceType === FhirResourceType.Specimen) {\n specimens.push(new Specimen(rsc, this.requestId));\n } else if (rsc.resourceType === FhirResourceType.Observation) {\n try {\n this.results.push(new Observation(rsc, this.requestId));\n } catch (err) {\n // silently ignore observations within diagnostic reports that have\n // errors. Errors may occur because an observation may not have a\n // LOINC code we recognize or may have an inconsistent label.\n // Please see Observation constructor for all error cases.\n console.log(err);\n }\n }\n // Silently ignore all other contained resource types.\n }\n if (specimens.length > 1) {\n throw new ResultError(\n new Set([this.requestId]),\n 'The report cannot have multiple specimens.');\n }\n this.specimen = specimens[0];\n }\n\n /**\n * The custom microbiology API provided does not allow for calling for\n * a specific microbio code, so this function parses the entire anticipated\n * JSON repsonse and filters by code.\n * @param json The JSON retrieved from the server.\n * @param codeGroup The CodeGroup of tests we're looking for.\n */\n static parseAndFilterMicrobioData(json: any, codeGroup: BCHMicrobioCodeGroup):\n MicrobioReport[] {\n if (!json || !json.entry) {\n return [];\n }\n // We cannot get the request ID from the Microbiology response. Therefore\n // we hardcode the request ID to just be a constant string.\n const requestId = 'Microbiology Request';\n\n const diagnosticReports: MicrobioReport[] = json.entry.map(\n result => new MicrobioReport(result.resource, requestId));\n\n const mapToUpdate = new Map();\n // Get all unique codes for all DiagnosticReport results.\n for (const report of diagnosticReports) {\n const codes: ResourceCode[] =\n report.results.map(r => r.codes)\n .reduce((prev: ResourceCode[], curr: ResourceCode[]) => {\n return prev.concat(curr);\n }, []);\n const uniqueCodes: ResourceCode[] = Array.from(new Set(codes));\n for (const code of uniqueCodes) {\n let existing = mapToUpdate.get(code);\n if (!existing) {\n existing = [];\n }\n existing.push(report);\n mapToUpdate.set(code, existing);\n }\n }\n let reports = new Array();\n for (const code of codeGroup.resourceCodes) {\n if (mapToUpdate.has(code)) {\n reports = reports.concat(mapToUpdate.get(code));\n }\n }\n return reports;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * Fhir documentation: https://www.hl7.org/fhir/narrative.html\n * Exists as an attribute of DomainResource\n * (https://www.hl7.org/fhir/DSTU2/domainresource.html)\n */\nexport class Narrative {\n /** The original html; might be presented in different formats */\n readonly div: string;\n /** Status of the text: generated | extensions | additional | empty*/\n readonly status: string;\n\n constructor(jsonText: any) {\n if (jsonText) {\n this.div = jsonText.div;\n this.status = jsonText.status;\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/** This is the URL for the coding system for observation interpretations. */\nexport const OBSERVATION_INTERPRETATION_VALUESET_URL =\n 'http://hl7.org/fhir/ValueSet/observation-interpretation';\n\n/**\n * These are codes corresponding to ObservationInterpretations used in\n * MicrobioGraph.\n */\nexport const CHECK_RESULT_CODE = 'CHECKRESULT';\nexport const NEGFLORA_CODE = 'NEGORFLORA';\nexport const NEG_CODE = 'NEG';\nexport const NORMAL = 'N';\nexport const PARTIAL = 'Partial';\n\n/**\n * Represents the possible interpretations for observations. Each interpretation\n * has a code (usually 1-3 characters) plus a text description for display.\n * This class also keeps track of a map of codes to display text.\n */\nexport class ObservationInterpretation {\n static codeToObject = new Map();\n\n readonly code: string;\n readonly display: string;\n\n constructor(code: string, display: string) {\n this.code = code;\n this.display = display;\n ObservationInterpretation.codeToObject.set(code, this);\n }\n}\n\n/**\n * These are the FHIR standard value set values.\n * http://hl7.org/fhir/valueset-observation-interpretation.html\n */\nconst STANDARD_FHIR_INTERPRETATIONS = [\n new ObservationInterpretation('<', 'Off scale low'),\n new ObservationInterpretation('>', 'Off scale high'),\n new ObservationInterpretation('A', 'Abnormal'),\n new ObservationInterpretation('A', 'Critically abnormal'),\n new ObservationInterpretation('AC', 'Anti-complementary substances present'),\n new ObservationInterpretation('B', 'Better'),\n new ObservationInterpretation('D', 'Significant change down'),\n new ObservationInterpretation('DET', 'Detected'),\n new ObservationInterpretation('H', 'High'),\n new ObservationInterpretation('HH', 'Critically high'),\n new ObservationInterpretation('HM', 'Hold for Medical Review'),\n new ObservationInterpretation('HU', 'Very high'),\n new ObservationInterpretation('I', 'Intermediate'),\n new ObservationInterpretation('IE', 'Insufficient evidence'),\n new ObservationInterpretation('IND', 'Indeterminate'),\n new ObservationInterpretation('L', 'Low'),\n new ObservationInterpretation('LL', 'Critically low'),\n new ObservationInterpretation('LU', 'Very low'),\n new ObservationInterpretation(\n 'MS',\n 'Moderately susceptible. Indicates for microbiology susceptibilities only.'),\n new ObservationInterpretation(NORMAL, 'Normal'),\n new ObservationInterpretation('ND', 'Not Detected'),\n new ObservationInterpretation(NEG_CODE, 'Negative'),\n new ObservationInterpretation('NR', 'Non-reactive'),\n new ObservationInterpretation('NS', 'Non-susceptible'),\n new ObservationInterpretation(\n 'null', 'No range defined, or normal ranges don\\'t apply'),\n new ObservationInterpretation(\n 'OBX', 'Interpretation qualifiers in separate OBX segments'),\n new ObservationInterpretation('POS', 'Positive'),\n new ObservationInterpretation('QCF', 'Quality Control Failure'),\n new ObservationInterpretation('R', 'Resistant'),\n new ObservationInterpretation('RR', 'Reactive'),\n new ObservationInterpretation('S', 'Susceptible'),\n new ObservationInterpretation('SDD', 'Susceptible-dose dependent'),\n new ObservationInterpretation('SYN-R', 'Synergy - resistant'),\n new ObservationInterpretation('SYN-S', 'Synergy - susceptible'),\n new ObservationInterpretation('TOX', 'Cytotoxic substance present'),\n new ObservationInterpretation('U', 'Significant change up'),\n new ObservationInterpretation(\n 'VS',\n 'Very susceptible. Indicates for microbiology susceptibilities only.'),\n new ObservationInterpretation('W', 'Worse'),\n new ObservationInterpretation('WR', 'Weakly reactive')\n];\n\n/**\n * This valueset is extensible, so here are some that BCH extends it with\n * for its microbiology results.\n */\nconst BCH_CUSTOM_INTERPRETATIONS = [\n new ObservationInterpretation(CHECK_RESULT_CODE, 'Check result'),\n new ObservationInterpretation(NEGFLORA_CODE, 'Negative or Flora')\n];\n\nconst ALL_INTERPRETATIONS =\n [].concat(BCH_CUSTOM_INTERPRETATIONS, STANDARD_FHIR_INTERPRETATIONS);\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\n\nimport {BCHMicrobioCode} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {ResultError} from '../result-error';\nimport {fixUnitAbbreviations} from '../utils/unit_utils';\n\nimport {OBSERVATION_INTERPRETATION_VALUESET_URL, ObservationInterpretation} from './observation-interpretation-valueset';\nimport {ResultClass} from './sets/fhir-resource-set';\n\n\n/**\n * These are the quantity attributes provided by FHIR. See\n * https://www.hl7.org/fhir/datatypes.html#quantity\n */\ninterface Quantity {\n value: number;\n comparator: string;\n unit: string;\n system: string;\n code: string;\n}\n\n/**\n * FHIR element for ObservationStatus, from the DSTU2 version of the\n * standard.\n * http://hl7.org/fhir/DSTU2/valueset-observation-status.html\n */\nexport enum ObservationStatus {\n Registered = 'Registered',\n Preliminary = 'Preliminary',\n Final = 'Final',\n Amended = 'Amended',\n Cancelled = 'Cancelled',\n EnteredInError = 'Enteredinerror',\n Unknown = 'Unknown'\n}\n\nconst statusToEnumMap = new Map([\n ['registered', ObservationStatus.Registered],\n ['preliminary', ObservationStatus.Preliminary],\n ['final', ObservationStatus.Final],\n ['amended', ObservationStatus.Amended],\n ['cancelled', ObservationStatus.Cancelled],\n ['entered-in-error', ObservationStatus.EnteredInError],\n ['unknown', ObservationStatus.Unknown],\n]);\n\n/**\n * This object represents a FHIR Observation. It does not contain all the\n * information in a standard Observation\n * (see https://www.hl7.org/fhir/observation.html#resource) but instead stores\n * only the information we're interested in seeing.\n *\n * In general, in terms of the MedTimeLine app, we represent an Observation\n * as a point on a line graph for a lab or a vital sign. Observations also hold\n * information about microbiology report results that show up in the\n * microbiology graph tooltips.\n */\nexport class Observation extends ResultClass {\n readonly codes: ResourceCode[] = [];\n timestamp: DateTime;\n readonly value: Quantity;\n // Populated if the Observation contains a qualitative result, such\n // as \"Yellow\", rather than a numerical value.\n readonly result: string;\n readonly normalRange: [number, number];\n readonly unit: string;\n readonly innerComponents: Observation[] = [];\n // The display string associated with the code for this Observation.\n readonly display: string;\n readonly interpretation: ObservationInterpretation;\n readonly status: ObservationStatus;\n\n // The number of decimal places stored in the value.\n readonly precision: number;\n\n /**\n * Makes an Observation out of a JSON object that represents a\n * a FHIR observation.\n * @param json A JSON object that represents a FHIR observation.\n * @param requestId The x-request-id of the request that acquired this\n * observation's data.\n */\n constructor(private json: any, requestId: string) {\n super(Observation.getLabel(json), requestId);\n\n this.timestamp = Observation.getTimestamp(json);\n if (json.code) {\n if (json.code.coding) {\n if (json.code.coding[0].system === BCHMicrobioCode.CODING_STRING) {\n this.codes =\n json.code.coding\n .map((coding) => BCHMicrobioCode.fromCodeString(coding.code))\n // Filter out any codes that are not in our mapping.\n .filter((code) => !!code);\n this.display = json.code.coding[0].display;\n } else {\n this.codes =\n json.code.coding\n .map(\n // Map the codes to a boolean that is true only if the\n // encoding is a LOINC encoding, and the LOINC code appeas\n // in our LOINCCode list that we care about.\n (coding) => (!coding.system ||\n coding.system.indexOf(\n LOINCCode.CODING_STRING) !== -1) &&\n LOINCCode.fromCodeString(coding.code))\n // Filter out any codes that are not LOINC codes.\n .filter((code) => !!code);\n }\n }\n }\n\n if (json.interpretation) {\n if (json.interpretation.coding) {\n const coding = json.interpretation.coding[0];\n if (coding.system === OBSERVATION_INTERPRETATION_VALUESET_URL) {\n if (ObservationInterpretation.codeToObject.has(coding.code)) {\n this.interpretation =\n ObservationInterpretation.codeToObject.get(coding.code);\n } else {\n throw new ResultError(\n new Set([this.requestId]), 'Unsupported interpretation code.',\n coding);\n }\n }\n } else if (json.interpretation.text) {\n // BCH uses a non-standard coding system so we make interpretations on\n // the fly.\n this.interpretation = new ObservationInterpretation(\n json.interpretation.text, json.interpretation.text);\n }\n }\n\n if (json.component) {\n json.component.forEach(element => {\n const innerObs = new Observation(element, this.requestId);\n if (!innerObs.timestamp) {\n innerObs.timestamp = this.timestamp;\n }\n this.innerComponents.push(innerObs);\n });\n }\n\n if (!this.codes || this.codes.length === 0) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Observations have to have a LOINC code to be useful. ', json);\n }\n\n if (!this.label) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Observations have to have a label to be useful.', json);\n }\n\n // Check the observation label against the LOINC code label.\n if (this.label.toLowerCase() !== this.codes[0].label.toLowerCase()) {\n throw new ResultError(\n new Set([this.requestId]),\n `The label for this observation's LOINC code doesn't match ` +\n `the label in the data. Observation label: ${this.label}. ` +\n `LOINC label: ${this.codes[0].label}. `,\n json);\n }\n\n\n this.value = json.valueQuantity ? json.valueQuantity : null;\n if (this.value) {\n this.unit = fixUnitAbbreviations(this.value.unit);\n }\n\n // We must calculate precision before the value is stored as a number,\n // where precision is lost. If the value stored in the json has\n // a precision of 0 and is less than 1, then we change the precision to\n // 1 to display decimals and better UI.\n\n if (json.valueQuantity && json.valueQuantity.value) {\n const values = json.valueQuantity.value.toString().split('.');\n this.precision = values.length > 1 ? values[1].length : 0;\n if (values[0] === '0' && this.precision === 0) {\n this.precision = 1;\n }\n } else {\n // If the values are not present and are instead displayed as a value\n // of 0, the precision is set to 1 to prevent duplicated display of values\n this.precision = 1;\n }\n\n this.result =\n json.valueCodeableConcept ? json.valueCodeableConcept.text : null;\n if (this.value === null && this.result === null && !this.interpretation &&\n (this.innerComponents && this.innerComponents.length === 0)) {\n throw new ResultError(\n new Set([this.requestId]),\n 'An Observation must have a value, result, inner components, ' +\n 'or an interpretation to be useful.',\n json);\n }\n\n // The FHIR standard says that if there's only one range then it should be\n // what is \"normal\" for that measure. Otherwise they should be labeled.\n // We are going to err on the side of safety and not include a normal\n // range unless there's just the one, and it includes a high and low\n // field. https://www.hl7.org/fhir/DSTU2/observation.html#4.20.4.4\n if (json.referenceRange && json.referenceRange.length === 1) {\n if (json.referenceRange[0].low && json.referenceRange[0].high) {\n this.normalRange = [\n json.referenceRange[0].low.value, json.referenceRange[0].high.value\n ];\n }\n }\n\n this.status = statusToEnumMap.get(json.status);\n }\n\n private static getLabel(json: any) {\n let label;\n if (json.code) {\n label = json.code.text;\n if (json.code.coding) {\n if (json.code.coding[0].system === BCHMicrobioCode.CODING_STRING) {\n label = json.code.coding[0].display;\n }\n }\n }\n return label;\n }\n\n static getTimestamp(json: any): DateTime {\n return json.effectiveDateTime ?\n DateTime.fromISO(json.effectiveDateTime).toUTC() :\n json.issued ? DateTime.fromISO(json.issued).toUTC() : null;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {DateTime} from 'luxon';\n\nimport {RxNormCode} from '../../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../../result-error';\n\n\nexport class TimestampedObject {\n constructor(readonly timestamp: DateTime) {}\n}\n\nexport class ResultClassWithTimestamp extends TimestampedObject {\n constructor(\n readonly label: string, readonly requestId: string,\n readonly timestamp: DateTime) {\n super(timestamp);\n }\n}\n\nexport class RawResource {\n constructor(public json: any, public requestId: string) {}\n}\n\n/**\n * A class that has label and requestId attributes.\n *\n * TODO: Figure out how to combine with ResultClassWithTimestamp.\n */\nexport class ResultClass {\n constructor(readonly label: string, readonly requestId: string) {}\n\n /**\n * Parses the passed-in JSON and gets out a RxNormCode.\n *\n * This function prefers to directly get the RxNorm code from the resource's\n * encoding. If it can't get that, it will get the prescription's label,\n * then try to map it back to a RxNorm code. If it can't find a suitable\n * RxNorm code, it will pass back an undefined object.\n */\n static extractMedicationEncoding(json: any): RxNormCode {\n let rxNormCode: RxNormCode;\n if (json.medicationCodeableConcept) {\n if (json.medicationCodeableConcept.coding) {\n rxNormCode =\n (json.medicationCodeableConcept.coding\n .map(\n // Map the codes to a boolean that is true only if the\n // encoding is an RxNorm encoding, and the RxNorm code\n // appears in our RxNormCode list that we care about.\n (coding) => (!coding.system ||\n coding.system.indexOf(\n RxNormCode.CODING_STRING) !== -1) &&\n RxNormCode.fromCodeString(coding.code))\n // Filter out any codes that are not RxNorm codes.\n .filter((code) => !!code))[0];\n }\n return rxNormCode;\n }\n }\n}\n\n/**\n * A set of FHIR resources. All resources that are a part of this set must\n * have the same label.\n */\nexport class FhirResourceSet {\n /**\n * The list of resources that belong together.\n */\n readonly resourceList: T[];\n readonly requestIds: Set;\n\n /*\n * The label for this set of data. All data in this set\n * must have the same label.\n */\n label: string;\n\n /**\n * Constructor for FhirResourceSet.\n * @param resourceList The list of resources belonging together.\n * @throws Error if the resources have different labels, or if there is not\n * a label.\n */\n constructor(resourceList: T[]) {\n this.requestIds = new Set(resourceList.map(resource => resource.requestId));\n\n if (!resourceList) {\n throw new ResultError(this.requestIds, 'Resource list is undefined.');\n }\n\n if (resourceList.length > 0) {\n const firstLabel = resourceList[0].label;\n if (!firstLabel) {\n throw new ResultError(\n this.requestIds, 'The first resource does not have a label.');\n }\n\n const allLabels = new Set(resourceList.map(rs => rs.label.toLowerCase()));\n if (allLabels.size !== 1) {\n throw new ResultError(\n this.requestIds,\n `The resource list in this set has mixed labels: ${\n Array.from(allLabels.values())}`);\n }\n this.label = firstLabel;\n }\n\n this.resourceList = resourceList;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\n\nimport {fixUnitAbbreviations} from '../../utils/unit_utils';\nimport {AnnotatedObservation} from '../annotated/annotated-observation';\n\nimport {FhirResourceSet} from './fhir-resource-set';\n\n/**\n * A set of observations that belong together as part of the same series.\n */\nexport class ObservationSet extends FhirResourceSet {\n /**\n * The normal ranges for this set of observations. It maps a timestamp of each\n * Observation with a normal range to the corresponding normal range.\n */\n normalRanges = new Map();\n\n /**\n * The units for this set of observations. Left unset if the normal\n * range is different across the observations.\n */\n readonly unit: string;\n\n /**\n * Whether or not any Observations belonging to this ObservationSet contain\n * qualitative results rather than numerical values.\n */\n readonly anyQualitative: boolean = false;\n\n /**\n * Constructor for ObservationSet.\n * @param observationList The list of observations belonging together.\n * @throws Error if the observations have different labels, as this indicates\n * that they are data points from different series, or if there is not\n * a label.\n */\n constructor(observationList: AnnotatedObservation[]) {\n super(observationList);\n\n let firstUnit;\n if (observationList.length > 0) {\n firstUnit = observationList[0].observation.unit;\n }\n // Ensure that the labels of the data are all the same.\n let differentUnits = false;\n\n for (const obs of observationList) {\n // Some observations may not have a normal range.\n if (obs.observation.normalRange) {\n this.normalRanges.set(\n obs.observation.timestamp, obs.observation.normalRange);\n }\n // Some observations may not have a normal range.\n if (obs.observation.unit && obs.observation.unit !== firstUnit) {\n differentUnits = true;\n }\n }\n if (!differentUnits && firstUnit) {\n this.unit = fixUnitAbbreviations(firstUnit);\n }\n\n this.anyQualitative = observationList.some(\n obs => (obs.observation.result !== null && !obs.observation.value));\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\nimport {ResultError} from '../result-error';\n/**\n * FHIR resource for a Specimen, from the DSTU2 standard.\n * https://www.hl7.org/fhir/DSTU2/specimen.html\n */\nexport class Specimen {\n /** If this is a contained resource, then it will have an ID string. */\n readonly id: string;\n\n /** Kind of material that forms the specimen */\n readonly type: string;\n\n /** Where the specimen was collected */\n readonly bodySite: string;\n\n /**\n * When the specimen was collected. The specimen will have one or the other\n * of these defined, but not both.\n */\n readonly collectedDateTime: DateTime;\n readonly collectedPeriod: Interval;\n\n readonly requestId: string;\n\n constructor(json: any, requestId: string) {\n this.requestId = requestId;\n\n if (json.id) {\n this.id = json.id;\n }\n\n if (!json.type) {\n throw new ResultError(\n new Set([this.requestId]),\n 'A specimen must have a type to be useful.', json);\n }\n\n this.type = json.type.text;\n\n if (!json.collection) {\n throw new ResultError(\n new Set([this.requestId]),\n 'A specimen must have collection information to be useful.', json);\n }\n if (json.collection.collectedPeriod && json.collection.collectedDateTime) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Only collectedPeriod or collectionDateTime should be defined.' +\n json);\n }\n\n if (json.collection.collectedPeriod) {\n const collectedPeriod = json.collection.collectedPeriod;\n // If only the start time is present, put it into collectedDateTime.\n if (collectedPeriod.start && !collectedPeriod.end) {\n this.collectedDateTime = DateTime.fromISO(collectedPeriod.start);\n } else {\n this.collectedPeriod = Interval.fromDateTimes(\n DateTime.fromISO(collectedPeriod.start),\n DateTime.fromISO(collectedPeriod.end));\n }\n }\n\n if (json.collection.collectedDateTime) {\n this.collectedDateTime =\n DateTime.fromISO(json.collection.collectedDateTime);\n }\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\n\nimport {APP_TIMESPAN, FhirResourceType} from '../../constants';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {DiagnosticReport} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration} from '../fhir-resources/medication-administration';\nimport {Observation} from '../fhir-resources/observation';\nimport {RawResource, ResultClass, ResultClassWithTimestamp} from '../fhir-resources/sets/fhir-resource-set';\n\nconst GREATER_OR_EQUAL = 'ge';\nconst LESS_OR_EQUAL = 'le';\nconst LESS_THAN = 'lt';\n\n/**\n * Gets the next page of search results from the smart API. This function\n * assumes that the same smartApi was used to call the original search.\n *\n * @param smartApi The resolved smartOnFhirClient\n * @param response The response from the previous page of search results\n * @param results The list of all formatted results processed in previous page\n * responses\n */\nfunction getNextSearchResultsPage(\n smartApi,\n response,\n results,\n ): Promise {\n const requestId = response.headers('x-request-id');\n const responseData = response.data.entry || [];\n\n results = results.concat(\n responseData.map(result => new RawResource(result.resource, requestId)));\n\n // if there are anymore pages, get the next set of results.\n if (response.data.link.some((linkItem) => linkItem.relation === 'next')) {\n return smartApi.patient.api.nextPage({bundle: response.data})\n .then(\n nextResponse => {\n return getNextSearchResultsPage(smartApi, nextResponse, results);\n },\n rejection => {\n throw rejection;\n });\n }\n return Promise.resolve(results);\n}\n\n/**\n * Gets all pages of search results for the given query params. Formats\n * the results into RawResource objects.\n *\n * @param smartApi The resolved smartOnFhirClient\n * @param queryParams the params to pass to the search function\n */\nfunction fetchAllFromFhir(smartApi, queryParams): Promise {\n const results = [];\n return smartApi.patient.api.search(queryParams)\n .then(\n response => {\n return getNextSearchResultsPage(smartApi, response, results)\n .then(res => {\n return res.filter(result => !!result);\n });\n },\n rejection => {\n throw rejection;\n });\n}\n\n/**\n * Abstract Class for Fetching and Caching FHIR Resources.\n */\nexport abstract class FhirCache {\n /**\n * Cache of Raw Resources.\n * A mapping from the timestamp as a date string to a list of RawResources\n * that have that timestamp.\n * We store the date string so that we can test whether the map has a\n * date easily because Datetime equality is not straightforward.\n * We store RawResources instead of the actual resources\n * (MedicationAdministration, Observation, etc) because we want\n * to cache all results, even if one of the resources does not pass the\n * validation done during construction. This way, we do not need to fetch\n * the invalid resource again for the same date range.\n */\n protected cache = new Map();\n\n /**\n * List of RawResources that have a timestamp today. We do not want to\n * cache today's results because we will want to refresh them the next time\n * we fetch the resource in order to get any new results.\n */\n private todaysResults: RawResource[];\n\n /**\n * The time that today's results were last fetched from FHIR. This helps us\n * not fetch today's results more frequently than necessary if results are\n * fetched multiple times during page loading.\n */\n private timeOfLastRefreshOfTodaysResults: DateTime;\n\n /**\n * A function that takes a RawResource object and converts it to the\n * Resource object to be returned.\n *\n * @param result: the RawResource to convert\n * @returns an instance of a Resource that extends ResultClassWithTimestamp\n */\n protected abstract createFunction(result: RawResource): T;\n\n /**\n * A function that takes a date range and returns the search query params\n *\n * @param dateRange: the dateRange to fetch from FHIR\n * @returns the JSON query params to search with.\n */\n protected abstract getQueryParams(dateRange: Interval);\n\n /**\n * A function to get the timestamp from the RawResource. The resulting\n * timestamp will be the cache key for this result.\n *\n * @param result the RawResource object to get the timestamp from\n * @returns the DateTime object representing the time the result happened at\n */\n protected abstract getTimestampFromRawResource(result: RawResource): DateTime;\n\n /**\n * Splits an Interval date range by day.\n *\n * @param dateRange: the Interval to split into days\n * @returns an array of intervals (each 1 day long) corresponding to the days\n * in the given date range.\n */\n private splitDateRangeByDay(dateRange: Interval): Interval[] {\n return Interval\n .fromDateTimes(\n dateRange.start.startOf('day'), dateRange.end.endOf('day'))\n .splitBy({days: 1});\n }\n\n /**\n * Fetches the resources from FHIR for the given date range and updates\n * the cache with these results.\n *\n * The results are stored as RawResources\n * so that a validation error during object creation does not prevent the\n * cache from being updated.\n *\n * @param smartApi: the resolved Smart on FHIR API Client instance\n * @param dateRange: the date range to fetch from FHIR\n */\n fetchResourceAndAddToCache(smartApi, dateRange: Interval): Promise {\n const queryParams = this.getQueryParams(dateRange);\n // fetches the results from FHIR and groups them by timestamp.\n const fetchAllPromise =\n fetchAllFromFhir(smartApi, queryParams).then((results: []) => {\n const resultMap = new Map();\n for (const result of results) {\n const resultDate =\n this.getTimestampFromRawResource(result).toISODate();\n if (!resultMap.has(resultDate)) {\n resultMap.set(resultDate, new Array());\n }\n resultMap.get(resultDate).push(result);\n }\n return resultMap;\n });\n\n // after the data fetch resolves, updates the cache for each day that was\n // fetched with the results that were found. If no results were found for\n // a given day, we set to an empty list.\n return Promise.resolve(fetchAllPromise).then(resultMap => {\n const currentTime = DateTime.utc();\n for (const day of this.splitDateRangeByDay(dateRange)) {\n const dayAsString = day.start.toISODate();\n if (dayAsString === currentTime.toISODate()) {\n this.todaysResults = resultMap.get(dayAsString) || [];\n this.timeOfLastRefreshOfTodaysResults = currentTime;\n } else {\n this.cache.set(dayAsString, resultMap.get(dayAsString) || []);\n }\n }\n });\n }\n\n /** Gets the RawResources from the Cache for each day in the date range. */\n private getResourceFromCache(dateRange: Interval): RawResource[] {\n const results = new Array();\n for (const day of this.splitDateRangeByDay(dateRange)) {\n const dayString = day.start.toISODate();\n if (dayString === DateTime.utc().toISODate()) {\n results.push(...this.todaysResults);\n } else {\n results.push(...this.cache.get(dayString));\n }\n }\n return results;\n }\n\n /**\n * Gets the resources for the given date range.\n *\n * If any days within the date range are not in the cache already, we fetch\n * the results for that range and add them to the cache.\n *\n * Then we return all instances of the Resource that are within the given\n * date range.\n *\n * @param dateRange: the Interval to fetch data within.\n * @returns an array of Resource objects that extend ResultClassWithTimestamp\n */\n getResource(smartApi, dateRange: Interval): Promise {\n // splits the date range by day and checks if the cache contains that day.\n // Merges days not in the cache into a list of intervals that cover those\n // days.\n const rangesToFetch =\n Interval.merge(this.splitDateRangeByDay(dateRange).filter(day => {\n const currentTime = DateTime.utc();\n if (day.start.toISODate() === currentTime.toISODate()) {\n // we filter out today if we have refreshed today's results\n // within the last minute.\n return !(\n this.timeOfLastRefreshOfTodaysResults &&\n currentTime\n .diff(this.timeOfLastRefreshOfTodaysResults, 'minutes')\n .minutes < 1);\n // sometimes due to timezone handling we end up with a date that\n // is after today. We do not need to fetch that date.\n } else if (day.start.toMillis() > currentTime.toMillis()) {\n return false;\n }\n return !this.cache.has(day.start.toISODate());\n }));\n\n // for each date interval, fetch the resource from FHIR and add the data\n // to the cache.\n const fetchPromises = rangesToFetch.map(range => {\n return this.fetchResourceAndAddToCache(smartApi, range);\n });\n\n // after all date ranges have been fetched from FHIR and added to the\n // cache. Get all data from the cache for the full date range.\n return Promise.all(fetchPromises)\n .then(\n _ => {\n return this.getResourceFromCache(dateRange)\n .map(result => this.createFunction(result))\n .filter(result => !!result);\n },\n rejection => {\n throw rejection;\n });\n }\n}\n\n/** Cache for MedicationAdministrations */\nexport class MedicationCache extends FhirCache {\n /** Promise to load all results into the Cache within the App Timespan. */\n resultsLoaded: Promise;\n\n getResource(smartApi, dateRange: Interval):\n Promise {\n // if we have not alraedy loaded all the results into the cache within the\n // App Timespan, add them first. This helps with loading time for subsequent\n // calls for medications.\n if (!this.resultsLoaded) {\n this.resultsLoaded =\n this.fetchResourceAndAddToCache(smartApi, APP_TIMESPAN);\n }\n return this.resultsLoaded.then(() => {\n return super.getResource(smartApi, dateRange);\n });\n }\n\n /**\n * Creates a MedicationAdministration from a RawResource.\n * Note: will return undefined if the Medication Encoding extracted from the\n * RawResource is undefined.\n */\n createFunction(result: RawResource): MedicationAdministration {\n // In the MedicationAdministration constructor we throw an Error if the\n // rxNormCode is undefined. It will be undefined if we do not have a mapping\n // for that rxNormCode. Because we are querying for all\n // MedicationAdministrations (not just a particular code), we need to filter\n // those results out before we try to create the MedicationAdministration\n // object.\n if (ResultClass.extractMedicationEncoding(result.json)) {\n return new MedicationAdministration(result.json, result.requestId);\n }\n }\n\n getQueryParams(dateRange: Interval) {\n return {\n type: FhirResourceType.MedicationAdministration,\n query: {\n effectivetime: {\n $and: [\n GREATER_OR_EQUAL + dateRange.start.toISODate(),\n LESS_OR_EQUAL + dateRange.end.toISODate()\n ]\n },\n notgiven: 'false',\n status: 'in-progress,completed,on-hold',\n // Despite documentation, this is the number of results per page,\n // not the total number of results.\n // https://groups.google.com/d/msg/cerner-fhir-developers/iW8hXIWcRX0/Y9mA__OqAQAJ\n _count: 200\n }\n };\n }\n\n getTimestampFromRawResource(result: RawResource): DateTime {\n return MedicationAdministration.getTimestamp(result.json);\n }\n}\n\n/** Cache for DiagnosticReports */\nexport class DiagnosticReportCache extends FhirCache {\n createFunction(result: RawResource): DiagnosticReport {\n return new DiagnosticReport(result.json, result.requestId);\n }\n\n getQueryParams(dateRange: Interval) {\n return {\n type: FhirResourceType.DiagnosticReport,\n query: {\n date: {\n $and: [\n GREATER_OR_EQUAL + dateRange.start.toISODate(),\n // We are adding one millisecond to the end date because we want\n // less or equal to the date range, but the spec only allows\n // strictly less than param.\n LESS_THAN + dateRange.end.plus({millisecond: 1}).toISODate()\n ]\n }\n }\n };\n }\n\n getTimestampFromRawResource(result: RawResource) {\n return Observation.getTimestamp(result.json);\n }\n}\n\n/** Cache for Observations */\nexport class ObservationCache extends FhirCache {\n /** The LOINCCode that the cached observations are associated with. */\n readonly code: LOINCCode;\n\n constructor(code: LOINCCode) {\n super();\n this.code = code;\n }\n\n createFunction(result: RawResource): Observation {\n return new Observation(result.json, result.requestId);\n }\n\n getQueryParams(dateRange: Interval) {\n return {\n type: FhirResourceType.Observation,\n query: {\n code: LOINCCode.CODING_STRING + '|' + this.code.codeString,\n date: {\n $and: [\n GREATER_OR_EQUAL + dateRange.start.toISODate(),\n LESS_OR_EQUAL + dateRange.end.toISODate()\n ]\n },\n // 100 is the maximum page size allowed by Cerner for observations.\n _count: 100\n }\n };\n }\n\n getTimestampFromRawResource(result: RawResource) {\n return Observation.getTimestamp(result.json);\n }\n}\n\n/** Cache for Encounters. */\nexport class EncounterCache {\n /** List of cached RawResources representing raw Encounters. */\n private cache: RawResource[];\n\n /** The last time the cache was refreshed. */\n private lastFhirFetchTime: DateTime;\n\n /**\n * Gets all Encounters.\n * Note: Encounters cannot be searched by date, so this will return all\n * encounters.\n */\n getResource(smartApi): Promise {\n const currentTime = DateTime.utc();\n let cachePromise;\n // if the last fetch of Encounters from FHIR was within 1 minute, we don't\n // need to fetch them again. Since we may call this method multiple times\n // when loading the page, we want to ensure we aren't making unecessary\n // calls.\n if (this.lastFhirFetchTime &&\n currentTime.diff(this.lastFhirFetchTime, 'minutes').minutes < 1) {\n cachePromise = Promise.resolve(this.cache);\n } else {\n this.lastFhirFetchTime = currentTime;\n const queryParams = {\n type: FhirResourceType.Encounter,\n };\n cachePromise = fetchAllFromFhir(smartApi, queryParams).then(results => {\n this.cache = results;\n this.lastFhirFetchTime = currentTime;\n return results;\n });\n }\n return Promise.resolve(cachePromise)\n .then(\n results => {\n return results\n .filter(result => {\n const status = result.json.status;\n // Lots of encounters have errors where start times come\n // after end times. To reduce those errors surfacing, we\n // pre-parse start and end times, as well as statuses, and\n // only return those encounters that are in the application\n // timespan and aren't cancelled or in the future.\n const startTime = Encounter.getStartTime(result.json);\n const endTime = Encounter.getEndTime(result.json);\n\n const inTimeSpan =\n (startTime && APP_TIMESPAN.contains(startTime)) ||\n (endTime && APP_TIMESPAN.contains(endTime));\n\n return status !== 'cancelled' && status !== 'planned' &&\n inTimeSpan;\n })\n .map(result => new Encounter(result.json, result.requestId));\n },\n rejection => {\n throw rejection;\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {Inject, Injectable} from '@angular/core';\nimport {DateTime, Interval} from 'luxon';\n\nimport {APP_TIMESPAN, EARLIEST_ENCOUNTER_START_DATE, FhirResourceType} from '../../constants';\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {documentReferenceLoinc} from '../conceptmappings/resource-code-manager';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCodeGroup} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {DebuggerService} from '../debugger/debugger.service';\nimport {AnnotatedDiagnosticReport} from '../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReport, DiagnosticReportStatus} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration, MedicationAdministrationStatus} from '../fhir-resources/medication-administration';\nimport {MedicationOrder} from '../fhir-resources/medication-order';\nimport {MicrobioReport} from '../fhir-resources/microbio-report';\nimport {Observation, ObservationStatus} from '../fhir-resources/observation';\nimport * as FhirConfig from '../fhir_config';\n\nimport {DiagnosticReportCache, EncounterCache, MedicationCache, ObservationCache} from './fhir-cache';\nimport {FhirService} from './fhir.service';\nimport {SMART_ON_FHIR_CLIENT} from './smart-on-fhir-client';\n\n@Injectable()\nexport class FhirHttpService extends FhirService {\n /** Cache for all MedicationAdministrations. */\n protected static medicationCache = new MedicationCache();\n\n /** Cache for all DiagnosticReports. */\n protected static diagnosticReportCache = new DiagnosticReportCache();\n\n /**\n * Cache for all Observations. Map from LOINCCode to the ObservationCache\n * for that LOINCCode.\n */\n protected static observationCache = new Map();\n\n /** Cache for all Encounters. */\n protected static encounterCache = new EncounterCache();\n\n readonly smartApiPromise: Promise;\n\n constructor(\n private debugService: DebuggerService,\n @Inject(SMART_ON_FHIR_CLIENT) smartOnFhirClient: any,\n private http: HttpClient, resourceCodeCreator: ResourceCodeCreator) {\n super(resourceCodeCreator);\n // Create a promise which resolves to the smart API when the smart API is\n // ready. This allows clients of this service to call service methods\n // which depend on the API, regardless of whether the API is ready or not.\n this.smartApiPromise = new Promise(\n (resolve, reject) => smartOnFhirClient.oauth2.ready(\n smart => resolve(smart), err => reject(err)));\n }\n\n /**\n * Gets observations from a specified date range with a specific LOINC code.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getObservationsWithCode(code: LOINCCode, dateRange: Interval):\n Promise {\n let cacheForCode = FhirHttpService.observationCache.get(code);\n\n if (!cacheForCode) {\n cacheForCode = new ObservationCache(code);\n FhirHttpService.observationCache.set(code, cacheForCode);\n }\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return cacheForCode.getResource(smartApi, dateRange)\n .then((results: Observation[]) => {\n return results.filter(\n result =>\n result.status !== ObservationStatus.EnteredInError);\n });\n });\n }\n\n /**\n * Checks if there are any observations with the given LOINC Code within the\n * given date range.\n *\n * Note: Only fetches single page of results from FHIR server to enhance\n * performance.\n *\n * @param code LOINC code to check if there are any observations for\n * @param dateRange the time interval the observations should fall between\n */\n observationsPresentWithCode(code: LOINCCode, dateRange: Interval):\n Promise {\n const queryParams = new ObservationCache(code).getQueryParams(dateRange);\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(\n ([smartApi, codes]) =>\n smartApi.patient.api.search(queryParams)\n .then(response => !!response.data.entry));\n }\n\n /**\n * Checks which RxNormCodes are present within the App Timespan.\n *\n * As a result, the MedicationCache is populated with all data within the\n * App Timespan.\n *\n * @returns A Promise that resolves to the Set of RxNormCodes with data\n * available.\n */\n dataAvailableForMedications(): Promise> {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return FhirHttpService.medicationCache\n .getResource(smartApi, APP_TIMESPAN)\n .then((results: MedicationAdministration[]) => {\n const codesPresent = new Set();\n results.forEach(med => codesPresent.add(med.rxNormCode));\n return codesPresent;\n });\n });\n }\n\n /**\n * Gets medication data from a specified date range with a specific Rx code\n * @param code The RxNormCode codes for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getMedicationAdministrationsWithCodes(\n codes: RxNormCode[],\n dateRange: Interval): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return FhirHttpService.medicationCache\n .getResource(smartApi, dateRange)\n .then(\n (results: MedicationAdministration[]) => results.filter(\n result => codes.includes(result.rxNormCode) &&\n result.status !==\n MedicationAdministrationStatus.ENTERED_IN_ERROR));\n });\n }\n\n /**\n * Determines whether their is a medication present with the given code\n * during the given date range\n * @param code The RxNormCode to get medications for\n * @param dateRange The date range to get medications for\n */\n medicationsPresentWithCode(code: RxNormCode, dateRange: Interval):\n Promise {\n return this.getMedicationAdministrationsWithCodes([code], dateRange)\n .then(medAdmins => {\n return medAdmins.length > 0 ? true : false;\n });\n }\n\n /**\n * Gets order for specified external id.\n * @param id The id to pull the order from.\n */\n getMedicationOrderWithId(id: string): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(\n ([smartApi, codes]) =>\n smartApi.patient.api\n .read({type: FhirResourceType.MedicationOrder, 'id': id})\n .then(\n (result: any) => {\n const requestId = result.headers('x-request-id');\n return new MedicationOrder(result.data, requestId);\n },\n // Do not return any MedicationOrders for\n // this code if one of the MedicationOrder\n // constructions throws an error.\n rejection => {\n this.debugService.logError(rejection);\n throw rejection;\n }));\n }\n\n /**\n * Gets the encounters for the patient for any encounter that falls in the\n * given date range.\n * @param dateRange Return all encounters that covered any time in this\n * date range.\n */\n getEncountersForPatient(dateRange: Interval): Promise {\n if (!dateRange) {\n dateRange = APP_TIMESPAN;\n }\n // The Cerner implementation of the Encounter search does not offer any\n // filtering by date at this point, so we grab all the encounters\n // then filter them down to those which intersect with the date range\n // we query, and those that have a start date no earlier than a year\n // prior to now.\n return this.smartApiPromise.then(smartApi => {\n return FhirHttpService.encounterCache.getResource(smartApi).then(\n (results: Encounter[]) =>\n results\n .filter(\n (result: Encounter) =>\n dateRange.intersection(result.period) !== null)\n .filter(\n (result: Encounter) => result.period.start >=\n EARLIEST_ENCOUNTER_START_DATE));\n });\n }\n\n /**\n * Saves the current image of the graphs rendered as a DocumentReference\n * (static save).\n * @param html The inner HTML to keep in the Document.\n * @param date The date the note was written on.\n */\n saveStaticNote(image: HTMLCanvasElement, date: string): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes]).then(([\n smartApi,\n codes\n ]) => {\n const postBody = {\n resourceType: FhirResourceType.DocumentReference,\n subject: {\n reference: [FhirResourceType.Patient, smartApi.patient.id].join('/')\n },\n type: {\n coding: [{\n system: LOINCCode.CODING_STRING, // must be loinc\n code: documentReferenceLoinc.codeString, // Summary Note\n }],\n },\n indexed: DateTime.utc().toISO(),\n status:\n 'current', // Required; only supported option is 'current'\n // https://fhir.cerner.com/millennium/dstu2/infrastructure/document-reference/#body-fields\n content: [{\n attachment: {\n contentType: 'application/xhtml+xml;charset=utf-8',\n data: btoa('')\n }\n }],\n context: {\n encounter: {\n reference: [\n FhirResourceType.Encounter, smartApi.tokenResponse.encounter\n ].join('/')\n }\n }\n };\n return smartApi.patient.api.create({resource: postBody})\n .then(\n resolve => {\n return true;\n },\n reject => {\n return false;\n });\n });\n }\n\n /**\n * Gets the MicrobioReports for the patient for any report that falls in\n * the given date range.\n * @param codeGroup The CodeGroup to retrieve MicrobioReports for.\n * @param dateRange Return all MicrobioReports that covered any time in this\n * date range.\n */\n getMicrobioReports(codeGroup: BCHMicrobioCodeGroup, dateRange: Interval):\n Promise {\n if (!FhirConfig.microbiology) {\n console.warn(\n 'No microbiology parameters available in the configuration.');\n return Promise.resolve([]);\n }\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(\n ([smartApi, codes]) => {\n // YYYY-MM-DD format for dates\n let callParams = new HttpParams();\n callParams = callParams.append('patient', smartApi.patient.id);\n callParams = callParams.append('category', 'microbiology'),\n callParams = callParams.append(\n 'item-date', 'ge' + dateRange.start.toFormat('yyyy-MM-dd'));\n callParams = callParams.append(\n 'item-date', 'le' + dateRange.end.toFormat('yyyy-MM-dd'));\n callParams = callParams.append('_format', 'json');\n\n const authString = btoa(\n FhirConfig.microbiology.username + ':' +\n FhirConfig.microbiology.password);\n const httpHeaders = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Authorization': 'Basic ' + authString,\n });\n\n return this.http\n .get(\n [\n FhirConfig.microbiology.url,\n FhirResourceType.DiagnosticReport\n ].join('/'),\n {headers: httpHeaders, params: callParams})\n .toPromise()\n .then((res: any) => {\n return MicrobioReport.parseAndFilterMicrobioData(\n res, codeGroup);\n });\n },\n rejection => {\n this.debugService.logError(rejection);\n throw rejection;\n });\n }\n\n /**\n * Returns AnnotateDiagnosticReport from a specified date range with a\n * specific DiagnosticReportCodeGroup code.\n *\n * @param code The DiagnosticReportCodeGroup for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getAnnotatedDiagnosticReports(\n codeGroup: DiagnosticReportCodeGroup,\n dateRange: Interval): Promise {\n const codes = codeGroup.resourceCodes;\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return FhirHttpService.diagnosticReportCache\n .getResource(smartApi, dateRange)\n .then((results: DiagnosticReport[]) => {\n const annotatedReportsArr =\n results\n .filter((result: DiagnosticReport) => {\n return codes.includes(result.code) &&\n result.status !==\n DiagnosticReportStatus.EnteredInError;\n })\n .map(report => this.addAttachment(report));\n return Promise.all(annotatedReportsArr);\n });\n });\n }\n\n /**\n * Helper function that makes the HTTP call to get the html attachment.\n * The responseType will always be text, and not the default json.\n * If any error exists, it will catch the http error and return the message\n * @param url Fhir link to location of data\n */\n getAttachment(url: string): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, codes]) => {\n const httpHeaders = new HttpHeaders({\n 'Accept': 'text/html',\n 'Authorization': 'Bearer ' + smartApi.tokenResponse.access_token\n });\n return this.http\n .get(url, {headers: httpHeaders, responseType: 'text'})\n .toPromise()\n .then((res: any) => res)\n .catch(err => err.message);\n });\n }\n}\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2ZoaXItc2VydmVyL2ZoaXItbGF1bmNoL2ZoaXItbGF1bmNoLmNvbXBvbmVudC5jc3MifQ== */\"","module.exports = \"Launching authentication...\\n
\\n Authentication Information
\\n Base URI: {{this.baseURL}}
\\n Redirect URI : {{this.redirectURL}}
\\n Scopes: {{this.scope}};
\\n URL parameters: {{this.parameters}}
\\n \\n
\\nError: This app is not configured for this EHR.\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport 'fhirclient';\n\nimport {Component, OnInit} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\nimport {Router} from '@angular/router';\n\nimport {environment} from '../../../environments/environment';\n\nimport * as FhirConfig from '../../fhir_config';\n\n/* Type definition for SMART on FHIR client (from assets/fhir-client.min.js) */\ndeclare var FHIR: any;\n\n@Component({\n selector: 'app-fhir-launch',\n templateUrl: './fhir-launch.component.html',\n styleUrls: ['./fhir-launch.component.css']\n})\nexport class FhirLaunchComponent implements OnInit {\n error = false;\n\n scope: string = [\n 'launch', 'patient/Observation.read', 'patient/Patient.read',\n 'patient/MedicationOrder.read', 'patient/MedicationAdministration.read',\n 'patient/DocumentReference.read', 'patient/DocumentReference.write',\n 'patient/Encounter.read', 'patient/DiagnosticReport.read',\n 'patient/Binary.read'\n ].join(' ');\n\n // We hold these variables in-class for authentication debugging.\n clientId: string;\n baseURL: string;\n redirectURL: string;\n useDebugger: boolean;\n parameters = new Array();\n\n constructor(private router: Router, private route: ActivatedRoute) {}\n\n ngOnInit() {\n if (environment.useMockServer) {\n this.router.navigate(['setup']);\n } else {\n this.useDebugger = environment.useDebugger;\n\n this.route.queryParams.subscribe(params => {\n const state = params['state'];\n const code = params['code'];\n if (state && code) {\n // Navigate to the setup page, passing the code & state parameters\n // along with the URL.\n this.router.navigateByUrl('/setup?code=' + code + '&state=' + state);\n } else {\n if (this.useDebugger) {\n this.clientId = FhirConfig.credentials.client_id;\n this.baseURL = FhirConfig.url.baseURL;\n this.redirectURL = FhirConfig.url.redirectURL;\n this.route.queryParams.subscribe(pms => {\n this.parameters.push(JSON.stringify(pms));\n });\n return;\n }\n\n this.beginAuthenticationFlow();\n }\n });\n }\n }\n\n beginAuthenticationFlow() {\n const clientId = FhirConfig.credentials.client_id;\n if (!clientId) {\n this.error = true;\n } else {\n FHIR.oauth2.authorize({\n 'client_id': clientId,\n 'scope': this.scope,\n 'redirect_uri': FhirConfig.url.redirectURL\n });\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\nimport {Interval} from 'luxon';\nimport {of} from 'rxjs';\n\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from '../conceptmappings/resource-code-manager';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCodeGroup} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {LOINCCode, LOINCCodeGroup} from '../conceptmappings/resource-codes/loinc-code';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {RxNormCodeGroup} from '../conceptmappings/resource-codes/rx-norm-group';\nimport {AnnotatedDiagnosticReport} from '../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReport} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration} from '../fhir-resources/medication-administration';\nimport {MedicationOrder} from '../fhir-resources/medication-order';\nimport {MicrobioReport} from '../fhir-resources/microbio-report';\nimport {Observation} from '../fhir-resources/observation';\n\n@Injectable()\nexport abstract class FhirService {\n protected loadAllCodes = this.resourceCodeCreator.loadAllConcepts;\n\n constructor(private resourceCodeCreator: ResourceCodeCreator) {}\n\n /**\n * Returns whether there are any observations with this code in the given\n * time range.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n abstract observationsPresentWithCode(code: LOINCCode, dateRange: Interval):\n Promise;\n\n /**\n * Returns whether there are any microbio Reports with this code in the given\n * time range.\n * @param code The BCHMicrobio code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n microbioReportsPresentWithCodes(\n codeGroup: BCHMicrobioCodeGroup, dateRange: Interval): Promise {\n // Just ask for one result to reduce the call time.\n return this.getMicrobioReports(codeGroup, dateRange, 1)\n .then(reports => reports.length > 0, rejection => {\n // If any MicrobioReports for this code results in an error, do not\n // show any MicrobioReports at all.\n throw rejection;\n });\n }\n\n /**\n * Checks which RxNormCodes are present within the App Timespan.\n *\n * @returns A Promise that resolves to the Set of RxNormCodes with data\n * available.\n */\n abstract dataAvailableForMedications(): Promise>;\n\n /**\n * Returns whether there are any annotated diagnosticreports with this code in\n * the given time range.\n * @param code The resource code (for diagnostic reports) for which to get\n * observations.\n * @param dateRange The time interval observations should fall between.\n */\n diagnosticReportsPresentWithCodes(\n codeGroup: DiagnosticReportCodeGroup,\n dateRange: Interval): Promise {\n // Just ask for one result to reduce the call time.\n return this.getAnnotatedDiagnosticReports(codeGroup, dateRange, 1)\n .then(reports => reports.length > 0, rejection => {\n // If any AnnotatedDiagnosticReports for this code results in an\n // error, do not show any AnnotatedDiagnosticReports at all.\n throw rejection;\n });\n }\n\n /**\n * Gets observations from a specified date range with a specific LOINC code.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n * @param limitCount If provided, the maximum number of observations to\n * query for.\n */\n abstract getObservationsWithCode(\n code: LOINCCode,\n dateRange: Interval,\n ): Promise;\n\n /**\n * Gets observations from a specified date range with a specific code group.\n * @param codeGroup The LOINCCodeGroup code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n * @returns The observations if there's a valid code group or date range.\n */\n getObservationsForCodeGroup(codeGroup: LOINCCodeGroup, dateRange: Interval):\n Promise {\n if (!codeGroup || !dateRange) {\n return of([]).toPromise();\n }\n const observationPromises = new Array>();\n for (const c of codeGroup.resourceCodes) {\n if (c instanceof LOINCCode) {\n observationPromises.push(this.getObservationsWithCode(c, dateRange));\n }\n }\n return Promise.all(observationPromises);\n }\n\n /**\n * Returns whether there are any observations with this code in the given\n * time range.\n * @param code The RxNorm code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n abstract medicationsPresentWithCode(code: RxNormCode, dateRange: Interval):\n Promise;\n\n /**\n * Gets medication data from a specified date range with a specific Rx code\n * group.\n * @param codeGroup The RxNormCode code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n abstract getMedicationAdministrationsWithCodes(\n codes: RxNormCode[],\n dateRange: Interval): Promise;\n\n /**\n * Gets medication data from a specified date range with specific Rx codes,\n * since multiple medications are displayed on a single chart.\n * @param codes The RxNormCode codes for which to get observations.\n * @param dateRanges The time interval observations should fall between.\n */\n getMedicationAdministrationsWithCodeGroup(\n group: RxNormCodeGroup,\n dateRange: Interval): Promise {\n if (!group || !dateRange) {\n return of([]).toPromise();\n }\n return this.getMedicationAdministrationsWithCodes(\n (group.resourceCodes as RxNormCode[]), dateRange);\n }\n\n /**\n * Gets the order for specified order id.\n * @param id The id to pull the order from.\n */\n abstract getMedicationOrderWithId(id: string): Promise;\n\n /**\n * Gets the encounters for the patient for any encounter that falls in the\n * given date range.\n * @param dateRange Return all encounters that covered any time in this\n * date range.\n */\n abstract getEncountersForPatient(dateRange: Interval): Promise;\n\n /**\n * Saves the current image of the graphs rendered as a DocumentReference\n * (static save).\n * @param image The image to save in the Document.\n * @param date The date the note was written on.\n */\n abstract saveStaticNote(image: HTMLCanvasElement, date: string):\n Promise;\n\n /**\n * Gets the MicrobioReports for the patient for any report that falls in\n * the given date range.\n * @param codeGroup The CodeGroup to retrieve DiagnosticReports for.\n * @param dateRange Return all DiagnosticReports that covered any time in this\n * date range.\n */\n abstract getMicrobioReports(\n codeGroup: BCHMicrobioCodeGroup, dateRange: Interval,\n limitCount?: number): Promise;\n\n /**\n * Gets the DiagnosticReports for the patient for any report that falls in\n * the given date range.\n * @param codeGroup The CodeGroup to retrieve DiagnosticReports for.\n * @param dateRange Return all DiagnosticReports that covered any time in this\n * date range.\n */\n abstract getAnnotatedDiagnosticReports(\n codeGroup: DiagnosticReportCodeGroup, dateRange: Interval,\n limitCount?: number): Promise;\n\n /**\n * Helper function to getAnnotatedDiagnosticReports() that makes the http\n * calls to get the corresponding html attachments. Creates a new\n * AnnotatedDiagnosticReport that includes the html attachment.\n *\n * @param report DiagnosticReport that will be edited to include the\n * html attachment in string format\n */\n addAttachment(report: DiagnosticReport): Promise {\n if (report.presentedForm) {\n for (const presented of report.presentedForm) {\n // Currently Cerner only supports text/html files and not pdf\n if (presented.contentType === 'text/html') {\n return this.getAttachment(presented.url).then(html => {\n return new AnnotatedDiagnosticReport(report, html);\n });\n }\n }\n }\n // If there is no presentedForm section in the report or none of the\n // presentedForm contentTypes are 'text/html', return the annotated\n // diagnostic report without the attachment.\n return Promise.resolve(new AnnotatedDiagnosticReport(report));\n }\n\n /**\n * Helper function that makes the HTTP call to get the html attachment.\n * The responseType will always be text, and not the default json.\n * If any error exists, it will catch the http error and return the message\n *\n * We will overwrite the abstract function because http and mock have\n * different authentication processes.\n * @param url Fhir link to location of data\n */\n abstract getAttachment(url: string): Promise;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {HttpClient} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {DateTime, Interval} from 'luxon';\nimport {FhirResourceType} from 'src/constants';\nimport {v4 as uuid} from 'uuid';\n\nimport {environment} from '../../environments/environment';\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCodeGroup} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {AnnotatedDiagnosticReport} from '../fhir-resources/annotated/annotated-diagnostic-report';\nimport {AnnotatedMicrobioReport} from '../fhir-resources/annotated/annotated-microbio-report';\nimport {DiagnosticReport} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration} from '../fhir-resources/medication-administration';\nimport {MedicationOrder} from '../fhir-resources/medication-order';\nimport {MicrobioReport} from '../fhir-resources/microbio-report';\nimport {Observation, ObservationStatus} from '../fhir-resources/observation';\n\nimport {FhirService} from './fhir.service';\n\n@Injectable()\nexport class MockFhirService extends FhirService {\n private readonly assetPath = './assets/' + environment.mockDataFolder + '/';\n private readonly allFilePaths =\n environment.mockDataFiles.map(x => this.assetPath + x + '.json');\n\n private readonly loincMap = new Map();\n private readonly medicationAdministrationMapByCode =\n new Map();\n private readonly medicationAdministrationMapByOrderId =\n new Map();\n private readonly medicationOrderMap = new Map();\n private readonly diagnosticReportMap =\n new Map();\n private readonly encounters = new Array();\n private microbioJson: JSON;\n\n loadAllData: Promise = this.loadAllCodes.then(\n () => Promise.all(this.allFilePaths.map(filePath => {\n return this.http.get(filePath).toPromise().then(data => {\n if (filePath.includes('_MB_data')) {\n this.microbioJson = data;\n }\n try {\n let entry = data.entry;\n // Sometimes data comes to us in bundles, and then we want to\n // flatten it into a series of resources.\n if (data.length > 0) {\n entry = data.map(bundle => bundle.entry).flat();\n }\n for (const json of entry) {\n const mockRequestId = uuid();\n const resourceType = json.resource.resourceType;\n if (resourceType === FhirResourceType.Observation) {\n this.constructResourceMap(\n json, this.loincMap,\n (x: any) => new Observation(x, mockRequestId),\n (obs) => obs.codes);\n }\n\n if (resourceType === FhirResourceType.MedicationAdministration) {\n this.constructResourceMap(\n json, this.medicationAdministrationMapByCode,\n (d) => new MedicationAdministration(d, mockRequestId),\n (admin) => [admin.rxNormCode]);\n\n this.constructResourceMap(\n json, this.medicationAdministrationMapByOrderId,\n (d) => new MedicationAdministration(d, mockRequestId),\n (admin) => [admin.medicationOrderId]);\n }\n\n if (resourceType === FhirResourceType.MedicationOrder) {\n this.constructResourceMap(\n json, this.medicationOrderMap,\n (d) => new MedicationOrder(d, mockRequestId),\n (order) => [order.orderId]);\n }\n\n if (resourceType === FhirResourceType.Encounter) {\n const encounter = new Encounter(json.resource, mockRequestId);\n this.encounters.push(encounter);\n }\n\n // Not used for microbio data, but only for diagnosticReport data\n if (resourceType === FhirResourceType.DiagnosticReport) {\n this.constructResourceMap(\n json, this.diagnosticReportMap,\n (d) => new DiagnosticReport(d, mockRequestId),\n (report) => [report.code]);\n }\n }\n } catch {\n console.warn(\n 'Trouble reading file: ' + filePath +\n '. Continuing on since this is the mock server.');\n }\n });\n })));\n\n\n constructor(\n private http: HttpClient, resourceCodeCreator: ResourceCodeCreator) {\n super(resourceCodeCreator);\n }\n\n private constructResourceMap(\n json: any, mapToUpdate: Map, constructorFn: (any) => V,\n getCodesFn: (value: V) => K[]) {\n try {\n const obj = constructorFn(json.resource);\n const uniqueCodes = Array.from(new Set(getCodesFn(obj)));\n for (const code of uniqueCodes) {\n let existing = mapToUpdate.get(code);\n if (!existing) {\n existing = [];\n }\n existing.push(obj);\n mapToUpdate.set(code, existing);\n }\n } catch (err) {\n // tslint:disable-next-line:no-console\n console.debug(err);\n }\n }\n\n /**\n * Gets observations from a specified date range with a specific LOINC code.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n * @param limitCount If set, the number of observations that should be\n * queried for\n */\n getObservationsWithCode(\n code: LOINCCode,\n dateRange: Interval,\n ): Promise {\n return this.loadAllData.then(\n map => this.getObservations(this.loincMap, code, dateRange));\n }\n\n private getObservations(\n map: Map, code: LOINCCode,\n dateRange: Interval) {\n return map.has(code) ?\n map.get(code)\n .filter(obs => dateRange.contains(obs.timestamp))\n .filter(obs => obs.status !== ObservationStatus.EnteredInError) :\n [];\n }\n\n observationsPresentWithCode(code: LOINCCode, dateRange: Interval):\n Promise {\n return this.loadAllData.then(\n () => this.getObservationsWithCode(code, dateRange)\n .then(results => results.length > 0));\n }\n\n /**\n * Gets medication data from a specified date range with a specific Rx code\n * @param code The RxNormCode codes for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getMedicationAdministrationsWithCodes(\n codes: RxNormCode[],\n dateRange: Interval): Promise {\n return this.loadAllData.then(\n () => {\n const allMedAdmins = new Array();\n this.medicationAdministrationMapByCode.forEach((medAdmins, code) => {\n if (codes.includes(code)) {\n allMedAdmins.push(...medAdmins.filter(\n medAdmin => dateRange.contains(medAdmin.timestamp)));\n }\n });\n return Promise.resolve(allMedAdmins);\n },\n rejection => {\n throw rejection;\n });\n }\n\n dataAvailableForMedications() {\n return this.loadAllData.then(() => {\n return new Set(this.medicationAdministrationMapByCode.keys());\n });\n }\n\n medicationsPresentWithCode(code: RxNormCode, dateRange: Interval):\n Promise {\n return this.loadAllData.then(\n () => this.getMedicationAdministrationsWithCodes([code], dateRange)\n .then(obs => obs.length > 0, rejection => {\n // If any MedicationAdministration for this code results\n // in an error, do not show any MedicationAdministrations\n // at all.\n throw rejection;\n }));\n }\n\n /**\n * Returns arbitrary orders for current mock medications.\n * @param id The id to pull the order from.\n */\n getMedicationOrderWithId(id: string): Promise {\n return this.loadAllData.then(\n x => this.medicationOrderMap.has(id) ?\n this.medicationOrderMap.get(id)[0] :\n undefined);\n }\n\n /**\n * Gets the encounters for the patient for any encounter that falls in the\n * given date range.\n * @param dateRange Return all encounters that covered any time in this\n * date range.\n */\n getEncountersForPatient(dateRange: Interval): Promise {\n return this.loadAllData.then(\n x => this.encounters.filter(\n encounter => dateRange.intersection(encounter.period) !== null &&\n encounter.period.start >= DateTime.utc().minus({years: 1})));\n }\n\n /**\n * Prints the current HTML of the graphs rendered to the console.\n * @param html The inner HTML to keep in the Document.\n * @param date The date the note was written for.\n */\n saveStaticNote(image: HTMLCanvasElement, date: string): Promise {\n console.log('Save to note button clicked for mock data for date: ' + date);\n console.log(image);\n return Promise.resolve(true);\n }\n\n /**\n * Gets the MicrobioReports for the patient for any report that falls in\n * the given date range, whose contained Observations are in the codeGroup\n * provided.\n * @param codeGroup The CodeGroup to retrieve MicrobioReports for.\n * @param dateRange Return all MicrobioReports that covered any time in\n * this date range.\n */\n getMicrobioReports(\n codeGroup: BCHMicrobioCodeGroup, dateRange: Interval,\n limitCount?: number): Promise {\n return this.loadAllData.then(x => {\n const microbioReports =\n MicrobioReport\n .parseAndFilterMicrobioData(this.microbioJson, codeGroup)\n .filter(\n report => dateRange.contains(\n new AnnotatedMicrobioReport(report).timestamp));\n return microbioReports.slice(0, limitCount ? limitCount : undefined);\n });\n }\n\n /**\n * Gets the AnnotatedDiagnosticReports for the patient for any report that\n * falls in the given date range, whose contained Observations are in the\n * codeGroup provided. Gets the html attachments linked in the json files as\n * well.\n *\n * We are returning AnnotatedDiagnosticReport rather than DiagnosticReport\n * because we need to access the html attachments.\n * @param codeGroup The CodeGroup to retrieve DiagnosticReports for.\n * @param dateRange Return all AnnotatedDiagnosticReports that covered any\n * time in this date range.\n */\n getAnnotatedDiagnosticReports(\n codeGroup: DiagnosticReportCodeGroup, dateRange: Interval,\n limitCount?: number): Promise {\n return this.loadAllData.then(x => {\n const annotatedReportsArr =\n new Array>();\n for (const code of codeGroup.resourceCodes) {\n if (this.diagnosticReportMap.has(code)) {\n const reports = this.diagnosticReportMap.get(code);\n for (const report of reports) {\n annotatedReportsArr.push(this.addAttachment(report));\n }\n }\n }\n return Promise.all(annotatedReportsArr).then(annotatedReports => {\n annotatedReports = annotatedReports.filter(\n report => dateRange.contains(report.timestamp));\n return annotatedReports.slice(0, limitCount ? limitCount : undefined);\n });\n });\n }\n\n /**\n * Helper function that makes the HTTP call to get the html attachment.\n * The responseType will always be text, and not the default json.\n * If any error exists, it will catch the http error and return the message\n * @param url Fhir link to location of data\n */\n getAttachment(url: string): Promise {\n return this.http.get(url, {responseType: 'text'})\n .toPromise()\n .then((res: any) => res)\n .catch((err => err.message));\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {InjectionToken} from '@angular/core';\nexport let SMART_ON_FHIR_CLIENT = new InjectionToken('SmartOnFhirClient');\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\nimport {CustomizableGraphAnnotation} from '../graphtypes/customizable-graph/customizable-graph-annotation';\n\nimport {GraphData} from './graphdata';\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * CustomizableData holds a time-based series to which a user can add more\n * points.\n */\nexport class CustomizableData extends GraphData {\n /** The display bounds of the y-axis. */\n readonly yAxisDisplayBounds: [number, number];\n\n private constructor(\n series: LabeledSeries,\n /**\n * The annotations for this customizable graph. If populated, holds a\n * map from a number representation of a Date to\n * CustomizableGraphAnnotation for the corresponding point.\n */\n readonly annotations: Map,\n regions?: any[]) {\n super(\n [series], undefined, // tooltip map\n undefined, // tooltip key function\n regions);\n this.annotations = annotations;\n this.yAxisDisplayBounds = [0, 10];\n }\n\n static defaultEmptySeries() {\n return new CustomizableData(\n LabeledSeries.emptySeries(),\n new Map());\n }\n\n /**\n * Adds a point to the series in this CustomizableData object.\n * @param annotation: The annotation to add in to the graph.\n */\n addPointToSeries(annotation: CustomizableGraphAnnotation) {\n // This method assumes there is only 1 series.\n this.series[0].coordinates.push([annotation.timestamp, 0]);\n this.annotations.set(annotation.timestamp.toMillis(), annotation);\n }\n\n /**\n * Removes a point from the series in this CustomizableData object, as well as\n * the corresponding annotation.\n * @param date The date for this point to remove.\n */\n removePointFromSeries(date: DateTime) {\n const index = this.series[0].coordinates.findIndex(\n c => c[0].toMillis() === date.toMillis());\n this.series[0].coordinates.splice(index, 1);\n this.annotations.delete(date.toMillis());\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\n\nimport {AnnotatedDiagnosticReport} from '../../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReport} from '../../fhir-resources/diagnostic-report';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {DiagnosticTooltip} from '../graphtypes/tooltips/diagnostic-tooltips';\n\nimport {LabeledSeries} from './labeled-series';\nimport {StepGraphData} from './stepgraphdata';\n\n/**\n * DiagnosticGraphData holds configurations for a diagnosticReport graph. The\n * format of a diagnostic graph is simliar to a step graph in that each y-axis\n * position represents a report category, and points plotted along\n * that position represent results for that test.\n */\n\nexport class DiagnosticGraphData extends StepGraphData {\n private constructor(\n endpointSeries: LabeledSeries[],\n tooltipMap: Map) {\n super(endpointSeries, tooltipMap, undefined);\n }\n\n /**\n * Converts a list of DiagnosticReports to a StepGraphData object\n * @param diagnosticReports A list of DiagnosticReports to display.\n * @returns a new DiagnosticGraphData for this set.\n */\n static fromDiagnosticReports(\n annotatedDiagnosticReports: AnnotatedDiagnosticReport[],\n sanitizer: DomSanitizer): DiagnosticGraphData {\n const points: LabeledSeries[] = [];\n\n // The key of the map is the DateTime timestamp while the values\n // of the map is an array contains AnnotatedTooltip (the innerhtml\n // of the tooltip chart, optional html of the attachment, and optional id).\n const tooltipMap = new Map();\n\n // Iterate through diagnosticReports to generate tooltips and\n // values for the DiagnosticGraphData\n for (const annotatedReport of annotatedDiagnosticReports) {\n // Adding a new DiagnosticTooltip to the tooltipMap.\n // If there is already a tooltip at the timestamp, we do not\n // overwrite the existing tooltip but rather add to it.\n if (tooltipMap.has(annotatedReport.timestamp.toMillis().toString())) {\n const existingTT =\n tooltipMap.get(annotatedReport.timestamp.toMillis().toString());\n const newTT =\n new DiagnosticTooltip(false).getTooltip(annotatedReport, sanitizer);\n existingTT.push(newTT);\n } else {\n // If there is no existing tooltip, we create a new tooltip.\n tooltipMap.set(\n annotatedReport.timestamp.toMillis().toString(),\n [new DiagnosticTooltip().getTooltip(annotatedReport, sanitizer)]);\n }\n // Pushing the LabeledSeries generated from the Diagnostic\n // Report to generate a new DiagnosticGraphData\n for (const series of LabeledSeries.fromDiagnosticReport(\n annotatedReport, annotatedReport.timestamp)) {\n points.push(series);\n }\n }\n return new DiagnosticGraphData(points, tooltipMap);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\n\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\n\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * The base class for holding data pertaining to one graph.\n */\nexport class GraphData {\n // The number of decimal places to show for any value associated with this\n // GraphData. The default is 0, to minimize errors caused by unnecessary\n // trailing zeros.\n precision = 0;\n\n constructor(\n /** A list of the series to be displayed on the graph. */\n readonly series: LabeledSeries[] = [],\n\n /**\n * A map to provide tooltips.\n * This is a bit complicated. c3's API lets you specify a function call\n * that will provide the HTML content for any given point's tooltip.\n * As a parameter, it passes in one or more data points:\n * https://c3js.org/reference.html#tooltip-contents\n * so when the tooltip is rendered, all you have is the plotted\n * information. As far as I can tell, that data structure is undocumented.\n * Upon inspection, the data point includes which series it belongs to,\n * the x value, and the y value, so if you want to render a custom\n * tooltip, you have to be able to derive all the information you need\n * from those values.\n * tooltipMap, alongside tooltipKeyFn, helps with this process.\n * If you call tooltipKeyFn on the data object passed into the c3 contents\n * function, it should yield the key into tooltipMap that will let you\n * look up the appropriate tooltip for that data point. If tooltipKeyFn\n * is unset, then we fall back to the default lookup, which is by x-value.\n *\n * The value of the map is an AnnotatedTooltip[] that contains additional\n * values that need more processing before it can be displayed, an\n * optional id, and a string representing the innerhtml that we want to\n * display as the tooltip\n */\n readonly tooltipMap?: Map,\n /**\n * See documentation on tooltipMap for more detail. tooltipKeyFn\n * takes in a graph data point and returns the key into tooltipMap that\n * provides the tooltip for that data point.\n */\n readonly tooltipKeyFn?: (graphData: any) => string,\n /**\n * A list of x-axis regions to display on the graph.\n */\n readonly xRegions = new Array<[DateTime, DateTime]>()) {}\n\n /*\n * Returns whether or not there are any data points in the series that fall\n * inside the date range provided.\n * @param series The LabeledSeries to find data points in the date range.\n * @param dateRange The date range in which to see if there are any data\n * points.\n */\n dataPointsInRange(dateRange: Interval): boolean {\n const entireRange = Interval.fromDateTimes(\n dateRange.start.toLocal().startOf('day'),\n dateRange.end.toLocal().endOf('day'));\n for (const s of this.series) {\n if (s.hasPointInRange(entireRange)) {\n return true;\n }\n }\n return false;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\n\nimport {AnnotatedDiagnosticReport} from '../../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReportStatus} from '../../fhir-resources/diagnostic-report';\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {MedicationAdministration} from '../../fhir-resources/medication-administration';\nimport {AnnotatedMedicationOrder, MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {MicrobioReport} from '../../fhir-resources/microbio-report';\nimport {CHECK_RESULT_CODE, NORMAL} from '../../fhir-resources/observation-interpretation-valueset';\nimport {ObservationSet} from '../../fhir-resources/sets/observation-set';\n// tslint:disable-next-line:max-line-length\nimport {DisplayGrouping, negFinalMB, negOtherMB, negPrelimMB, posFinalMB, posOtherNB, posPrelimMB, radiology} from '../../conceptmappings/resource-codes/display-grouping';\nimport {LegendInfo} from '../graphtypes/legend-info';\n\n/**\n * Timeseries data, represented as a list of tuples,\n * with metadata including a human-readable label, a unit, and a typical range.\n * Used for most charts to display a changing value over time. Multiple\n * LabeledSeries may appear on the same graph.\n */\nexport class LabeledSeries {\n /**\n * The y units for this series.\n */\n unit: string;\n\n /**\n * The DisplayGrouping this LabeledSeries corresponds to.\n */\n concept: DisplayGrouping;\n\n /**\n * A map of DateTimes to corresponding tuples representing the low and high\n * bounds of what should be considered \"normal\" along the y-axis.\n */\n normalRanges = new Map();\n\n /**\n * This is the desired display range for the y-axis for this series. We\n * calculate it as as:\n * [minimum(yNormalBounds, yValues), maximum(yNormalBounds, yValues)]\n */\n readonly yDisplayBounds: [number, number];\n\n constructor(\n /** The descriptive label of the data series. */\n readonly label: string,\n /**\n * The coordinate set for the series. The y-coordinates may be strings\n * or numbers, depending on whether this is a categorical or numerical\n * graph.\n */\n readonly coordinates: Array<[DateTime, string|number, string?]>,\n /** The y-axis unit for this series. */\n unit?: string,\n /**\n * Holds information about how this series should be displayed.\n */\n readonly legendInfo?: LegendInfo,\n /**\n * The x-coordinate values in the labeled series that should be marked as\n * abnormal because of their interpretation results.\n */\n readonly abnormalCoordinates = new Set(),\n /**\n * A map of DateTimes to corresponding tuples representing the low and\n * high bounds of what should be considered \"normal\" along the y-axis.\n */\n normalRanges?: Map,\n /**\n * The DisplayGrouping associated with this LabeledSeries.\n */\n concept?: DisplayGrouping) {\n // Sort the coordinates by x-value.\n this.coordinates = coordinates.sort((a, b) => {\n return a[0].toMillis() - b[0].toMillis();\n });\n this.unit = unit;\n\n // If a specific legend wasn't passed through then we generate one for the\n // series.\n this.legendInfo = legendInfo || new LegendInfo(label);\n\n this.concept = concept;\n this.normalRanges = normalRanges;\n\n /**\n * Calculate the y axis display bounds by finding the outer boundaries of\n * the data and the normal range.\n */\n\n const yValues = this.coordinates.map(c => c[1]).filter(x => x !== null);\n\n if (yValues.map(val => typeof val === 'number').some(x => x === false)) {\n return;\n }\n this.yDisplayBounds =\n [Math.min.apply(Math, yValues), Math.max.apply(Math, yValues)];\n }\n\n /**\n * Generates an empty LabeledSeries.\n */\n static emptySeries() {\n return new LabeledSeries('', []);\n }\n\n\n /**\n * Generates a LabeledSeries from the given ObservationSet.\n * @param observationSet The ObservationSet to chart.\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n */\n static fromObservationSet(\n observationSet: ObservationSet, encounters: Encounter[]): LabeledSeries {\n let coordinates: Array<[DateTime, number]> = [];\n const observations = observationSet.resourceList;\n const abnormal = new Set();\n for (const obs of observations) {\n coordinates.push([\n obs.observation.timestamp,\n obs.observation.value ? obs.observation.value.value : null\n ]);\n\n const outsideNormalRange = obs.observation.normalRange &&\n (obs.observation.value.value < obs.observation.normalRange[0] ||\n obs.observation.value.value > obs.observation.normalRange[1]);\n\n if ((obs.observation.interpretation &&\n obs.observation.interpretation.code !== NORMAL) ||\n outsideNormalRange) {\n abnormal.add(obs.observation.timestamp.toISO());\n }\n }\n\n coordinates = this.addEncounterEndpoints(coordinates, encounters);\n return new LabeledSeries(\n observationSet.label, coordinates, observationSet.unit,\n undefined, // legendInfo,\n abnormal, observationSet.normalRanges);\n }\n\n /**\n * Generates a LabeledSeries from the given list of discrete resulted-\n * ObservationSets.\n * For Observations with discrete values, such as \"yellow\"\n * for the color of urine, we group all ObservationSets into one\n * LabeledSeries, at a specific yValue.\n * @param observationSets The discrete ObservationSets to chart.\n * @param yValue The numerical y-value to map to this ObservationSet with\n * discrete results.\n * @param label The label for this LabeledSeries.\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n */\n static fromObservationSetsDiscrete(\n observationSets: ObservationSet[], yValue: number, label,\n encounters: Encounter[]): LabeledSeries {\n let coordinates: Array<[DateTime, number | string]> = [];\n const abnormal = new Set();\n for (const obsSet of observationSets) {\n const observations = obsSet.resourceList;\n for (const obs of observations) {\n coordinates.push([obs.observation.timestamp, yValue]);\n\n if (obs.observation.interpretation &&\n obs.observation.interpretation.code !== NORMAL) {\n abnormal.add(obs.observation.timestamp.toISO());\n }\n const outsideNormalRange = obs.observation.normalRange &&\n (obs.observation.value.value < obs.observation.normalRange[0] ||\n obs.observation.value.value > obs.observation.normalRange[1]);\n\n if (obs.observation.value && obs.observation.value.value &&\n outsideNormalRange) {\n abnormal.add(obs.observation.timestamp.toISO());\n }\n }\n }\n coordinates = this.addEncounterEndpoints(coordinates, encounters);\n return new LabeledSeries(\n label, coordinates,\n undefined, // unit\n undefined, // legend info,\n abnormal // abnormal points\n );\n }\n\n /**\n * Generates a set of LabeledSeries from the given MedicationOrderSet. It will\n * return one series for all the orders together since the order set\n * represents all orders for the same medication.\n * @param medOrderSet The MedicationOrderSet to chart.\n * @param dateRange The date range displayed on the chart.\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n * @param categoricalYPosition If set, we use this y-position for all the\n * datapoints in both returned series. If unset, we use the dosage\n * quantity for each administration as the y-value.\n */\n static fromMedicationOrderSet(\n medOrderSet: MedicationOrderSet, dateRange: Interval,\n encounters: Encounter[], categoricalYPosition?: string): LabeledSeries {\n const data: LabeledSeries[] = [];\n for (const medOrder of medOrderSet.resourceList) {\n // The first series in fromMedicationOrder is all the administrations.\n // The second series (unused in this function) is the end points only.\n data.push(LabeledSeries.fromMedicationOrder(\n medOrder, dateRange, categoricalYPosition)[0]);\n }\n\n // Combine all the series into a single series so that it shows up with\n // the same color.\n let coords = [];\n for (const series of data) {\n for (const coord of series.coordinates) {\n coords.push(coord);\n }\n }\n\n coords = this.addEncounterEndpoints(coords, encounters);\n return new LabeledSeries(\n medOrderSet.label, coords, medOrderSet.unit,\n undefined, // legendInfo\n undefined, // abnormal points\n // Always keep normalRanges undefined for MedicationOrder-based\n // LabeledSeries, as we only show normal ranges for Observations with a\n // normal range given in the data.\n undefined, // normalRanges\n medOrderSet.rxNormCode ? medOrderSet.rxNormCode.displayGrouping :\n undefined);\n }\n\n /**\n * Generates a set of LabeledSeries from the given MedicationOrder. For each\n * order, there are two LabeledSeries -- one for the corresponding\n * MedicationAdministrations, and one for the endpoints displayed for the\n * order.\n * @param annotatedOrder The AnnotatedMedicationOrder to chart.\n * @param dateRange The date range displayed on the chart.\n * @param categoricalYPosition If set, we use this categorical y-position\n * for all the datapoints in both returned series. If unset, we use the\n * dosage quantity for each administration as the numerical y-value.\n */\n static fromMedicationOrder(\n annotatedOrder: AnnotatedMedicationOrder, dateRange: Interval,\n categoricalYPosition?: string): LabeledSeries[] {\n const coordinates = new Array<[DateTime, string | number, string?]>();\n const endpointCoordinates = new Array<[DateTime, string | number]>();\n const medAdminsForOrder = annotatedOrder.medicationAdministrationSet;\n\n const label = annotatedOrder.label + annotatedOrder.order.orderId;\n const legend = annotatedOrder.order.rxNormCode.displayGrouping;\n\n if (medAdminsForOrder) {\n for (const annotatedAdmin of medAdminsForOrder.resourceList) {\n coordinates.push([\n annotatedAdmin.medAdministration.timestamp,\n this.getYPositionForMed(\n annotatedAdmin.medAdministration, categoricalYPosition)\n ]);\n }\n // We add the beginning and end time stamp if the order is not fully\n // displayed-- so that no dashes are displayed when an order is being\n // carried over from before the time window displayed.\n // We only display an endpoint for a MedicationOrder if the\n // endpoint is visible -- that is, if the time of the first\n // Administration of the order is during or after the beginning of the\n // time range of the chart, and if the time of the last Administration\n // of the order is before the end of the chart's time range.\n const firstAdministrationIsAfterStartTime =\n annotatedOrder.firstAdministration.timestamp.toMillis() >=\n dateRange.start.toMillis();\n const lastAdministrationIsBeforeEndTime =\n annotatedOrder.lastAdministration.timestamp.toMillis() <=\n dateRange.end.toMillis();\n\n if (firstAdministrationIsAfterStartTime) {\n endpointCoordinates.push([\n annotatedOrder.firstAdministration.timestamp,\n this.getYPositionForMed(\n annotatedOrder.firstAdministration, categoricalYPosition)\n ]);\n } else if (\n categoricalYPosition &&\n (annotatedOrder.lastAdministration.timestamp.toMillis() >\n dateRange.start.toMillis())) {\n // Only add a point for continuity if we have a fixed y position.\n coordinates.push([dateRange.start, categoricalYPosition]);\n }\n if (lastAdministrationIsBeforeEndTime) {\n endpointCoordinates.push([\n annotatedOrder.lastAdministration.timestamp,\n this.getYPositionForMed(\n annotatedOrder.lastAdministration, categoricalYPosition)\n ]);\n } else if (\n categoricalYPosition &&\n annotatedOrder.firstAdministration.timestamp.toMillis() <\n dateRange.end.toMillis()) {\n // Only add a point for continuity if we have a fixed y position.\n coordinates.push([dateRange.end, categoricalYPosition]);\n }\n }\n\n return [\n new LabeledSeries(\n label, coordinates, medAdminsForOrder.unit, legend,\n undefined, // abnormal points\n // Always keep normalRanges undefined for MedicationOrder-based\n // LabeledSeries, as we only show normal ranges for Observations with\n // a normal range given in the data.\n undefined, // normalRanges\n annotatedOrder.order.rxNormCode.displayGrouping),\n new LabeledSeries(\n 'endpoint' + label, endpointCoordinates, medAdminsForOrder.unit,\n legend)\n ];\n }\n\n /**\n * Generates a LabeledSeries from the given initial date and y-value.\n * @param date The DateTime corresponding to the initial point to chart.\n * @param yValue The y-value for the initial point to chart.\n */\n static fromInitialPoint(date: DateTime, yValue: number) {\n return new LabeledSeries('', [[date, yValue]]);\n }\n\n /**\n * Generates LabeledSeries from the given MicrobioReport.\n * @param report The MicrobioReport to chart.\n * @param date the DateTime corresponding to the Observations in the\n * MicrobioReport.\n */\n static fromMicrobioReport(report: MicrobioReport, date: DateTime):\n LabeledSeries[] {\n const series = [];\n const interpretationMap = new Map>();\n // Sort results by interpretation, and make a LabeledSeries for each.\n for (const observation of report.results) {\n const categoricalYValue = observation.display;\n const interpretation = observation.interpretation.code;\n if (interpretationMap.get(interpretation)) {\n const existing = interpretationMap.get(interpretation);\n existing.push([date, categoricalYValue]);\n interpretationMap.set(interpretation, existing);\n } else {\n interpretationMap.set(interpretation, [[date, categoricalYValue]]);\n }\n }\n // Make a LabeledSeries for each interpretation.\n for (const interpretation of Array.from(interpretationMap.keys())) {\n const seriesLabel =\n report.id + '-' + interpretation + '-' + report.status;\n const isPositive = seriesLabel.includes(CHECK_RESULT_CODE);\n series.push(new LabeledSeries(\n // Encode the status and interpretation into the series name so that\n // we can use d3 later on to filter the data points and display them\n // with the correct styling.\n seriesLabel, interpretationMap.get(interpretation),\n undefined, // unit\n LabeledSeries.getLegendInfoFromResult(report.status, isPositive)));\n }\n return series;\n }\n\n /**\n * Returns the correct legend info for a microbio report.\n * @param status The MicrobioReport's status.\n * @param isPositive Whether the report appears to be positive.\n * @returns The correct legend info for the report.\n */\n private static getLegendInfoFromResult(\n status: DiagnosticReportStatus, isPositive: boolean): LegendInfo {\n if (isPositive) {\n if (status === DiagnosticReportStatus.Preliminary) {\n return posPrelimMB;\n } else if (status === DiagnosticReportStatus.Final) {\n return posFinalMB;\n }\n return posOtherNB;\n } else {\n if (status === DiagnosticReportStatus.Preliminary) {\n return negPrelimMB;\n } else if (status === DiagnosticReportStatus.Final) {\n return negFinalMB;\n }\n return negOtherMB;\n }\n }\n\n /**\n * Generates LabeledSeries from the given DiagnosticReport.\n * @param report The DiagnosticReport to chart.\n * @param date the DateTime corresponding to the Observations in the\n * DiagnosticReport.\n */\n static fromDiagnosticReport(\n annotatedReport: AnnotatedDiagnosticReport,\n date: DateTime): LabeledSeries[] {\n const report = annotatedReport.report;\n const seriesLabel = report.id + '-' +\n (annotatedReport.report ? annotatedReport.report.category :\n 'unnamedReport');\n let coordinates: Array<[DateTime, number | string]> = [];\n\n // We are setting the coordinates to the category of the document (RADRPT,\n // CT Report, etc.)\n coordinates = [[report.timestamp, report.category]];\n const series = [new LabeledSeries(\n seriesLabel, coordinates,\n undefined, // unit\n radiology)];\n return series;\n }\n\n private static getYPositionForMed(\n medAdmin: MedicationAdministration, categoricalYPosition: string): string\n |number {\n return categoricalYPosition !== undefined && categoricalYPosition !== null ?\n categoricalYPosition :\n medAdmin.dosage.quantity;\n }\n\n private static addEncounterEndpoints(\n coordinates: any[], encounters: Encounter[]): any[] {\n if (coordinates.length > 0) {\n // If any encounters are set for this MedicationOrderSet, add null values\n // to the endpoints of encounters to ensure line breakage between points\n // of different encounters.\n // We assume that encounter endpoints correspond to correct line breaks,\n // and do not cross-check encounter id's of MedicationOrders or\n // MedicationAdministrations.\n coordinates = coordinates.sort((a, b) => a[0] - b[0]);\n for (const encounter of encounters) {\n coordinates.unshift([encounter.period.start.toUTC(), null]);\n coordinates.push([encounter.period.end.toUTC(), null]);\n }\n }\n return coordinates;\n }\n\n hasPointInRange(dateRange: Interval) {\n for (const x of this.coordinates.map(c => c[0])) {\n if (dateRange.contains(x)) {\n return true;\n }\n }\n return false;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Interval} from 'luxon';\n\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {NORMAL} from '../../fhir-resources/observation-interpretation-valueset';\nimport {ObservationSet} from '../../fhir-resources/sets/observation-set';\nimport {ResourceCodeGroup} from '../../conceptmappings/resource-codes/resource-code-group';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {MedicationAdministrationTooltip} from '../graphtypes/tooltips/medication-tooltips';\n// tslint:disable-next-line:max-line-length\nimport {DiscreteObservationTooltip, GenericAbnormalTooltip, GenericAnnotatedObservationTooltip} from '../graphtypes/tooltips/observation-tooltips';\n\nimport {GraphData} from './graphdata';\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * LineGraphData holds configurations for a line graph. A line graph may display\n * one or more LabeledSeries.\n */\nexport class LineGraphData extends GraphData {\n /** The tick marks to display on the y axis. */\n readonly yTicks: number[];\n\n /**\n * Contains the ResourceCodeGroup for this set of data, which helps determine\n * whether to force display bounds, and the code group's display bounds.\n */\n readonly resourceGroup: ResourceCodeGroup;\n\n\n\n private constructor(\n /** The label for the graph. */\n readonly label: string,\n /** The LabeledSeries that are a part of this line graph. */\n series: LabeledSeries[],\n /** The minimum and maximum y-values for this data. */\n readonly yAxisDataBounds: [number, number],\n /** The unit for the y-axis of the graph. */\n readonly unit: string, tooltipMap?: Map,\n tooltipKeyFn?: (key: string) => string, regions?: any[],\n precision?: number, resourceCodeGroup?: ResourceCodeGroup) {\n super(series, tooltipMap, tooltipKeyFn, regions);\n this.precision = precision ? precision : 0;\n this.yTicks =\n LineGraphData.getYTicks(yAxisDataBounds[0], yAxisDataBounds[1]);\n this.resourceGroup = resourceCodeGroup;\n }\n\n static emptyData() {\n return new LineGraphData('', [], [0, 0], '');\n }\n\n /**\n * Converts a list of ObservationSets to a LineGraphData object.\n * @param label The label for this set of observations.\n * @param observationGroup A list of ObservationSets to display.\n * @param resourceCodeGroup The ResourceCodeGroup these ObservationSets belong\n * to\n * @param sanitizer A DOM sanitizer for use in tooltip construction\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n * @returns a new LineGraphData for this observation set.\n * @throws Error if the observations in observationGroup have different units.\n */\n static fromObservationSetList(\n label: string, observationGroup: ObservationSet[],\n resourceCodeGroup: ResourceCodeGroup, sanitizer: DomSanitizer,\n encounters: Encounter[]): LineGraphData {\n let minY: number = Number.MAX_VALUE;\n let maxY: number = Number.MIN_VALUE;\n\n const allSeries = [];\n const obsGroupToSeries = new Map();\n for (const obsSet of observationGroup) {\n const lblSeries = LabeledSeries.fromObservationSet(obsSet, encounters);\n obsGroupToSeries.set(obsSet, lblSeries);\n allSeries.push(lblSeries);\n /* Find the minimum and maximum y values for all the series. */\n if (lblSeries.yDisplayBounds) {\n minY = Math.min(minY, lblSeries.yDisplayBounds[0]);\n maxY = Math.max(maxY, lblSeries.yDisplayBounds[1]);\n }\n }\n\n let tooltipMap = LineGraphData.makeTooltipMap(obsGroupToSeries, sanitizer);\n\n tooltipMap = LineGraphData.addAbnormalValueTooltips(\n tooltipMap, sanitizer, allSeries);\n\n const allUnits =\n new Set(observationGroup.map(x => x.unit).filter(x => x !== undefined));\n\n const data = new LineGraphData(\n label, allSeries, [minY, maxY], allUnits.values().next().value,\n tooltipMap && tooltipMap.size > 0 ? tooltipMap : undefined,\n undefined, // tooltipMap\n undefined, // regions\n resourceCodeGroup.precision, resourceCodeGroup);\n return data;\n }\n\n /**\n * Manually find y axis tick values based on the min and max display bounds.\n */\n static getYTicks(min: number, max: number, tickCount = 4): number[] {\n // Evenly space out 5 numbers between the min and max (display bounds).\n const difference = max - min;\n const spacing = difference / tickCount;\n const values = [];\n // If there is no difference between the min and max, simply return the\n // min.\n if (spacing === 0) {\n return [min];\n }\n for (let curr = min; curr <= max; curr += spacing) {\n values.push(curr);\n }\n return values;\n }\n\n\n private static makeTooltipMap(\n obsGroupToSeries: Map,\n sanitizer: DomSanitizer,\n ): Map {\n const tooltipMap = new Map();\n\n for (const entry of Array.from(obsGroupToSeries.entries())) {\n const obsGroup: ObservationSet = entry[0];\n const series: LabeledSeries = entry[1];\n for (const obs of obsGroup.resourceList) {\n const isAbnormal =\n series.abnormalCoordinates.has(obs.observation.timestamp.toISO());\n const timestamp = obs.observation.timestamp.toMillis().toString();\n // The key for this tooltip is the administration's timestamp.\n // There may be multiple data points associated with the timestamp\n // so we stack the administrations on top of one another in that case.\n if (tooltipMap.get(timestamp)) {\n // Blood pressure is read into the ObservationSet differently,\n // causing an edge case in the presentation of the values in the\n // tooltips. We only want to display 'Blood pressure' once\n if (obs.observation.codes[0].label === 'Blood pressure') {\n // We are combining the array into one AnnotatedTooltip in\n // order to check to see if \"Blood pressure\" has already been added\n // to any of the previous tooltips\n const annotatedTT = AnnotatedTooltip.combineAnnotatedTooltipArr(\n tooltipMap.get(timestamp));\n if (annotatedTT.tooltipChart.includes('Blood pressure')) {\n continue;\n }\n }\n tooltipMap.get(timestamp).push(\n new GenericAnnotatedObservationTooltip(\n false, series.legendInfo.fill)\n .getTooltip(obs, sanitizer, isAbnormal));\n } else {\n tooltipMap.set(\n timestamp, [new GenericAnnotatedObservationTooltip(\n true, series.legendInfo.fill)\n .getTooltip(obs, sanitizer, isAbnormal)]);\n }\n }\n }\n return tooltipMap;\n }\n\n /**\n * Constructs a map of timestamps to GenericAbnormalTooltips for any point\n * with an \"abnormal\" value. Currently, we only use the normal range as\n * reference.\n * @param series The series to construct the tooltip map for.\n * @param tooltipMap The existing tooltips for the series.\n * @param obsLabelToColor A map of Observation label to corresponding color.\n * @param sanitizer A DOM sanitizer for use in tooltip construction\n * @returns a map of timstamp strings to tooltips, with GenericObservation\n * tooltips replaced with GenericAbnormal tooltip if the value is\n * abnormal.\n */\n private static addAbnormalValueTooltips(\n tooltipMap: Map,\n sanitizer: DomSanitizer,\n labeledSeries: LabeledSeries[],\n ): Map {\n const alreadyMarked = new Set();\n for (const series of labeledSeries) {\n // Add a tooltip for any value with an abnormal value.\n for (const coords of series.coordinates) {\n const timestamp = coords[0].toMillis().toString();\n if (series.abnormalCoordinates.has(coords[0].toISO())) {\n const params = {};\n params['timestamp'] = coords[0].toMillis();\n params['value'] = coords[1];\n params['label'] = series.label;\n params['unit'] = series.unit;\n // The key for this tooltip is the timestamp.\n // There may be multiple data points associated with the\n // timestamp so we stack the administrations on top of one\n // another in that case.\n if (tooltipMap.get(timestamp) && !alreadyMarked.has(timestamp)) {\n tooltipMap.get(timestamp).push(\n new GenericAbnormalTooltip(false, series.legendInfo.fill)\n .getTooltip(params, sanitizer));\n alreadyMarked.add(timestamp);\n } else if (!tooltipMap.get(timestamp)) {\n tooltipMap.set(timestamp, [new GenericAbnormalTooltip(\n true, series.legendInfo.fill)\n .getTooltip(params, sanitizer)]);\n }\n }\n }\n return tooltipMap;\n }\n }\n\n /**\n * Converts a list of MedicationOrderSets to a LineGraphData object.\n * @param medicationOrderListGroup A list of MedicationOrderSets to\n * display.\n * @param encounters A list of Encounters to use while determining line\n * breaks in series.\n * @returns a new LineGraphData for this observation set.\n * @throws Error if the medication administrations in medicationOrderSet\n * have different units.\n */\n static fromMedicationOrderSet(\n medicationOrderSet: MedicationOrderSet, dateRange: Interval,\n sanitizer: DomSanitizer, encounters: Encounter[]): LineGraphData {\n const tooltipMap = new Map();\n const precision = 0;\n for (const order of medicationOrderSet.resourceList) {\n for (const admin of order.medicationAdministrationSet.resourceList) {\n const timestamp =\n admin.medAdministration.timestamp.toMillis().toString();\n // The key for this tooltip is the administration's timestamp.\n // There may be multiple data points associated with the timestamp\n // so we stack the administrations on top of one another in that\n // case.\n const newTT = new MedicationAdministrationTooltip().getTooltip(\n [admin], sanitizer);\n if (tooltipMap.get(timestamp)) {\n tooltipMap.get(timestamp).push(newTT);\n } else {\n tooltipMap.set(timestamp, [newTT]);\n }\n }\n }\n\n return new LineGraphData(\n medicationOrderSet.label,\n [LabeledSeries.fromMedicationOrderSet(\n medicationOrderSet, dateRange, encounters)],\n [medicationOrderSet.minDose, medicationOrderSet.maxDose],\n medicationOrderSet.unit, tooltipMap, undefined, undefined, precision);\n }\n\n /**\n * Converts a list of ObservationSets with discrete y-values (results) to\n * a LineGraphData object. If we are graphing Observations with discrete\n * values, such as \"yellow\" for the color of urine, we group all\n * ObservationSets into one LabeledSeries, and display textual information\n * in the tooltip.\n * @param label The label for this set of observations.\n * @param observationGroup A list of ObservationSets to display.\n * @param encounters A list of Encounters to use while determining line\n * breaks in series.\n * @returns a new LineGraphData for this observation set.\n * @throws Error if the observations in observationGroup have different\n * units.\n */\n static fromObservationSetListDiscrete(\n label: string, observationGroup: ObservationSet[],\n sanitizer: DomSanitizer, encounters: Encounter[]): LineGraphData {\n // For ObservationSets with discrete categories, we display a\n // scatterplot with one series, with most information in the tooltip.\n const yValue = 10;\n const lblSeries = LabeledSeries.fromObservationSetsDiscrete(\n observationGroup, yValue, label, encounters);\n\n let tooltipMap = new Map();\n for (const observationSet of observationGroup) {\n for (const obs of observationSet.resourceList) {\n const isAbnormal = (obs.observation.interpretation &&\n obs.observation.interpretation.code !== NORMAL) ?\n true :\n false;\n const tsString = obs.observation.timestamp.toMillis().toString();\n // Only add the timestamp to the tooltip for the first entry.\n let newTT: AnnotatedTooltip;\n if (obs.observation.value) {\n newTT = new GenericAnnotatedObservationTooltip(\n !tooltipMap.has(tsString), lblSeries.legendInfo.fill)\n .getTooltip(obs, sanitizer, isAbnormal);\n } else {\n newTT = new DiscreteObservationTooltip(!tooltipMap.has(tsString))\n .getTooltip([obs.observation], sanitizer);\n }\n\n // The key for this tooltip is the observation's timestamp.\n // There may be multiple data points associated with the timestamp\n // so we stack the tooltips on top of one another in that case.\n if (tooltipMap.has(tsString)) {\n tooltipMap.get(tsString).push(newTT);\n } else {\n tooltipMap.set(tsString, [newTT]);\n }\n }\n }\n tooltipMap = LineGraphData.addAbnormalValueTooltips(\n tooltipMap, sanitizer, [lblSeries]);\n\n return new LineGraphData(\n label, [lblSeries], [0, yValue * 2], undefined, // Units\n tooltipMap);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {CHECK_RESULT_CODE} from 'src/app/fhir-resources/observation-interpretation-valueset';\n\nimport {AnnotatedMicrobioReport} from '../../fhir-resources/annotated/annotated-microbio-report';\nimport {MicrobioReport} from '../../fhir-resources/microbio-report';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {MicrobioTooltip} from '../graphtypes/tooltips/microbio-tooltips';\n\nimport {LabeledSeries} from './labeled-series';\nimport {StepGraphData} from './stepgraphdata';\n\n/**\n * MicrobioGraphData holds configurations for a microbiology graph. The format\n * of a microbiology graph is simliar to a step graph in that each y-axis\n * position represents a single microbiology test, and points plotted along\n * that position represent results for that test.\n */\n\nexport class MicrobioGraphData extends StepGraphData {\n private constructor(\n endpointSeries: LabeledSeries[],\n tooltipMap: Map) {\n super(endpointSeries, tooltipMap, undefined);\n }\n\n /**\n * Converts a list of MicrobioReports to a StepGraphData object.\n * All MicrobioReports in the list should belong to the same culture type.\n * @param microbioReports A list of MicrobioReports to display.\n * @returns a new StepGraphData for this set.\n */\n static fromMicrobioReports(\n microbioReports: MicrobioReport[],\n sanitizer: DomSanitizer): MicrobioGraphData {\n const points: LabeledSeries[] = [];\n\n const tooltipMap = new Map();\n for (const report of microbioReports) {\n // Get the timestamp from the collection time of the specimen.\n const specimen = report.specimen;\n if (specimen) {\n const annotatedReport = new AnnotatedMicrobioReport(report);\n for (const series of LabeledSeries.fromMicrobioReport(\n report, annotatedReport.timestamp)) {\n points.push(series);\n const isAbnormal = series.label.includes(CHECK_RESULT_CODE);\n const color = series.legendInfo.fill;\n // For this tooltip, the keys are timestamps.\n if (tooltipMap.has(annotatedReport.timestamp.toMillis().toString())) {\n tooltipMap.get(annotatedReport.timestamp.toMillis().toString())\n .push(new MicrobioTooltip(false, color)\n .getTooltip(annotatedReport, sanitizer, isAbnormal));\n } else {\n tooltipMap.set(\n annotatedReport.timestamp.toMillis().toString(),\n [new MicrobioTooltip(true, color)\n .getTooltip(annotatedReport, sanitizer, isAbnormal)]);\n }\n }\n }\n }\n\n return new MicrobioGraphData(points, tooltipMap);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {DateTime, Interval} from 'luxon';\n\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {MedicationTooltip} from '../graphtypes/tooltips/medication-tooltips';\n\nimport {GraphData} from './graphdata';\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * StepGraphData holds configurations for a step graph. A step graph displays\n * one or more LabeledSeries.\n */\n\nexport class StepGraphData extends GraphData {\n constructor(\n /** A list of the LabeledSeries data to plot. */\n dataSeries: LabeledSeries[],\n /** A list of the LabeledSeries representing end points. */\n // readonly endpointSeries: LabeledSeries[],\n /** A map of tooltips for the data points. */\n tooltipMap: Map,\n /**\n * The function to call to get the key for the tooltip map for a point.\n */\n keyFn: (data: string) => string) {\n super(dataSeries, tooltipMap, keyFn);\n }\n\n /**\n * Converts a list of MedicationOrderSets to a StepGraphData object.\n * @param medicationOrderListGroup A list of MedicationOrderSets to display.\n * @returns a new StepGraphData for this observation set.\n * @throws Error if the observations in observationGroup have different units.\n */\n static fromMedicationOrderSetList(\n medicationOrderListGroup: MedicationOrderSet[], dateRange: Interval,\n sanitizer: DomSanitizer): StepGraphData {\n const data: LabeledSeries[] = [];\n const endpoints: LabeledSeries[] = [];\n\n medicationOrderListGroup = medicationOrderListGroup.sort((a, b) => {\n return a.resourceList[a.resourceList.length - 1]\n .lastAdministration.timestamp.toMillis() -\n b.resourceList[b.resourceList.length - 1]\n .lastAdministration.timestamp.toMillis();\n });\n\n const tooltipMap = new Map();\n for (const medOrderSet of medicationOrderListGroup) {\n // Each MedicationOrderSet represents multiple MedicationOrders\n // for the same medicine.\n for (const medOrder of medOrderSet.resourceList) {\n const labeledSeries = LabeledSeries.fromMedicationOrder(\n medOrder, dateRange, medOrder.medicationAdministrationSet.label);\n const administrationSeries = labeledSeries[0];\n const endpointSeries = labeledSeries[1];\n data.push(administrationSeries);\n endpoints.push(endpointSeries);\n\n // For this custom tooltip, the key is the series ID, and the value is\n // the medication tooltip that shows the first and last doses for the\n // medication.\n tooltipMap.set(\n medOrderSet.rxNormCode.label.toLowerCase() +\n medOrder.firstAdministration.timestamp,\n [new MedicationTooltip().getTooltip(medOrder, sanitizer)]);\n tooltipMap.set(\n medOrderSet.rxNormCode.label.toLowerCase() +\n medOrder.lastAdministration.timestamp,\n [new MedicationTooltip().getTooltip(medOrder, sanitizer)]);\n }\n }\n // Do not display the units for Medication administration values on the card\n // for MedicationSummary.\n for (const series of data) {\n series.unit = undefined;\n }\n for (const series of endpoints) {\n series.unit = undefined;\n }\n return new StepGraphData(\n endpoints, // do not render medication administrations, only endpoints\n tooltipMap,\n // Our tooltip key here is the drug name plus the timestamp.\n (tooltipContext: any) => {\n const xValue = tooltipContext.dataPoints[0].label;\n const yValue = tooltipContext.dataPoints[0].value;\n return yValue.toLowerCase() +\n DateTime.fromISO(xValue).toMillis().toString();\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DisplayGrouping} from '../../conceptmappings/resource-codes/display-grouping';\n\nimport {Axis} from './axis';\n\n/**\n * An AxisGroup is a set of Axes that should be rendered on a single card\n * together.\n *\n * Upon construction, the AxisGroup kicks off a FHIR call to determine whether\n * there is data available for the AxisGroup within the time span of the\n * application. When the promise returns, its result is stored in the\n * dataAvailable class variable.\n *\n * None of the information in AxisGroup changes over the application's\n * lifecycle.\n */\nexport class AxisGroup {\n /**\n * Whether there is data available in the app timescope for this axis group.\n * Marked as public because Angular templates need to get to it, and marked\n * as mutable since it's changed by a promise result, but its value is only\n * set once.\n */\n dataAvailable: boolean = undefined;\n\n /**\n * Constructs an AxisGroup.\n *\n * If label is unset in the constructor, then every axis in axes must have\n * the same label for the constructor to succeed. Similarly, if displayGroup\n * is unset, every axis must have the same resourceGroup.displayGrouping.\n */\n constructor(\n /**\n * The set of axes to be displayed in the same grouping.\n */\n readonly axes: Axis[],\n /**\n * The label for this axis group. If it isn't set here, we'll set it\n * using the label of the contained axes.\n */\n readonly label?: string,\n /**\n * The display grouping for this axis group. If it isn't set here, we'll\n * set it using the display grouping of the contained axes.\n */\n readonly displayGroup?: DisplayGrouping) {\n if (!label) {\n const labelSet = new Set(axes.map(axis => axis.label));\n if (labelSet.size !== 1) {\n throw Error(\n 'The axis group has multiple labels, so we can\\'t pick just one: ' +\n Array.from(labelSet.entries()));\n }\n this.label = axes[0].label;\n }\n\n if (!displayGroup) {\n const allDisplayGroups =\n new Set(axes.map(axis => axis.resourceGroup.displayGrouping.label));\n if (allDisplayGroups.size !== 1) {\n throw Error(\n 'All axes on the same card need to have the same display grouping. Groups:' +\n Array.from(new Set(\n axes.map(axis => axis.resourceGroup.displayGrouping.label))));\n }\n this.displayGroup = axes[0].resourceGroup.displayGrouping;\n }\n }\n\n /**\n * Returns whether there is any data available for any axes in this group\n * within the time scope of the app.\n */\n dataAvailableInAppTimeScope(): Promise {\n if (this.dataAvailable !== undefined) {\n return Promise.resolve(this.dataAvailable);\n }\n return Promise\n .all(this.axes.map(axis => axis.axisDataAvailableInAppTimeScope()))\n .then(rsc => {\n this.dataAvailable = rsc.some(r => r === true);\n return this.dataAvailable;\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Interval} from 'luxon';\n\nimport {BCHMicrobioCode, BCHMicrobioCodeGroup} from '../../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCode, DiagnosticReportCodeGroup} from '../../conceptmappings/resource-codes/diagnostic-report-code';\nimport {DisplayGrouping} from '../../conceptmappings/resource-codes/display-grouping';\nimport {LOINCCode, LOINCCodeGroup} from '../../conceptmappings/resource-codes/loinc-code';\nimport {ResourceCodeGroup} from '../../conceptmappings/resource-codes/resource-code-group';\nimport {RxNormCode} from '../../conceptmappings/resource-codes/rx-norm';\nimport {RxNormCodeGroup} from '../../conceptmappings/resource-codes/rx-norm-group';\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport {DiagnosticGraphData} from '../graphdatatypes/diagnosticgraphdata';\nimport {GraphData} from '../graphdatatypes/graphdata';\nimport {LineGraphData} from '../graphdatatypes/linegraphdata';\nimport {MicrobioGraphData} from '../graphdatatypes/microbiographdata';\nimport {StepGraphData} from '../graphdatatypes/stepgraphdata';\n\nimport {ChartType} from './graph/graph.component';\n\n/**\n * An axis represents one graph to be rendered. It\n * holds values for the type of graph (step, scatter, line, etc) as well as the\n * actual graph data.\n *\n * One axis might have multiple ResourceCodes associated with it, but all of\n * the same type.\n *\n * This class makes the FHIR calls to grab the associated data for the chart.\n */\nexport class Axis {\n /**\n * The chart type for this graph.\n */\n readonly chartType: ChartType;\n\n /**\n * The date range the data is currently loaded for.\n */\n dateRange: Interval;\n\n /**\n * Holds the GraphData already resolved for the class's current date range,\n * unless it hasn't been resolved yet. Then this variable will be undefined,\n * and you need to call updateDateRange to get the data loaded in.\n */\n alreadyResolvedData: GraphData;\n\n /**\n * The associated DisplayGrouping for this graph.\n */\n displayConcept: DisplayGrouping;\n\n /*\n * The label for this axis.\n */\n label: string;\n\n /*\n * Whether to show tick marks for this axis (only changed when results are all\n * qualitative).\n */\n showTicks = true;\n\n /** An error message if there's an error in data retrieval. */\n errorMessage: string;\n\n // The encounters for the date range.\n private encounters: Encounter[] = [];\n\n // Holds the grouping of the resource codes for this axis.\n private allLoinc: boolean;\n private allRx: boolean;\n private allBCHMicrobio: boolean;\n private allDiagnosticReport: boolean;\n\n /** Whether there is data available for this axis in the app time scope. */\n axisDataAvailable = true;\n\n /**\n * The constructor for this axis.\n * @param fhirService The FhirService used to make the FHIR calls.\n * @param resourceGroup The ResourceGroup to request data for.\n * @param dateRange: The date range to display on the axis.\n * @param label?: The optional y-axis label for this axis.\n */\n constructor(\n private fhirService: FhirService, private sanitizer: DomSanitizer,\n /**\n * The ResourceCodeGroup for this axis.\n */\n readonly resourceGroup: ResourceCodeGroup,\n /*\n * The label for this axis.\n */\n label?: string) {\n this.chartType = resourceGroup.chartType;\n this.displayConcept = resourceGroup.displayGrouping;\n this.label = label;\n\n const resourceCodeList = this.resourceGroup.resourceCodes;\n // Check that all elements of the resourceCodeList are of the same type.\n this.allLoinc = resourceCodeList.every(code => code instanceof LOINCCode);\n this.allRx = resourceCodeList.every(code => code instanceof RxNormCode);\n this.allBCHMicrobio =\n resourceCodeList.every(code => code instanceof BCHMicrobioCode);\n this.allDiagnosticReport =\n resourceCodeList.every(code => code instanceof DiagnosticReportCode);\n if (!this.allLoinc && !this.allRx && !this.allBCHMicrobio &&\n !this.allDiagnosticReport) {\n throw Error('All resource codes must be of the same type.');\n }\n }\n\n /**\n * Changes this axis' date range and loads in the new graph data accordingly.\n */\n updateDateRange(dateRange: Interval): Promise {\n if (dateRange === this.dateRange) {\n return Promise.resolve(this.alreadyResolvedData);\n }\n // Invalidate the already-resolved data so that the graph data promise\n // has to be re-evaluated.\n this.dateRange = dateRange;\n this.alreadyResolvedData = undefined;\n this.errorMessage = undefined;\n return this.getDataFromFhir(dateRange).then(\n data => {\n this.alreadyResolvedData = data;\n return data;\n },\n rejection => {\n if (rejection instanceof Error) {\n this.errorMessage = rejection.message;\n } else {\n this.errorMessage = JSON.stringify(rejection, null, 4);\n }\n return LineGraphData.emptyData();\n });\n }\n\n /**\n * Returns whether there is data available for this axis within the\n * application's time scope.\n */\n axisDataAvailableInAppTimeScope(): Promise {\n return this.resourceGroup.dataAvailableInAppTimeScope().then(res => {\n this.axisDataAvailable = res;\n return this.axisDataAvailable;\n });\n }\n\n /**\n * Gets the appropriate GraphData by classifying the resource codes and\n * making the appropriate FHIR calls for data and transformations. If\n * the data is already set in this class, it just returns that data.\n *\n * @returns A GraphData promise that will resolve to the GraphData for\n * this axis's resourceGroup.\n */\n private getDataFromFhir(dateRange: Interval): Promise {\n if (this.alreadyResolvedData) {\n return Promise.resolve(this.alreadyResolvedData);\n }\n\n // Set the encounters for this date range. If the promise fails, the list of\n // encounters is empty.\n this.fhirService.getEncountersForPatient(dateRange).then(e => {\n if (!e) {\n e = [];\n }\n e = e.sort(\n (a, b) => a.period.start.toMillis() - b.period.start.toMillis());\n this.encounters = e;\n }, reject => this.encounters = []);\n\n if (this.allRx) {\n // Prescriptions can be plotted as a step chart or as a line chart.\n if (this.chartType === ChartType.STEP) {\n return this.getStepGraphDataForMedicationSummary(\n this.resourceGroup as RxNormCodeGroup, dateRange);\n } else {\n return this.getLineGraphDataForMedicationDetail(\n this.resourceGroup as RxNormCodeGroup, dateRange);\n }\n }\n\n if (this.allBCHMicrobio) {\n // Microbiology always shows up as a step chart.\n return this.getStepGraphDataForMB(\n this.resourceGroup as BCHMicrobioCodeGroup, dateRange);\n }\n\n if (this.allDiagnosticReport) {\n return this.getStepGraphDataForDiagnosticReport(\n this.resourceGroup as DiagnosticReportCodeGroup, dateRange);\n } else {\n // In this case it is all LOINC codes.\n // We use LineGraphData for both ChartType.Scatter and\n // ChartType.Line, for plotting LOINC Codes.\n return (this.resourceGroup as LOINCCodeGroup)\n .getResourceSet(dateRange)\n .then(obsSetList => {\n if (obsSetList) {\n const allUnits = new Set(\n obsSetList.map(x => x.unit).filter(x => x !== undefined));\n // If the observation set contains any qualitative\n // values, even if it's mixed in with quantitative values,\n // we display the discrete linegraph. Similarly, if the\n // observations have different units we display it as a discrete\n // line graph.\n if (obsSetList.some(obsSet => obsSet.anyQualitative) ||\n allUnits.size > 1) {\n this.showTicks = false;\n return LineGraphData.fromObservationSetListDiscrete(\n this.displayConcept.label, obsSetList, this.sanitizer,\n this.encounters);\n }\n return LineGraphData.fromObservationSetList(\n this.displayConcept.label, obsSetList, this.resourceGroup,\n this.sanitizer, this.encounters);\n }\n return LineGraphData.emptyData();\n });\n }\n }\n\n /**\n * Get the data needed for the medication summary.\n * We first get the MedicationAdministrations corresponding to the RxNorms to\n * display on the page, and group them by order id (representing a\n * prescription). We then get the MedicationOrder for each order id, and group\n * those into MedicationOrderSets, where each MedicationOrderSet represents a\n * set of MedicationOrders for a particular medication.\n * @param rxNorms The RxNorms to be displayed in the StepGraphCard.\n */\n getStepGraphDataForMedicationSummary(\n rxNorms: RxNormCodeGroup, dateRange: Interval): Promise {\n return rxNorms.getResourceSet(dateRange).then(medOrderSets => {\n return StepGraphData.fromMedicationOrderSetList(\n medOrderSets.map(x => x.orders), dateRange, this.sanitizer);\n });\n }\n\n getStepGraphDataForMB(bchCodes: BCHMicrobioCodeGroup, dateRange: Interval):\n Promise {\n return bchCodes.getResourceSet(dateRange).then(microbioReports => {\n return MicrobioGraphData.fromMicrobioReports(\n microbioReports, this.sanitizer);\n });\n }\n\n getStepGraphDataForDiagnosticReport(\n diagCodes: DiagnosticReportCodeGroup,\n dateRange: Interval): Promise {\n return diagCodes.getResourceSet(dateRange).then(diagReports => {\n return DiagnosticGraphData.fromDiagnosticReports(\n diagReports, this.sanitizer);\n });\n }\n\n /**\n * Issues a FHIR request to get all the meds data for a list of\n * RxNorm codes (medications).\n */\n getLineGraphDataForMedicationDetail(\n rxNorms: RxNormCodeGroup, dateRange: Interval): Promise {\n return rxNorms.getResourceSet(dateRange)\n .then(rxNs => {\n return [].concat(...rxNs.map(rx => rx.orders.resourceList));\n })\n .then(orders => {\n return LineGraphData.fromMedicationOrderSet(\n new MedicationOrderSet(orders), dateRange, this.sanitizer,\n this.encounters);\n });\n }\n\n /**\n * Gets the x regions from the data for this axis.\n */\n getXRegions(): Promise {\n return this.getDataFromFhir(this.dateRange).then(data => {\n return data.xRegions ? data.xRegions : [];\n });\n }\n\n /**\n * Returns whether there's resolved data for this axis.\n */\n dataResolved(): boolean {\n return this.alreadyResolvedData && this.axisDataAvailable ? true : false;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport * as Color from 'color';\nimport {DateTime} from 'luxon';\n\n/*\n * This class makes an annotation for a particular timestamp with custom notes.\n */\nexport class CustomizableGraphAnnotation {\n // Whether or not the full annotation is shown. If false, only the title of\n // the annotation will show.\n private showDetails: boolean;\n // The width of the annotation.\n readonly annotationWidth = 100;\n // The default height of the annotation.\n readonly annotationHeight = 25;\n // The default y position of the annotation.\n readonly annotationDefaultY = 20;\n\n timestamp: DateTime;\n deleteIcon: HTMLElement;\n editIcon: HTMLElement;\n expandIcon: HTMLElement;\n\n constructor(\n timestamp: DateTime,\n /** The title that will show up in the annotation. */\n readonly title = '',\n /** The description that will show up in the annotation. */\n readonly description = '',\n /** The color for this annotation and associated point. */\n readonly color: Color = Color.rgb('black'),\n /** The timestamp for the annotation */\n ) {\n this.timestamp = timestamp;\n }\n\n addAnnotation(chartDivId: string, differenceInHeight: number): HTMLElement {\n const self = this;\n this.showDetails = false;\n const millis = this.timestamp.toMillis();\n\n const tooltipContainer = document.createElement('div');\n tooltipContainer.setAttribute(\n 'class', 'tooltip-custom-' + chartDivId + millis);\n tooltipContainer.style.left = '0px';\n tooltipContainer.style.borderColor = 'grey';\n tooltipContainer.style.backgroundColor = this.color.toString();\n tooltipContainer.style.bottom =\n (this.annotationDefaultY + differenceInHeight) + 'px';\n\n const tooltipTitleContainer = document.createElement('div');\n tooltipContainer.appendChild(tooltipTitleContainer);\n\n this.expandIcon =\n this.makeIcon('expand-' + chartDivId + millis, 'expand_more');\n this.expandIcon.style.cursor = 'pointer';\n tooltipTitleContainer.appendChild(this.expandIcon);\n\n const tooltipTitle = document.createElement('h6');\n tooltipTitle.setAttribute(\n 'class', 'tooltip-title-custom-' + chartDivId + millis);\n tooltipTitle.innerText = this.title;\n tooltipTitleContainer.appendChild(tooltipTitle);\n\n\n this.deleteIcon = this.makeIcon('delete-' + chartDivId + millis, 'clear');\n this.deleteIcon.style.cursor = 'pointer';\n tooltipTitleContainer.appendChild(this.deleteIcon);\n\n const tooltipDetails = document.createElement('div');\n tooltipDetails.setAttribute(\n 'class', 'tooltip-details-custom-' + chartDivId + millis);\n tooltipContainer.appendChild(tooltipDetails);\n\n const tooltipDetailsText = document.createElement('div');\n tooltipDetailsText.innerText = this.description;\n tooltipDetailsText.setAttribute(\n 'class', 'tooltip-details-text-' + chartDivId + millis);\n tooltipDetails.appendChild(tooltipDetailsText);\n\n this.editIcon = this.makeIcon('edit-' + chartDivId + millis, 'edit');\n this.editIcon.style.cursor = 'pointer';\n tooltipDetails.appendChild(this.editIcon);\n\n /**\n * Add action handlers.\n */\n tooltipTitle.onclick = ((e: MouseEvent) => {\n // Toggle whether or not the details are shown.\n self.showDetails = !self.showDetails;\n self.showDetailsToggle(\n millis, self.showDetails, tooltipContainer, chartDivId);\n });\n\n this.expandIcon.onclick = ((e: MouseEvent) => {\n // Toggle whether or not the details are shown.\n self.showDetails = !self.showDetails;\n self.showDetailsToggle(\n millis, self.showDetails, tooltipContainer, chartDivId);\n });\n\n\n tooltipContainer.onmouseover = (e: MouseEvent) => {\n this.expandIcon.style.visibility = 'visible';\n this.deleteIcon.classList.add('showIcon');\n this.editIcon.classList.add('showIcon');\n };\n\n tooltipContainer.onmouseout = (e: MouseEvent) => {\n this.expandIcon.style.visibility = 'hidden';\n this.deleteIcon.classList.remove('showIcon');\n this.editIcon.classList.remove('showIcon');\n };\n return tooltipContainer;\n }\n\n removeAnnotation(chartDivId: string) {\n const annotation = document.getElementsByClassName(\n 'tooltip-whole-' + chartDivId + this.timestamp.toMillis())[0];\n const parent = annotation.parentNode;\n if (parent) {\n parent.removeChild(annotation);\n }\n }\n\n private makeIcon(id: string, iconName: string): HTMLElement {\n const icon = document.createElement('i');\n icon.setAttribute('class', 'material-icons');\n icon.setAttribute('id', id);\n icon.style.fontSize = '18px';\n icon.innerHTML = iconName;\n return icon;\n }\n // Toggles whether or not the full annotation is shown.\n private showDetailsToggle(\n millis: number, toggle: boolean, element: any, chartDivId: string) {\n const detailsElement =\n document.getElementsByClassName(\n 'tooltip-details-custom-' + chartDivId + millis)[0] as HTMLElement;\n const expandElement =\n document.getElementById('expand-' + chartDivId + millis);\n if (toggle) {\n detailsElement.style.display = 'inline-block';\n expandElement.innerHTML = 'expand_less';\n } else {\n detailsElement.style.display = 'none';\n expandElement.innerHTML = 'expand_more';\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, forwardRef, Inject, Input, OnChanges, OnDestroy, Output, SimpleChanges} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {DateTime, Interval} from 'luxon';\nimport {CustomizableData} from 'src/app/graphs/graphdatatypes/customizabledata';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\nimport {recordGoogleAnalyticsEvent} from 'src/constants';\n\n// tslint:disable-next-line:max-line-length\nimport {CustomizableTimelineDialogComponent} from '../../../cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component';\nimport {GraphComponent} from '../graph/graph.component';\n\nimport {CustomizableGraphAnnotation} from './customizable-graph-annotation';\n\n@Component({\n selector: 'app-customizable-graph',\n templateUrl: '../graph/graph.component.html',\n styleUrls: [\n '../../../cardtypes/customizable-timeline/customizable-timeline.component.css'\n ],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => CustomizableGraphComponent)\n }]\n})\nexport class CustomizableGraphComponent extends\n GraphComponent implements OnChanges, OnDestroy {\n /**\n * An event indicating that the points on the CustomizableGraph have changed.\n */\n @Output() pointsChanged = new EventEmitter();\n /**\n * Holds whether this graph is in edit mode.\n */\n @Input() inEditMode: boolean;\n\n /**\n * The reference for the Dialog opened.\n */\n private dialogRef: any;\n\n\n constructor(\n readonly sanitizer: DomSanitizer, public dialog: MatDialog,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n this.chartTypeString = 'scatter';\n }\n\n ngOnDestroy() {\n if (this.dialogRef && this.dialogRef.unsubscribe) {\n // Destroy the dialog ref to prevent memory leaks.\n this.dialogRef.unsubscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n super.ngOnChanges(changes);\n if (changes.dateRange) {\n // CustomizableGraph needs to update annotations in the case that the date\n // range is changed.\n this.dateRangeChanged();\n }\n }\n adjustGeneratedChartConfiguration() {\n const self = this;\n this.chartOptions.scales.yAxes[0].display = false;\n this.chartOptions.scales.yAxes[0].ticks.beginAtZero = true;\n this.chartOptions.tooltips = {enabled: false};\n this.chartOptions.hover = {mode: null};\n this.chartOptions.onClick = function(event) {\n if (!self.inEditMode) {\n return;\n }\n const xValueMoment =\n this.scales[GraphComponent.X_AXIS_ID].getValueForPixel(event.offsetX);\n const dateClicked = DateTime.fromJSDate(xValueMoment.toDate());\n const currentInterval = Interval.fromDateTimes(\n self.dateRange.start.toLocal().startOf('day'),\n self.dateRange.end.toLocal().endOf('day'));\n if (currentInterval.contains(dateClicked)) {\n self.openDialog(dateClicked);\n }\n };\n this.chartOptions.onHover = function(event) {\n if (!self.inEditMode) {\n return;\n }\n const chart: any = this;\n const yScale = chart.scales[GraphComponent.Y_AXIS_ID];\n const xScale = chart.scales[GraphComponent.X_AXIS_ID];\n const currentDate =\n DateTime.fromJSDate(xScale.getValueForPixel(event.offsetX).toDate());\n const currentDateString = currentDate.toLocaleString() + ' ' +\n currentDate.toLocal().toLocaleString(DateTime.TIME_24_SIMPLE);\n\n const currentInterval = Interval.fromDateTimes(\n self.dateRange.start.toLocal().startOf('day'),\n self.dateRange.end.toLocal().endOf('day'));\n\n // Remove all other ctx lines drawn, to only show one hover line.\n chart.clear();\n chart.draw();\n\n // Only display the hover line if the date it represents is within the\n // current date range. This is because the chart is slightly larger than\n // the area contained within the axes, and a line could potentially be\n // shown before the x-axis starts, or after it ends.\n if (currentInterval.contains(currentDate)) {\n chart.ctx.beginPath();\n chart.ctx.moveTo(event.offsetX, 0);\n chart.ctx.strokeStyle = '#A0A0A0';\n chart.ctx.lineTo(event.offsetX, yScale.bottom);\n chart.ctx.stroke();\n chart.ctx.fillText(currentDateString, event.offsetX, yScale.bottom / 2);\n }\n };\n this.chartOptions.animation = {\n onComplete: function(chart) {\n self.removeAnnotations();\n self.addAnnotations();\n }\n };\n }\n\n dateRangeChanged() {\n this.reloadChart();\n this.adjustGeneratedChartConfiguration();\n }\n\n addAnnotations() {\n for (const dataPt of this.chartData[0].data) {\n const canvas = document.getElementById(this.chartDivId);\n const millis = DateTime.fromISO(dataPt['x']).toMillis();\n const annotation = this.data.annotations.get(millis);\n const color = annotation.color ? annotation.color : '#000000';\n // We need to cast this.chart.chart as any so we can access the 'scales'\n // property.\n const xOffset = (this.chart.chart as any)\n .scales[GraphComponent.X_AXIS_ID]\n .getPixelForValue(annotation.timestamp.toJSDate());\n const yOffset = (this.chart.chart as any)\n .scales[GraphComponent.Y_AXIS_ID]\n .margins['bottom'];\n const yAxisHeight =\n (this.chart.chart as any).scales[GraphComponent.Y_AXIS_ID].height;\n const heightToUse =\n this.findBestYCoordinate(xOffset, yAxisHeight, yOffset);\n const difference = heightToUse - yOffset;\n\n // Only display the flag if the date it represents is within the\n // current date range. This is so that the flag is not added to a location\n // on the DOM that is not within the chart.\n if (this.entireInterval.contains(DateTime.fromMillis(millis).toLocal())) {\n const tooltip = this.findOrCreateTooltipElement(\n canvas, 'annotation-' + this.chartDivId + millis);\n tooltip.setAttribute(\n 'class', 'tooltip-whole-' + this.chartDivId + millis);\n tooltip.style.borderLeftColor = color;\n tooltip.style.bottom = yOffset + 'px';\n tooltip.style.left = xOffset + 'px';\n tooltip.style.height = heightToUse + 'px';\n while (tooltip.firstChild) {\n tooltip.removeChild(tooltip.firstChild);\n }\n tooltip.onclick = (e: MouseEvent) => {\n const parent = tooltip.parentNode;\n try {\n parent.appendChild(tooltip);\n } catch (e) {\n console.log(e);\n }\n };\n\n tooltip.appendChild(\n annotation.addAnnotation(this.chartDivId, difference));\n this.addDeleteEvent(annotation);\n this.addEditListener(annotation);\n }\n }\n }\n\n private removeAnnotations() {\n const selector = 'tooltip-whole-' + this.chartDivId;\n for (const annotation of Array.from(\n document.querySelectorAll('[class*=' + selector + ']'))) {\n const parent = annotation.parentNode;\n if (parent) {\n parent.removeChild(annotation);\n }\n }\n }\n\n private findBestYCoordinate(\n xOffset: number, yAxisHeight: number, yOffset: number): number {\n const annotationWidth = 100;\n const verticalOverlap = 10;\n const horizontalOverlap = 20;\n const selector = 'tooltip-whole-' + this.chartDivId;\n const allFlags =\n Array.from(document.querySelectorAll('[class*=' + selector + ']'));\n const positions = allFlags.map(flag => {\n const htmlFlag = flag as HTMLElement;\n return {\n left: Number(htmlFlag.style.left.replace('px', '')),\n height: Number(htmlFlag.style.height.replace('px', '')),\n };\n });\n const overlappingYs = [];\n // Check if there are any annotations with horizontal overlap.\n for (const position of positions) {\n const leftPosition = position.left + annotationWidth;\n if (xOffset <= leftPosition &&\n (xOffset + annotationWidth >= position.left)) {\n overlappingYs.push(position.height);\n }\n }\n\n // Figure out the new y-coordinate for the annotation.\n let heightToUse = yOffset;\n // Sort all heights in increasing order.\n overlappingYs.sort(function(a, b) {\n return a - b;\n });\n // By default, try putting the new box above all other annotations with\n // horizontal overlap.\n if (overlappingYs.length > 0) {\n const currentMaxHeight = overlappingYs[overlappingYs.length - 1];\n // Only add height if the annotation does not go past the y axis height.\n if (currentMaxHeight + verticalOverlap <= yAxisHeight) {\n heightToUse = currentMaxHeight + verticalOverlap;\n } else {\n heightToUse = currentMaxHeight;\n }\n }\n // Check if there is any position with space available between existing\n // annotations.\n for (let i = 0; i < overlappingYs.length; i++) {\n // Check if there is enough space.\n if (overlappingYs[i + 1] - (overlappingYs[i] + annotationWidth) >=\n horizontalOverlap) {\n heightToUse = overlappingYs[i];\n }\n }\n return heightToUse;\n }\n\n // If the selected date already has an annotation, modify the time\n // by + 1 millisecond.\n private updateTime(millis: number) {\n if (this.data.annotations.has(millis)) {\n return this.updateTime(millis + 1);\n }\n return millis;\n }\n\n /**\n * Allow for the addition of a point to the CustomizableGraph, via a\n * CustomizableTimelineDialog.\n * (Visible only for testing.)\n */\n addPoint(timestamp: DateTime) {\n if (this.inEditMode) {\n this.dialogRef = this.openDialog(timestamp);\n }\n }\n\n private openDialog(\n timestamp: DateTime, editedAnnotation?: CustomizableGraphAnnotation) {\n // Make the dialog show up near where the user clicked.\n const data = editedAnnotation ? {\n title: editedAnnotation.title,\n date: new Date(editedAnnotation.timestamp.toMillis()),\n description: editedAnnotation.description,\n color: editedAnnotation.color,\n dateRange: this.dateRange,\n } :\n {\n date: timestamp,\n dateRange: this.dateRange,\n };\n\n this.dialogRef =\n this.dialog.open(CustomizableTimelineDialogComponent, {data: data});\n this.dialogRef.afterClosed().subscribe(r => {\n if (r) {\n if (editedAnnotation) {\n this.data.removePointFromSeries(\n DateTime.fromMillis(editedAnnotation.timestamp.toMillis()));\n editedAnnotation.removeAnnotation(this.chartDivId);\n }\n\n const result: CustomizableGraphAnnotation =\n r as CustomizableGraphAnnotation;\n // By default, the user selected date is the original date\n // corresponding to where the user chose to add the point.\n let userSelectedDate = result.timestamp;\n userSelectedDate =\n DateTime.fromMillis(this.updateTime(userSelectedDate.toMillis()));\n result.timestamp = userSelectedDate;\n this.data.addPointToSeries(result);\n this.pointsChanged.emit(this.data);\n this.generateChart();\n\n recordGoogleAnalyticsEvent(\n 'addEventCustomTimeline', 'customTimeline',\n new Date().toDateString());\n }\n });\n }\n\n /**\n * Add a listener for a click event on the delete button of the annotation at\n * the given time.\n * @param annotation The annotation for this point to remove.\n */\n private addDeleteEvent(annotation: CustomizableGraphAnnotation) {\n annotation.deleteIcon.onclick = ((e: MouseEvent) => {\n this.data.removePointFromSeries(annotation.timestamp);\n annotation.removeAnnotation(this.chartDivId);\n this.pointsChanged.emit(this.data);\n this.generateChart();\n });\n }\n\n /**\n * Add a listener for a click event on the edit button of the annotation at\n * the given time.\n * Visible only for testing.\n * @param annotation The annotation for the point to edit.\n */\n addEditListener(annotation: CustomizableGraphAnnotation) {\n annotation.editIcon.onclick = ((e: MouseEvent) => {\n this.dialogRef = this.openDialog(annotation.timestamp, annotation);\n\n recordGoogleAnalyticsEvent(\n 'editEventCustomTimeline', 'customTimeline',\n new Date().toDateString());\n });\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject, SecurityContext} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {LabeledSeries} from 'src/app/graphs/graphdatatypes/labeled-series';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {DiagnosticGraphDialogComponent} from '../diagnostic-graph/diagnostic-graph.dialog.component';\nimport {GraphComponent} from '../graph/graph.component';\nimport {StepGraphComponent} from '../stepgraph/stepgraph.component';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\n\n@Component({\n selector: 'app-diagnostic-graph',\n templateUrl: '../graph/graph.component.html',\n styleUrls: ['../graph.css'],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => DiagnosticGraphComponent)\n }]\n})\nexport class DiagnosticGraphComponent extends StepGraphComponent {\n private diagnosticGraphDialog: MatDialog;\n\n constructor(\n sanitizer: DomSanitizer, diagnosticGraphDialog: MatDialog,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n this.clickableTooltip = true;\n this.diagnosticGraphDialog = diagnosticGraphDialog;\n }\n\n /**\n * Called to open the diagnosticGraph Dialog.\n * @param htmlAttachment string that reflects the html to be presented on the\n * dialog\n */\n openDiagnosticGraphDialog(htmlAttachment: string) {\n const sanitizedHTMLAttachment =\n this.sanitizer.sanitize(SecurityContext.HTML, htmlAttachment);\n const dialogRef = this.diagnosticGraphDialog.open(\n DiagnosticGraphDialogComponent,\n {data: {htmlAttachment: sanitizedHTMLAttachment}});\n }\n\n /**\n * This is public because we want to be able to test it.\n *\n * Creates the binding between the buttons in the tooltip and the function\n * that we wish to call through onClick. We need to overwrite the super class\n * with specific information relevant to the Diagnostic Graph.\n *\n * We need to bind the onClick here as opposed to when the button was\n * originally created due to scoping and binding issues with the tooltip- the\n * button was not previously created.\n *\n * @param tooltipArray AnnotatedTooltip[] containing the attachment we wish\n * to display in the matDialog.\n */\n addAdditionalElementTooltip(tooltipArray: AnnotatedTooltip[]) {\n for (const annotatedTT of tooltipArray) {\n const uniqueID = annotatedTT.id;\n if (uniqueID === undefined) {\n throw Error('AnnotatedTooltip has undefined id');\n }\n // Extracts the button in the tooltip.\n const button = document.getElementById(uniqueID);\n if (button === null) {\n throw Error(\n `The AnnotatedTooltip does not correspond to ` +\n `any buttons on the tooltip. ID: ${uniqueID}`);\n }\n const htmlAttachment = annotatedTT.additionalAttachment;\n button.onclick =\n this.openDiagnosticGraphDialog.bind(this, htmlAttachment[0]);\n }\n }\n\n /***************************\n * Legend interactions\n * Because of the unique nature of the series in the DiagnosticGraph, we do\n * not allow legend interactions for diagnostic graphs. This prevents errors\n * that occur when the user hovers over a legend element that might correspond\n * to many series on the chart.\n */\n\n /**\n * @override\n */\n resetChart() {}\n\n /**\n * @override\n */\n focusOnSeries(labeledSeries: LabeledSeries[]) {}\n}\n","module.exports = \"
\\n \\n \\n
\\n

Diagnostic Report Attachment

\\n
\\n
\\n
\"","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';\n\n@Component({\n selector: 'app-diagnostic-graph-dialog',\n templateUrl: './diagnostic-graph.dialog.component.html'\n})\n\n/**\n * Dialog pop-up to display html attachment from the tooltip.\n*/\nexport class DiagnosticGraphDialogComponent {\n readonly htmlAttachment: string;\n\n /**\n * @param data Information to be displayed on the diagnosticGraph Dialog\n * @param dialogRef Reference to the dialog; used to open and close\n */\n constructor(@Inject(MAT_DIALOG_DATA) readonly data: any,\n public dialogRef: MatDialogRef) {\n // data.htmlAttachment has already been sanitized\n if (data) {\n this.htmlAttachment = data.htmlAttachment;\n }\n }\n\n /**\n * When the close icon is pressed, the dialog closes\n */\n onExit() {\n this.dialogRef.close();\n }\n}\n","module.exports = \"::ng-deep canvas {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n cursor: pointer;\\n}\\n::ng-deep .chartjs-tooltip {\\n opacity: 1;\\n position: absolute;\\n /* Disables interactions with the tooltip. Used here to remove\\n odd behavior where the tooltip does not immediately show up\\n despite hovering over the point */\\n pointer-events: none;\\n /* Show the tooltip above everything else. */\\n z-index: 1000;\\n}\\n::ng-deep .chartjs-tooltip-key {\\n display: inline-block;\\n width: 10px;\\n height: 10px;\\n margin-right: 10px;\\n}\\n/* All the below styles apply to elements within the graphs. Because these\\nare nested inside the components, we have to prefix the\\nstyle names with ::ng-deep. */\\n::ng-deep .tooltip {\\n font-size: 13px;\\n border-collapse: collapse;\\n border-spacing: 0;\\n background-color: #fff;\\n empty-cells: show;\\n box-shadow: 7px 7px 12px -9px #777777;\\n opacity: 0.9;\\n}\\n::ng-deep table {\\n background: #fff;\\n border: solid 1px #ddd;\\n}\\n::ng-deep .tooltip tr {\\n border: 1px solid #CCC;\\n}\\n::ng-deep .tooltip > tbody > tr > th {\\n width: 100%;\\n word-wrap: break-word;\\n background-color: #aaa;\\n font-size: 14px;\\n padding: 2px 5px;\\n text-align: left;\\n color: #FFF;\\n}\\n::ng-deep .tooltip td {\\n width: 125px;\\n font-size: 13px;\\n padding: 3px 6px;\\n background-color: #fff;\\n border-left: 1px dotted #999;\\n}\\n::ng-deep .order-region {\\n fill: rgb(179, 157, 219); /* Secondary color */\\n stroke: rgb(179, 157, 219); /* Secondary color */\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZ3JhcGhzL2dyYXBodHlwZXMvZ3JhcGguY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0Usc0JBQXNCO0VBQ3RCLHlCQUF5QjtFQUN6QixxQkFBcUI7RUFDckIsZUFBZTtBQUNqQjtBQUNBO0VBQ0UsVUFBVTtFQUNWLGtCQUFrQjtFQUNsQjs7bUNBRWlDO0VBQ2pDLG9CQUFvQjtFQUNwQiw0Q0FBNEM7RUFDNUMsYUFBYTtBQUNmO0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsV0FBVztFQUNYLFlBQVk7RUFDWixrQkFBa0I7QUFDcEI7QUFFQTs7OEJBRThCO0FBRTlCO0VBQ0UsZUFBZTtFQUNmLHlCQUF5QjtFQUN6QixpQkFBaUI7RUFDakIsc0JBQXNCO0VBQ3RCLGlCQUFpQjtFQUdqQixxQ0FBcUM7RUFDckMsWUFBWTtBQUNkO0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCO0FBRUE7RUFDRSxzQkFBc0I7QUFDeEI7QUFFQTtFQUNFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsc0JBQXNCO0VBQ3RCLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLFdBQVc7QUFDYjtBQUVBO0VBQ0UsWUFBWTtFQUNaLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsc0JBQXNCO0VBQ3RCLDRCQUE0QjtBQUM5QjtBQUVBO0VBQ0Usd0JBQXdCLEVBQUUsb0JBQW9CO0VBQzlDLDJCQUEyQixFQUFFLG9CQUFvQjtBQUNuRCIsImZpbGUiOiJzcmMvYXBwL2dyYXBocy9ncmFwaHR5cGVzL2dyYXBoLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjo6bmctZGVlcCBjYW52YXMge1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbjo6bmctZGVlcCAuY2hhcnRqcy10b29sdGlwIHtcbiAgb3BhY2l0eTogMTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICAvKiBEaXNhYmxlcyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgdG9vbHRpcC4gVXNlZCBoZXJlIHRvIHJlbW92ZVxuICBvZGQgYmVoYXZpb3Igd2hlcmUgdGhlIHRvb2x0aXAgZG9lcyBub3QgaW1tZWRpYXRlbHkgc2hvdyB1cFxuICBkZXNwaXRlIGhvdmVyaW5nIG92ZXIgdGhlIHBvaW50ICovXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAvKiBTaG93IHRoZSB0b29sdGlwIGFib3ZlIGV2ZXJ5dGhpbmcgZWxzZS4gKi9cbiAgei1pbmRleDogMTAwMDtcbn1cblxuOjpuZy1kZWVwIC5jaGFydGpzLXRvb2x0aXAta2V5IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbi8qIEFsbCB0aGUgYmVsb3cgc3R5bGVzIGFwcGx5IHRvIGVsZW1lbnRzIHdpdGhpbiB0aGUgZ3JhcGhzLiBCZWNhdXNlIHRoZXNlXG5hcmUgbmVzdGVkIGluc2lkZSB0aGUgY29tcG9uZW50cywgd2UgaGF2ZSB0byBwcmVmaXggdGhlXG5zdHlsZSBuYW1lcyB3aXRoIDo6bmctZGVlcC4gICovXG5cbjo6bmctZGVlcCAudG9vbHRpcCB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGVtcHR5LWNlbGxzOiBzaG93O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDdweCA3cHggMTJweCAtOXB4ICM3Nzc3Nzc7XG4gIC1tb3otYm94LXNoYWRvdzogN3B4IDdweCAxMnB4IC05cHggIzc3Nzc3NztcbiAgYm94LXNoYWRvdzogN3B4IDdweCAxMnB4IC05cHggIzc3Nzc3NztcbiAgb3BhY2l0eTogMC45O1xufVxuXG46Om5nLWRlZXAgdGFibGUge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXI6IHNvbGlkIDFweCAjZGRkO1xufVxuXG46Om5nLWRlZXAgLnRvb2x0aXAgdHIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDO1xufVxuXG46Om5nLWRlZXAgLnRvb2x0aXAgPiB0Ym9keSA+IHRyID4gdGgge1xuICB3aWR0aDogMTAwJTtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDJweCA1cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiAjRkZGO1xufVxuXG46Om5nLWRlZXAgLnRvb2x0aXAgdGQge1xuICB3aWR0aDogMTI1cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogM3B4IDZweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWxlZnQ6IDFweCBkb3R0ZWQgIzk5OTtcbn1cblxuOjpuZy1kZWVwIC5vcmRlci1yZWdpb24ge1xuICBmaWxsOiByZ2IoMTc5LCAxNTcsIDIxOSk7IC8qIFNlY29uZGFyeSBjb2xvciAqL1xuICBzdHJva2U6ICByZ2IoMTc5LCAxNTcsIDIxOSk7IC8qIFNlY29uZGFyeSBjb2xvciAqL1xufVxuIl19 */\"","module.exports = \"\\n
\\n
\\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Inject, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Chart, ChartDataSets, ChartOptions, ChartXAxe, ChartYAxe} from 'chart.js';\nimport * as pluginAnnotations from 'chartjs-plugin-annotation';\nimport {DateTime, Interval} from 'luxon';\nimport {BaseChartDirective} from 'ng2-charts';\nimport {GraphData} from 'src/app/graphs/graphdatatypes/graphdata';\nimport {LabeledSeries} from 'src/app/graphs/graphdatatypes/labeled-series';\nimport {LineGraphData} from 'src/app/graphs/graphdatatypes/linegraphdata';\nimport {formatNumberWithPrecision} from 'src/app/utils/number_utils';\nimport {v4 as uuid} from 'uuid';\n\nimport {UI_CONSTANTS, UI_CONSTANTS_TOKEN} from '../../../../constants';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\nimport {StandardTooltip} from '../tooltips/tooltip';\n\nexport enum ChartType {\n SCATTER,\n LINE,\n STEP,\n MICROBIO,\n DIAGNOSTIC\n}\n\n/**\n * Displays a graph. T is the data type the graph is equipped to display.\n */\nexport abstract class GraphComponent implements OnInit,\n OnChanges {\n /** Dummy data series label. */\n private static readonly DEFAULT_BLANK_DATA_LABEL = 'blankdatalabel';\n\n /**\n * The amount of padding to add to the left of the graph. This goes hand in\n * hand with how we choose to wrap the labels in the rendered chart, so if\n * Y_AXIS_TICK_MAX changes, this probably needs to change, too.\n * Additionally, significant changes in this value might break the e2e test\n * for customizable timeline since it could cause the click registered to\n * be outside of the graph area.\n */\n private static readonly Y_AXIS_LEFT_PADDING = 155;\n\n /** Line weights for emphasized and non-emphasized line graphs. */\n private static readonly THICK_LINE = 3;\n private static readonly THIN_LINE = 1;\n\n /** Constants for x and y axis names. */\n static readonly Y_AXIS_ID = 'y-axis-0';\n static readonly X_AXIS_ID = 'x-axis-0';\n\n /**\n * The minimum height for a graph.\n *\n * Significant changes in this value might break the e2e test\n * for customizable timeline since it could cause the click registered to\n * be outside of the graph area.\n */\n static readonly MIN_AXIS_HEIGHT = 90;\n\n /**\n * The entire interval represented by the current date range. This Interval\n * goes from the beginning of the first day of the date range, to the end of\n * the last day of the date range.\n */\n protected entireInterval: Interval;\n\n /** Whether data is available for this graph for the current date range. */\n private dataPointsInDateRange = false;\n\n /*****************************************\n * Bound input variables\n */\n\n /** The x-axis eventlines to display on the chart. */\n @Input() eventlines: Array<{[key: string]: number | string}>;\n /** The x-axis to use for the chart. */\n @Input() dateRange: Interval;\n /** The y-axis label to display. */\n @Input() axisLabel: string;\n /** The graph data to show. */\n @Input() data: T;\n /** The x regions to mark on this graph. */\n @Input() xRegions: Array<[DateTime, DateTime]>;\n\n /*****************************************\n * Variables the chart.js directive binds to.\n */\n\n @ViewChild(BaseChartDirective) chart: BaseChartDirective;\n /** Plugins for chart.js. */\n chartPlugins = [pluginAnnotations];\n\n // The bindings are unhappy when you provide an empty data array, so we\n // give it a fake series to render.\n /**\n * The chart data sets to render.\n */\n chartData: ChartDataSets[] = [\n {data: [], label: GraphComponent.DEFAULT_BLANK_DATA_LABEL},\n ];\n\n /**\n * Chart options to be rendered.\n */\n readonly chartOptions: (ChartOptions&{annotation: any}) = {\n // Draw straight lines between points instead of curves.\n elements: {line: {tension: 0}},\n layout: {padding: {top: 5}},\n // We make our own legend so we don't show the built-in one.\n legend: {display: false},\n scales: {xAxes: [this.generateXAxis()], yAxes: [this.generateYAxis()]},\n // Needed to grow the graph to fit the space.\n responsive: true,\n maintainAspectRatio: false,\n // Set up the custom callback for the tooltips.\n tooltips: {\n enabled: false,\n position: 'nearest',\n /**\n * Sets the tooltip for the graph.\n * If the class has a tooltipMap set, then we look up the tooltip from\n * that map. If there's no tooltipMap, then we return a simple formatted\n * tooltip of just the string representing the data plus the appropriate\n * units for a linegraph, or just the unedited value if it's a different\n * kind of graph.\n */\n custom:\n (tooltipContext) => {\n // Get, or construct, a tooltip element to put all the tooltip HTML\n // into.\n const canvas = document.getElementById(this.chartDivId);\n const tooltipEl = this.findOrCreateTooltipElement(\n canvas, 'chartjs-tooltip' + this.chartDivId);\n\n if (this.clickableTooltip) {\n // We have this as a separate case rather than allowing all\n // tooltips to be interactable to ensure that the tooltip\n // functionality remains normal for the other graphs\n\n // Allows the tooltip to be clickable.\n tooltipEl.style.pointerEvents = 'auto';\n // When the mouse is no longer on the tooltip, the tooltip is\n // hidden.\n tooltipEl.addEventListener('mouseleave', function() {\n tooltipEl.style.opacity = '0';\n });\n\n } else {\n // Hide the element if there is no tooltip-- this function gets\n // called back whether you're hovering over an element or not.\n if (tooltipContext.opacity === 0) {\n tooltipEl.style.opacity = '0';\n return;\n }\n }\n if (tooltipContext.body) {\n const tooltipArray = this.getTooltipValue(tooltipContext);\n const tooltipValue =\n AnnotatedTooltip.combineAnnotatedTooltipArr(tooltipArray);\n tooltipEl.innerHTML = tooltipValue.tooltipChart;\n if (tooltipValue.additionalAttachment) {\n this.addAdditionalElementTooltip(tooltipArray);\n }\n }\n // Display the tooltip lined up with the data point.\n const positionY = canvas.offsetTop;\n const positionX = canvas.offsetLeft;\n tooltipEl.style.opacity = '1';\n tooltipEl.style.left = positionX + tooltipContext.caretX + 'px';\n tooltipEl.style.top = positionY + tooltipContext.caretY + 'px';\n }\n },\n annotation: {\n // Array of annotation configuration objects to be filled in.\n annotations: []\n },\n // Disable any visual changes on hovering.\n hover: {mode: null},\n /** The settings below are just for better performance. */\n animation: {duration: 0},\n responsiveAnimationDuration: 0\n };\n\n /** A unique identifier for the element to bind the graph to. */\n chartDivId: string;\n\n /**\n * The default chart type for this chart. The Angular directive binds\n * to this string to tell chart.js which chart type to use.\n */\n chartTypeString = 'line';\n\n /**\n * Boolean representing if the tooltip needs to be interactable, allowing\n * for clicks into the tooltip links\n */\n clickableTooltip = false;\n\n constructor(\n readonly sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n // Generate a unique ID for this chart.\n const chartId = uuid();\n // Replace the dashes in the UUID to meet HTML requirements.\n const re = /\\-/gi;\n this.chartDivId = 'chart' + chartId.replace(re, '');\n }\n\n ngOnInit() {\n this.generateChart();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.eventlines) {\n this.updateEventlines(changes.eventlines.currentValue);\n }\n if (changes.dateRange) {\n this.chartOptions.scales.xAxes = [this.generateXAxis()];\n this.entireInterval = Interval.fromDateTimes(\n this.dateRange.start.toLocal().startOf('day'),\n this.dateRange.end.toLocal().endOf('day'));\n }\n if (changes.xRegions) {\n this.showXRegions();\n }\n }\n\n /**\n * When the component gets initialized and upon updates, this series of calls\n * modifies the data-bound variables so that the correct chart gets rendered.\n *\n * 1) prepareForChartConfiguration: an overrideable function in which\n * subclasses can get things ready for the chart to load in data\n * 2) generateBasicChart: load in the chart data and do formatting that all\n * subclasses share in common\n * 3) adjustGeneratedChartConfiguration: make any tweaks to the chart\n * that couldn't be made until the data got loaded in\n */\n\n generateChart(focusOnSeries?: LabeledSeries[]) {\n if (this.data && this.dateRange) {\n this.chartData =\n [{data: [], label: GraphComponent.DEFAULT_BLANK_DATA_LABEL}];\n this.entireInterval = Interval.fromDateTimes(\n this.dateRange.start.toLocal().startOf('day'),\n this.dateRange.end.toLocal().endOf('day'));\n this.dataPointsInDateRange = this.data.dataPointsInRange(this.dateRange);\n this.prepareForChartConfiguration();\n this.generateBasicChart(focusOnSeries);\n this.adjustGeneratedChartConfiguration();\n }\n }\n\n updateEventlines(eventlines: Array<{[key: string]: number | string}>) {\n const currentInterval = Interval.fromDateTimes(\n this.dateRange.start.toLocal().startOf('day'),\n this.dateRange.end.toLocal().endOf('day'));\n this.chartOptions.annotation.annotations =\n this.chartOptions.annotation.annotations.filter(\n a => !(a.id && a.id.includes('eventline')));\n if (this.chart) {\n for (const eventline of eventlines) {\n const currentDate = DateTime.fromMillis(Number(eventline.value));\n if (currentInterval.contains(currentDate)) {\n const line = {\n type: 'line',\n mode: 'vertical',\n id: 'eventline' + eventline.value,\n scaleID: GraphComponent.X_AXIS_ID,\n value: currentDate.toJSDate(),\n borderColor: eventline.color,\n borderWidth: 2,\n };\n this.chartOptions.annotation.annotations.push(line);\n }\n }\n this.reloadChart();\n }\n }\n\n reloadChart() {\n if (this.chart !== undefined && this.chart.chart !== undefined) {\n this.chart.chart.destroy();\n\n this.chart.datasets = this.chartData;\n this.chart.options = this.chartOptions;\n this.chart.ngOnInit();\n }\n }\n\n /**\n * Lines up any extra things needed to generate the\n * chart. Override this function when you need to make changes before the data\n * is loaded into the chart or when you need to load more data into the chart.\n */\n prepareForChartConfiguration() {}\n\n /**\n * Tweaks the generated chart. Override this function when you need to make\n * changes based on the data loaded into the chart.\n */\n adjustGeneratedChartConfiguration() {}\n\n /**\n * Sets up a generalized c3.ChartConfig for the data passed in. See\n * the type definition at:\n * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/c3/index.d.ts\n */\n private generateBasicChart(focusOnSeries?: LabeledSeries[]) {\n // Transform the data into a format that chart.js can render it.\n Chart.defaults.global.defaultFontFamily = 'Work Sans';\n const data = [];\n for (const series of this.data.series) {\n let lineWidth: number = GraphComponent.THIN_LINE;\n let adjustedPointRadius = 3;\n if (focusOnSeries !== undefined && focusOnSeries.includes(series)) {\n lineWidth = GraphComponent.THICK_LINE;\n adjustedPointRadius = 4;\n }\n if (series.coordinates.length > 0) {\n data.push({\n data: series.coordinates.map(pt => {\n return {x: pt[0].toISO(), y: pt[1]};\n }),\n label: series.label,\n // Do not fill the area under the line.\n fill: false,\n borderWidth: lineWidth,\n pointBorderWidth: 2,\n pointRadius: adjustedPointRadius,\n backgroundColor: series.legendInfo.fill,\n borderColor: series.legendInfo.fill,\n pointBackgroundColor: series.legendInfo.fill,\n pointBorderColor: series.legendInfo.outline,\n });\n }\n }\n\n // The subclasses may have already put series in lineChartData, and\n // we don't want to remove them, so we just append them to the\n // series. On the other hand, if there's a blank series in\n // lineChartData, we want to get rid of it before putting everything\n // else in.\n if (data.length > 0 && this.onlyDefaultDataPresent()) {\n this.chartData = data;\n } else {\n this.chartData = this.chartData.concat(data);\n }\n\n // Set the axis label if it's provided.\n this.chartOptions.scales.yAxes[0].scaleLabel.labelString = this.axisLabel ?\n this.axisLabel.substr(0, 10) +\n (this.axisLabel.length > 10 ? '...' : '') :\n '';\n\n // Add left-padding so that the y-axes are aligned with one another.\n this.chartOptions.scales.yAxes[0]['afterSetDimensions'] = function(axes) {\n axes.paddingLeft = GraphComponent.Y_AXIS_LEFT_PADDING;\n axes.chart.canvas.parentNode.style.height =\n GraphComponent.MIN_AXIS_HEIGHT + 'px';\n };\n\n const self = this;\n this.chartOptions.animation.onComplete = function(chart) {\n self.showNoDataLabel(this);\n };\n }\n\n private showXRegions() {\n if (!this.xRegions) {\n return;\n }\n for (const region of this.xRegions) {\n const annotation = {\n // Show the region underneath the data points.\n drawTime: 'beforeDatasetsDraw',\n type: 'box',\n xMin: region[0].toMillis(),\n xMax: region[1].toMillis(),\n xScaleID: GraphComponent.X_AXIS_ID,\n yScaleID: GraphComponent.Y_AXIS_ID,\n backgroundColor: 'rgba(179, 157, 219, 0.3)', // purple secondary color\n borderColor: 'rgba(179, 157, 219, 0.4)', // purple secondary color\n borderWidth: 1,\n };\n this.chartOptions.annotation.annotations.push(annotation);\n }\n this.reloadChart();\n }\n\n showNoDataLabel(chart: any) {\n if (!this.dataPointsInDateRange) {\n // Remove all other ctx objects drawn.\n chart.clear();\n chart.draw();\n\n const xCoordinate = chart.width / 2;\n const yCoordinate = chart.height / 2;\n chart.ctx.textAlign = 'center';\n chart.ctx.fillText(\n UI_CONSTANTS.NO_DATA_AVAILABLE_TMPL +\n this.entireInterval.start.toLocal().toLocaleString() + ' and ' +\n this.entireInterval.end.toLocal().toLocaleString(),\n xCoordinate, yCoordinate);\n }\n }\n\n protected onlyDefaultDataPresent() {\n return this.chartData.length === 1 &&\n this.chartData[0].label === GraphComponent.DEFAULT_BLANK_DATA_LABEL;\n }\n\n /***************************\n * Legend interactions\n */\n\n resetChart() {\n this.generateChart();\n }\n\n focusOnSeries(labeledSeries: LabeledSeries[]) {\n this.generateChart(labeledSeries);\n }\n\n /******************************\n * Helper functions for tooltipping\n */\n\n /**\n * Finds or creates a HTML element to render the tooltip onto.\n * @param canvas The Canvas this graph is rendered on\n * @param uniqueId The unique ID to give to this element. If not provided,\n * will use 'chartjs-tooltip' + the chart div ID.\n */\n protected findOrCreateTooltipElement(canvas: HTMLElement, uniqueId: string):\n HTMLElement {\n const tooltipTag =\n uniqueId ? uniqueId : 'chartjs-tooltip' + this.chartDivId;\n let tooltipEl = document.getElementById(tooltipTag);\n if (!tooltipEl) {\n tooltipEl = document.createElement('div');\n tooltipEl.id = tooltipTag;\n tooltipEl.classList.add('chartjs-tooltip');\n tooltipEl.innerHTML = '
';\n canvas.parentNode.appendChild(tooltipEl);\n }\n return tooltipEl;\n }\n\n /**\n * Adds any additional elements from AnnotatedTooltip that are not\n * in the normal tooltip. Currently logic in the children class, but\n * when we need more overarching logic, we can populate this function.\n *\n * @param tooltipArray AnnotatedTooltip[] containing the attachment we wish\n * to display in the matDialog.\n */\n protected addAdditionalElementTooltip(tooltipArray: AnnotatedTooltip[]) {}\n\n /**\n * Gets the tooltip for the given context.\n * @param tooltipContext The tooltip context passed into the tooltip\n * callback\n */\n private getTooltipValue(tooltipContext: any): AnnotatedTooltip[] {\n // We squish together all points at the same timestamp preemptively\n // in our tooltip creation so that we just find the index of the\n // tooltip based on the first point's x-value.\n const xValue = tooltipContext.dataPoints[0].label;\n\n const timestampKey = DateTime.fromISO(xValue).toMillis().toString();\n // Our data class may provide a tooltip key function that will\n // get the correct identifier from the data point. If it does,\n // we'll use that, but by default, the key is the timestamp\n // of the data point.\n const keyToUse = this.data.tooltipKeyFn ?\n this.data.tooltipKeyFn(tooltipContext) :\n timestampKey;\n\n // If something bad happens and we don't have a tooltip for the\n // key, return a generic tooltip with the value.\n let newTT: AnnotatedTooltip[];\n if (!this.data.tooltipMap || !this.data.tooltipMap.has(keyToUse)) {\n newTT = [new StandardTooltip(\n [], undefined,\n this.data instanceof LineGraphData ? this.data.unit : '')\n .getTooltip(undefined, this.sanitizer)];\n } else {\n newTT = this.data.tooltipMap.get(keyToUse);\n }\n return newTT;\n }\n\n /*************************\n * Helper functions for other chart options\n */\n protected generateXAxis(): ChartXAxe {\n return {\n id: GraphComponent.X_AXIS_ID,\n type: 'time',\n gridLines: {display: true, drawOnChartArea: false},\n time: {\n // This sets the bounds of the x-axis. The default values of 0 and 10\n // are nonsensical but necessary since the graph is first rendered\n // before dateRange is bound.\n min: this.dateRange ? this.dateRange.start.toISO() :\n DateTime.utc().toISO(),\n max: this.dateRange ? this.dateRange.end.toISO() :\n DateTime.utc().toISO(),\n // If we're showing fewer than three days, go for the hour axis labels;\n // otherwise go with by-day axis labels.\n unit: this.dateRange && (this.dateRange.length('day') > 3) ? 'day' :\n 'hour',\n displayFormats: {\n hour: 'MM/DD H:mm',\n day: 'MM/DD',\n }\n },\n ticks: {\n // Only show as many tick labels will fit neatly on the axis.\n autoSkip: true,\n display: true,\n fontSize: 12,\n padding: -10,\n },\n scaleLabel: {fontFamily: 'Work Sans'}\n };\n }\n\n private generateYAxis(): ChartYAxe {\n return {\n id: GraphComponent.Y_AXIS_ID,\n position: 'left',\n // Show tick marks but not grid lines.\n gridLines: {display: true, drawOnChartArea: false},\n scaleLabel: {\n display: true,\n labelString: '',\n },\n ticks: {\n // We explicitly set the y values to show, so we don't want to use\n // autoskip.\n autoSkip: false,\n callback: (value, index, values) => {\n if (!this.data || (typeof value) !== 'number') {\n return value;\n }\n return formatNumberWithPrecision(value, this.data.precision);\n }\n }\n };\n }\n}\n","\n// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nimport * as Color from 'color';\nimport * as Colors from '../../theme/verily_colors';\n/**\n * Represents how a concept will be displayed in a legend, with a label, fill\n * color, and outline color.\n */\nexport class LegendInfo {\n private static colorIdx = 0;\n constructor(\n readonly label: string, readonly fill?: Color, readonly outline?: Color) {\n let tempColor: Color = fill;\n if (!fill) {\n tempColor = Colors.getDataColors()[LegendInfo.colorIdx];\n LegendInfo.colorIdx =\n (LegendInfo.colorIdx + 1) % Colors.getDataColors().length;\n }\n this.fill = tempColor;\n this.outline = outline ? outline : tempColor;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject, Input, OnChanges, SimpleChanges} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {ChartPoint} from 'chart.js';\nimport {DateTime} from 'luxon';\nimport {ABNORMAL} from 'src/app/theme/verily_colors';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {LabeledSeries} from '../../graphdatatypes/labeled-series';\nimport {LineGraphData} from '../../graphdatatypes/linegraphdata';\nimport {GraphComponent} from '../graph/graph.component';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\n\n@Component({\n selector: 'app-linegraph',\n templateUrl: '../graph/graph.component.html',\n styleUrls: ['../graph.css'],\n providers: [\n {provide: GraphComponent, useExisting: forwardRef(() => LineGraphComponent)}\n ]\n})\nexport class LineGraphComponent extends GraphComponent implements\n OnChanges {\n /**\n * The amount to pad the y-axis around the displayed data range. This gives\n * the data points a little cushion so that they don't run off the top or\n * bottom of the axis.\n */\n static readonly yAxisPaddingFactor = 0.25;\n static readonly NORMAL_BOUND_SERIES_NAME = 'normalBound';\n\n @Input() showTicks: boolean;\n\n private addedNormalBound = false;\n\n constructor(\n readonly sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n super.ngOnChanges(changes);\n }\n\n adjustGeneratedChartConfiguration() {\n // We have to wait until after the data loads up into the graph to iterate\n // over the points and adjust their coloring based on the normal range.\n this.addedNormalBound = this.isNormalBoundAdded(this.data.series);\n this.addYNormalRange();\n\n const seriesLength = this.data.series.length;\n\n if (this.addedNormalBound) {\n // Gives the last labeledSeries in the array a different set of\n // characteristics. The last labeledSeries depicts the normal boundary.\n const chartjsSeries = this.chartData[seriesLength - 1];\n chartjsSeries.pointStyle = 'crossRot';\n chartjsSeries.pointBorderColor = 'rgba(0,0,0,0.5)'; // medium-gray color\n chartjsSeries.pointBorderWidth = 2;\n chartjsSeries.pointRadius = 4;\n chartjsSeries.borderColor = 'transparent';\n }\n\n // Color points that fall outside of their respective normal ranges.\n // If it hasNormalBound, then the last labeledSeries does not need to\n // be styled in this for loop.\n for (let i = 0;\n i < (this.addedNormalBound ? seriesLength - 1 : seriesLength); i++) {\n const chartjsSeries = this.chartData[i];\n const labeledSeries = this.data.series[i];\n this.colorAbnormalPoints(chartjsSeries, labeledSeries);\n }\n if (!this.showTicks) {\n this.chartOptions.scales.yAxes[0].display = false;\n this.chartOptions.scales.yAxes[0].ticks.beginAtZero = true;\n }\n }\n\n /**\n * Adds y normal ranges to the graph and colors points the designated\n * \"abnormal\" color if they fall outside the normal range.\n */\n private addYNormalRange() {\n // Only LineGraphData has y normal bounds.\n if (!(this.data instanceof LineGraphData)) {\n return;\n }\n\n let normalRangeBounds;\n if (this.data.series.length === 1 || this.addedNormalBound) {\n // Some things are only valid if there are y-axis normal bounds. We\n // also only show normal bounds if there's one data series on the\n // axis, and all normal bounds for the current date range are the same.\n // These customizations are based on this.data, which is a type\n // specific for LineGraphData, and could not be generalized in the\n // abstract GraphCard class.\n let dateTimesInRange = [];\n let firstNormalRange: [number, number];\n if (this.data.series[0].normalRanges) {\n dateTimesInRange = Array.from(this.data.series[0].normalRanges.keys())\n .filter(date => this.dateRange.contains(date));\n firstNormalRange = dateTimesInRange.length > 0 ?\n this.data.series[0].normalRanges.get(dateTimesInRange[0]) :\n undefined;\n }\n if (firstNormalRange) {\n let differentNormalRanges = false;\n for (const time of dateTimesInRange) {\n const currNormalRange = this.data.series[0].normalRanges.get(time);\n if (currNormalRange[0] !== firstNormalRange[0] ||\n currNormalRange[1] !== firstNormalRange[1]) {\n differentNormalRanges = true;\n }\n }\n // If all normal ranges associated with points in the current date\n // range are the same, then add the region to the chart, and adjust\n // display bounds accordingly.\n if (!differentNormalRanges) {\n // To prevent the creation of multiple normal bound tooltips\n if (this.addedNormalBound === false) {\n this.createNormalBoundsTooltip(firstNormalRange);\n }\n this.addGreenRegion(firstNormalRange);\n normalRangeBounds = firstNormalRange;\n this.addedNormalBound = true;\n }\n }\n }\n this.adjustChartYScales(normalRangeBounds);\n }\n\n private adjustChartYScales(normalRangeBounds: [number, number]) {\n const yDisplayBounds = this.getDisplayBounds(normalRangeBounds);\n\n // If the display bounds are enforced and all the bounds are the\n // same, don't pad.\n const padding = (this.allBoundsAreEnforced() && this.allBoundsAreSame()) ?\n 0 :\n Math.abs(yDisplayBounds[1] - yDisplayBounds[0]) *\n LineGraphComponent.yAxisPaddingFactor;\n this.chartOptions.scales.yAxes[0].ticks.min = yDisplayBounds[0] - padding;\n this.chartOptions.scales.yAxes[0].ticks.max = yDisplayBounds[1] + padding;\n this.chartOptions.scales.yAxes[0].afterBuildTicks = (scale) => {\n if (this.data && this.data.yTicks) {\n scale.ticks =\n LineGraphData.getYTicks(yDisplayBounds[0], yDisplayBounds[1]);\n }\n };\n }\n\n /**\n * Helper function that determines whether the LabeledSeries has\n * a normal bound or not.\n * @param series LabeledSeries[] that presents the data that is to\n * be presented in the graph.\n * @returns boolean value that reflects whether there is a normal\n * bound or not.\n */\n private isNormalBoundAdded(series: LabeledSeries[]): boolean {\n for (const s of series) {\n if (s.label === LineGraphComponent.NORMAL_BOUND_SERIES_NAME) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Reconciles together several possible sources of y-axis display bounds. The\n * bounds can come from three places:\n * 1) Each ResourceCode has an expected data bound encoded.\n * 2) Each Observation point may have a normal range encoded (passed in as\n * normalRangeBounds only if all the observation points have the same\n * normal range; otherwise normalRangeBounds is undefined).\n * 3) LineGraphData tracks the range of data seen across all data points.\n *\n * Our goal here is to show as much data as possible without being misleading\n * or skewing the graph too much to include outlier points. So, we follow\n * these rules:\n *\n * 1) If all the ResourceCodes have the same expected data bound, and all of\n * them are marked to enforce that bound, choose those upper and lower\n * bounds.\n * 2) Else, consider each endpoint of the bound separately.\n * a. For the lower bound, choose min(min data, min normal bound)\n * b. For the upper bound, choose max(max data, max normal bound)\n */\n private getDisplayBounds(normalRangeBounds: [number, number]):\n [number, number] {\n if (this.allBoundsAreSame() && this.allBoundsAreEnforced()) {\n return this.data.resourceGroup.resourceCodes[0].displayBounds;\n }\n\n if (!normalRangeBounds) {\n return (this.data.yAxisDataBounds);\n }\n\n return [\n Math.min(this.data.yAxisDataBounds[0], normalRangeBounds[0]),\n Math.max(this.data.yAxisDataBounds[1], normalRangeBounds[1])\n ];\n }\n\n private allBoundsAreSame(): boolean {\n if (this.data.resourceGroup) {\n return new Set(\n this.data.resourceGroup.resourceCodes\n .map(code => code.displayBounds)\n .filter(bound => bound !== undefined)\n .map(\n bound =>\n bound.toString() // cast to string for hashability\n ))\n .size === 1;\n }\n return false;\n }\n\n private allBoundsAreEnforced(): boolean {\n if (this.data.resourceGroup) {\n return this.data.resourceGroup.resourceCodes\n .map(x => x.forceDisplayBounds)\n .every(x => x === true);\n }\n return false;\n }\n\n /**\n * Adds a LabeledSeries that represents the normal bounds on the y-axis\n * to the Tooltip Map.\n * @param yNormalBounds The bounds of the y range considered normal.\n */\n private createNormalBoundsTooltip(yNormalBounds: [number, number]) {\n // TypeScript requires a separate declaration for arrays of tuples.\n let coordinatesLblSeries: [DateTime, number][];\n coordinatesLblSeries = [\n [this.dateRange.start, yNormalBounds[0]],\n [this.dateRange.start, yNormalBounds[1]]\n ];\n const lblSeries = new LabeledSeries(\n LineGraphComponent.NORMAL_BOUND_SERIES_NAME, coordinatesLblSeries,\n this.data.unit);\n\n let coordinatesChartPoint: ChartPoint[];\n coordinatesChartPoint = [\n {x: this.dateRange.start.toISO(), y: yNormalBounds[0]},\n {x: this.dateRange.start.toISO(), y: yNormalBounds[1]}\n ];\n\n if (this.data) {\n this.data.series.push(lblSeries);\n\n // Creates an HTML table for the tooltip text, and adds it to the tooltip\n // map. This was done separately because not all line graphs have normal\n // bounds depicted.\n const tooltipText = '' +\n '
' +\n 'Normal Boundary
' +\n 'Upper: ' + yNormalBounds[1] + ' ' + this.data.unit + '\\n' +\n 'Lower: ' + yNormalBounds[0] + ' ' + this.data.unit +\n '
';\n\n const newTT = new AnnotatedTooltip(tooltipText);\n\n const mapKey = this.dateRange.start.valueOf().toString();\n if (this.data.tooltipMap.has(mapKey)) {\n this.data.tooltipMap.get(mapKey).push(newTT);\n } else {\n this.data.tooltipMap.set(mapKey, [newTT]);\n }\n }\n this.chartData.push({\n data: coordinatesChartPoint,\n label: LineGraphComponent.NORMAL_BOUND_SERIES_NAME\n });\n }\n\n /**\n * Draws a green box spanning the entire x-axis and covering y axis normal\n * range. Also puts descriptive labels at the top and bottom of the range.\n * @param yNormalBounds The bounds of the y range considered normal.\n */\n private addGreenRegion(yNormalBounds: [number, number]) {\n const normalRegionAnnotation = {\n // Show the y-bounds underneath the graph points.\n drawTime: 'beforeDatasetsDraw',\n type: 'box',\n yMin: yNormalBounds[0],\n yMax: yNormalBounds[1],\n // No x-axis bounds so it extends to cover the whole graph.\n xScaleID: GraphComponent.X_AXIS_ID,\n yScaleID: GraphComponent.Y_AXIS_ID,\n // Color the region light green.\n backgroundColor: 'rgba(64, 191, 128, 0.15)',\n };\n this.chartOptions.annotation.annotations.push(normalRegionAnnotation);\n }\n\n /**\n * Colors the point the default series color if it's not abnormal, or outlines\n * with the abnormal color if marked as abnormal.\n *\n * @param series The data series to color points for.\n * @param yNormalBounds The bounds of what should be considered normal.\n * @param seriesLegend The legend info for the series we're working with.\n */\n private colorAbnormalPoints(\n chartjsSeries: any, labeledSeries: LabeledSeries) {\n const pointBackgroundColors = new Array();\n const pointBorderColors = new Array();\n const pointStyle = new Array();\n\n for (let pt of chartjsSeries.data) {\n // pt could also be a number here, so we constrain it to when it's a\n // ChartPoint. For some reason Typescript doesn't like it when we do a\n // test to see if pt is an instanceof ChartPoint so checking for the\n // y-attribute is a workaround.\n pt = pt as ChartPoint;\n const inAbnormalSet = labeledSeries.abnormalCoordinates.has(pt.x);\n\n if (inAbnormalSet) {\n pointBackgroundColors.push(\n labeledSeries.legendInfo.fill.rgb().string());\n pointBorderColors.push(ABNORMAL.rgb().string());\n pointStyle.push('triangle');\n } else {\n pointBackgroundColors.push(\n labeledSeries.legendInfo.fill.rgb().string());\n pointBorderColors.push(labeledSeries.legendInfo.outline.rgb().string());\n pointStyle.push('circle');\n }\n chartjsSeries.pointBackgroundColor = pointBackgroundColors;\n chartjsSeries.pointBorderColor = pointBorderColors;\n chartjsSeries.pointStyle = pointStyle;\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {ChartPoint} from 'chart.js';\nimport {CHECK_RESULT_CODE, PARTIAL} from 'src/app/fhir-resources/observation-interpretation-valueset';\nimport {WHITE} from 'src/app/theme/verily_colors';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {LabeledSeries} from '../../graphdatatypes/labeled-series';\nimport {GraphComponent} from '../graph/graph.component';\nimport {StepGraphComponent} from '../stepgraph/stepgraph.component';\n\n@Component({\n selector: 'app-microbio-graph',\n templateUrl: '../stepgraph/stepgraph.component.html',\n styleUrls: ['../graph.css'],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => MicrobioGraphComponent)\n }]\n})\nexport class MicrobioGraphComponent extends StepGraphComponent {\n constructor(\n sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n }\n\n adjustGeneratedChartConfiguration() {\n // Color points that fall outside of their respective normal ranges.\n for (let i = 0; i < this.data.series.length; i++) {\n const chartjsSeries = this.chartData[i];\n const labeledSeries = this.data.series[i];\n\n const isPositive = labeledSeries.label.includes(CHECK_RESULT_CODE);\n const isPartial = labeledSeries.label.includes(PARTIAL);\n\n const pointStyle = new Array();\n const pointBackgroundColors = new Array();\n const pointBorderColors = new Array();\n\n for (let pt of chartjsSeries.data) {\n // pt could also be a number here, so we constrain it to when it's a\n // ChartPoint. For some reason Typescript doesn't like it when we do a\n // test to see if pt is an instanceof ChartPoint so checking for the\n // y-attribute is a workaround.\n pt = pt as ChartPoint;\n // Making positive points be triangular rather than circular\n if (isPositive) {\n pointStyle.push('triangle');\n } else {\n pointStyle.push('circle');\n }\n // Making partial points have an outline rather than filled in\n if (isPartial) {\n pointBackgroundColors.push(WHITE.rgb().string());\n pointBorderColors.push(\n labeledSeries.legendInfo.outline.rgb().string());\n } else {\n pointBackgroundColors.push(\n labeledSeries.legendInfo.fill.rgb().string());\n pointBorderColors.push(\n labeledSeries.legendInfo.outline.rgb().string());\n }\n (chartjsSeries as any).pointStyle = pointStyle;\n (chartjsSeries as any).pointBackgroundColor = pointBackgroundColors;\n (chartjsSeries as any).pointBorderColor = pointBorderColors;\n }\n }\n }\n /***************************\n * Legend interactions\n * Because of the unique nature of the series in the MicrobioGraph, we do not\n * allow legend interactions for microbiology graphs. This prevents errors\n * that occur when the user hovers over a legend element that might correspond\n * to many series on the chart.\n */\n\n /**\n * @override\n */\n resetChart() {}\n\n /**\n * @override\n */\n focusOnSeries(labeledSeries: LabeledSeries[]) {}\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\n\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\nimport {GraphComponent} from '../graph/graph.component';\nimport {LineGraphComponent} from '../linegraph/linegraph.component';\n\n@Component({\n selector: 'app-scatterplot',\n templateUrl: '../graph/graph.component.html',\n styleUrls: ['../graph.css'],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => ScatterplotComponent)\n }]\n})\nexport class ScatterplotComponent extends LineGraphComponent {\n constructor(\n sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n this.chartTypeString = 'scatter';\n }\n}\n","module.exports = \"\\n
\\n
\\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {DiagnosticGraphData} from '../../graphdatatypes/diagnosticgraphdata';\nimport {MicrobioGraphData} from '../../graphdatatypes/microbiographdata';\nimport {StepGraphData} from '../../graphdatatypes/stepgraphdata';\nimport {GraphComponent} from '../graph/graph.component';\n\n@Component({\n selector: 'app-stepgraph',\n templateUrl: './stepgraph.component.html',\n styleUrls: ['../graph.css'],\n providers: [\n {provide: GraphComponent, useExisting: forwardRef(() => StepGraphComponent)}\n ]\n})\nexport class StepGraphComponent extends\n GraphComponent {\n constructor(\n readonly sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n }\n /**\n * The maximum characters for a y-axis tick label.\n */\n readonly Y_AXIS_TICK_MAX_LENGTH = 12;\n\n /**\n * Splits long tick names into multiple lines.\n *\n * To split a label into multiple lines, we turn a string into an array of\n * strings - each gets their own line when rendered.\n *\n * At most will return 2 lines so that the graph labels do not get too\n * crowded.\n *\n * @param ticks Array of current tick markings.\n */\n adjustTickLabels(ticks: string[]): string[][] {\n return ticks.map(tick => {\n const words = tick.split(' ');\n // keeps track of the resulting array corresponding to the label.\n let resultLabel = [];\n // keeps track of the current line we are building.\n let temp = '';\n for (const word of words) {\n // if adding the new word makes the line go over the max line length,\n // we add the temp line to the list of results and restart the temp\n // string with the word.\n if ((temp + word).length > this.Y_AXIS_TICK_MAX_LENGTH) {\n if (temp.length > 0) {\n resultLabel.push(temp);\n }\n temp = word;\n } else {\n temp = temp.length > 0 ? temp + ' ' + word : word;\n }\n }\n // at the end, we push the remaining line to the result.\n if (temp.length > 0) {\n resultLabel.push(temp);\n }\n\n // in the case that the result label will be more than 2 lines, we only\n // return the first 2 lines so that the graph is not too crowded.\n if (resultLabel.length > 2) {\n resultLabel = resultLabel.splice(0, 2);\n resultLabel[1] += '...';\n }\n return resultLabel;\n });\n }\n\n /**\n * Adjusts the y-axis configuration for the chart.\n */\n prepareForChartConfiguration() {\n this.chartOptions.scales.yAxes[0].type = 'category';\n this.chartOptions.scales.yAxes[0].gridLines = {\n display: true,\n drawOnChartArea: true\n };\n\n // Set up the data points.\n const allLabelsSet = new Set();\n for (const series of this.data.series) {\n series.coordinates.forEach(pt => {\n allLabelsSet.add(pt[1] as string);\n });\n }\n // Show the labels alphabetically along the y-axis.\n const allLabels = Array.from(allLabelsSet).sort();\n // Add blank labels to the top and bottom of the graph to add some\n // padding.\n allLabels.push('\\t');\n allLabels.unshift('\\t');\n this.chartOptions.scales.yAxes[0]['labels'] = allLabels;\n\n // the tick labels as is may be very long so we need to adjust them\n // before they turn into labels. We do this as a callback so that the\n // mapping from data points to the axis still works without adjustment.\n this.chartOptions.scales.yAxes[0].beforeTickToLabelConversion = (scale) => {\n scale.ticks = this.adjustTickLabels(scale.ticks);\n // based on the number of ticks, update the height of the graph\n const height =\n Math.max(GraphComponent.MIN_AXIS_HEIGHT, (scale.ticks.length) * 35);\n scale.chart.canvas.parentNode.style.height = height + 'px';\n };\n }\n adjustGeneratedChartConfiguration() {}\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LIC\n\n/**\n * Class containing information to display on the tooltips\n */\nexport class AnnotatedTooltip {\n /** InnerHTML representing the tooltipChart displayed as tooltip */\n readonly tooltipChart: string;\n /**\n * String[] containing the innerHTML of the additional attachments\n * to be displayed in the tooltip.\n */\n readonly additionalAttachment: string[];\n /**\n * Optional uniqueID used to map additionalAttachments to the correct\n * tooltip if necessary.\n */\n readonly id: string;\n\n constructor(tooltipChart: string, additionalAttachment?: string[], id?: string) {\n this.tooltipChart = tooltipChart;\n if (additionalAttachment) {\n this.additionalAttachment = additionalAttachment;\n }\n if (id) {\n this.id = id;\n }\n }\n\n /**\n * Combines the AnnotatedTooltip[] into a single AnnotatedTooltip by\n * concatenating the tooltipChart strings into a single string, and\n * combining the multiple additionalAttachment arrays into a single array.\n * This combined AnnotatedTooltip will not have a uniqueID, as the id is\n * only reserved for interfacing with the \"Attachment\" buttons.\n * @param tooltipArray AnnotatedTooltip[] that needs to be converted into a single\n * AnnotatedTooltip\n */\n public static combineAnnotatedTooltipArr(tooltipArray: AnnotatedTooltip[]): AnnotatedTooltip {\n\n const attachmentArrays = tooltipArray.map(tt => tt.additionalAttachment);\n // Flattens the array of arrays into one array\n const flattenedArray = ([] as string[]).concat(...attachmentArrays);\n\n let tooltipChart = '';\n for (const annotatedTT of tooltipArray) {\n tooltipChart += annotatedTT.tooltipChart;\n }\n return new AnnotatedTooltip(tooltipChart, flattenedArray);\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {SecurityContext} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {AnnotatedDiagnosticReport} from 'src/app/fhir-resources/annotated/annotated-diagnostic-report';\nimport {v4 as uuid} from 'uuid';\n\nimport {UI_CONSTANTS} from '../../../../constants';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\nimport {Tooltip} from '../tooltips/tooltip';\n\n/*\n * This class makes a tooltip for a DiagnosticReport that applies to all points\n * charted from the same report. It lists the time of the report and the html\n * text attached with the report.\n */\nexport class DiagnosticTooltip extends Tooltip {\n constructor(private addTimestampRow = true) {\n super();\n }\n\n getTooltip(\n annotatedReport: AnnotatedDiagnosticReport,\n sanitizer: DomSanitizer): AnnotatedTooltip {\n const timestamp = annotatedReport.timestamp;\n\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(timestamp, table, sanitizer);\n }\n\n // The AnnotatedTooltip will have the same ID as the button that it\n // corresponds with\n const uniqueID = uuid();\n // Replace the dashes in the UUID to meet HTML requirements.\n const re = /\\-/gi;\n const buttonID = 'button' + uniqueID.replace(re, '');\n // Attach button to the tooltip to display attachments\n this.addAttachmentButton(\n buttonID, UI_CONSTANTS.REPORT_ATTACHMENT, table, sanitizer);\n\n const tooltipChart = table.outerHTML;\n const additionalAttachment = [annotatedReport.attachmentHtml];\n return new AnnotatedTooltip(tooltipChart, additionalAttachment, buttonID);\n }\n\n /**\n * Adds a button that spans the whole row in the tooltip table.\n * @param buttonID UniqueID that helps identify the button\n * @param buttonLabel String reflecting content inside the button\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param sanitizer A DOM sanitizer\n */\n private addAttachmentButton(\n buttonID: string, buttonLabel: string, table: HTMLTableElement,\n sanitizer: DomSanitizer) {\n const row = table.insertRow();\n const cell1 = row.insertCell();\n const button = document.createElement('button');\n // Styles the button\n button.setAttribute('class', 'mat-menu-item');\n // Sets unique button ID (matches the AnnotatedTooltip ID)\n button.setAttribute('id', buttonID);\n button.innerHTML = sanitizer.sanitize(SecurityContext.HTML, buttonLabel);\n cell1.appendChild(button);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Duration} from 'luxon';\nimport {AnnotatedAdministration, MedicationAdministration} from 'src/app/fhir-resources/medication-administration';\nimport {formatNumberWithPrecision} from 'src/app/utils/number_utils';\n\nimport {UI_CONSTANTS} from '../../../../constants';\nimport {AnnotatedMedicationOrder} from '../../../fhir-resources/medication-order';\nimport {Tooltip} from '../tooltips/tooltip';\n\nimport {AnnotatedTooltip} from './annotated-tooltip';\n\n/**\n * Makes a tooltip for a medication order that lists the order's first and last\n * doses in a table.\n */\nexport class MedicationTooltip extends Tooltip {\n getTooltip(annotatedOrder: AnnotatedMedicationOrder, sanitizer: DomSanitizer):\n AnnotatedTooltip {\n const medication = annotatedOrder.label;\n const firstDose =\n Tooltip.formatTimestamp(annotatedOrder.firstAdministration.timestamp);\n const lastDose =\n Tooltip.formatTimestamp(annotatedOrder.lastAdministration.timestamp);\n const dosageInstruction = annotatedOrder.order.dosageInstruction;\n const table = Tooltip.createNewTable();\n Tooltip.addHeader(\n `${medication}: Order #${annotatedOrder.order.orderId}`, table,\n sanitizer);\n Tooltip.addRow(table, [UI_CONSTANTS.FIRST_DOSE, firstDose], sanitizer);\n Tooltip.addRow(table, [UI_CONSTANTS.LAST_DOSE, lastDose], sanitizer);\n Tooltip.addRow(\n table, [UI_CONSTANTS.DOSAGE_INSTRUCTIONS, dosageInstruction],\n sanitizer);\n\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n\n/**\n * Makes a tooltip for a medication administration that shows its dose\n * as well as the time since the last dose.\n */\nexport class MedicationAdministrationTooltip extends\n Tooltip {\n getTooltip(\n administrations: AnnotatedAdministration[],\n sanitizer: DomSanitizer): AnnotatedTooltip {\n const timestamp = administrations[0].medAdministration.timestamp;\n const table = Tooltip.createNewTable();\n for (const administration of administrations) {\n Tooltip.addHeader(\n `${Tooltip.formatTimestamp(timestamp)}: ${\n administration.medAdministration.rxNormCode\n .label} dose. Part of Order #${\n administration.medAdministration.medicationOrderId}`,\n table, sanitizer, 3);\n Tooltip.addRow(table, ['', 'Time', 'Dose'], sanitizer);\n Tooltip.addRow(\n table,\n [\n UI_CONSTANTS.THIS_DOSE,\n Tooltip.formatTimestamp(administration.medAdministration.timestamp),\n this.formatDosage(administration.medAdministration)\n ],\n sanitizer);\n\n if (administration.previousDose) {\n const timestampDifference: Duration =\n administration.medAdministration.timestamp.diff(\n administration.previousDose.medAdministration.timestamp);\n\n const doseDiffText =\n Tooltip.formatTimestamp(\n administration.previousDose.medAdministration.timestamp) +\n '
(' + timestampDifference.toFormat('h:m') +\n ' before this dose)';\n\n Tooltip.addRow(\n table,\n [\n UI_CONSTANTS.PREVIOUS_DOSE, doseDiffText,\n this.formatDosage(administration.previousDose.medAdministration)\n ],\n sanitizer);\n } else {\n Tooltip.addRow(\n table, [UI_CONSTANTS.NO_PREVIOUS_DOSE], sanitizer, undefined, false,\n 3);\n }\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n\n private formatDosage(administration: MedicationAdministration) {\n return formatNumberWithPrecision(administration.dosage.quantity) + ' ' +\n administration.dosage.unit;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport * as Color from 'color';\nimport {AnnotatedMicrobioReport} from 'src/app/fhir-resources/annotated/annotated-microbio-report';\nimport {DiagnosticReportStatus} from 'src/app/fhir-resources/diagnostic-report';\n\nimport {UI_CONSTANTS} from '../../../../constants';\nimport {AnnotatedTooltip} from './annotated-tooltip';\nimport {Tooltip} from './tooltip';\n\n/*\n * This class makes a tooltip for BCH Microbio DiagnosticReport that applies to\n * all points charted from the same report. It lists the time of the report, the\n * report status, as well as all results contained in the report.\n */\nexport class MicrobioTooltip extends Tooltip {\n constructor(private addTimestampRow = true, private color?: Color) {\n super();\n }\n\n getTooltip(\n annotatedReport: AnnotatedMicrobioReport, sanitizer: DomSanitizer,\n isAbnormal: boolean = false): AnnotatedTooltip {\n const status = DiagnosticReportStatus[annotatedReport.report.status];\n const results = annotatedReport.report.results;\n const timestamp = annotatedReport.timestamp;\n const specimen = annotatedReport.report.specimen.type;\n\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(timestamp, table, sanitizer);\n }\n\n Tooltip.addHeader(UI_CONSTANTS.RESULT, table, sanitizer);\n\n for (const result of results) {\n Tooltip.addRow(\n table, [result.display, result.interpretation.display], sanitizer,\n this.color, isAbnormal);\n }\n Tooltip.addRow(table, [UI_CONSTANTS.STATUS, status], sanitizer);\n Tooltip.addRow(table, [UI_CONSTANTS.SPECIMEN, specimen], sanitizer);\n\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport * as Color from 'color';\nimport {DateTime} from 'luxon';\nimport {AnnotatedObservation} from 'src/app/fhir-resources/annotated/annotated-observation';\nimport {Observation} from 'src/app/fhir-resources/observation';\nimport {NORMAL} from 'src/app/fhir-resources/observation-interpretation-valueset';\n\nimport {AnnotatedTooltip} from './annotated-tooltip';\nimport {Tooltip} from './tooltip';\n\n/*\n * This class makes a tooltip for a list of Observations containing discrete, or\n * qualitative, values rather than quantitative results. The list of\n * Observations should all have the same timestamp.\n */\nexport class DiscreteObservationTooltip extends Tooltip {\n constructor(private addTimestampRow = true) {\n super();\n }\n\n /**\n * Returns the HTML for a generic tooltip for discrete observations.\n * @param observations An array of type Observation\n * @param sanitizer A DOM sanitizer\n * @param isAbnormal A boolean used to change the color of the text if\n * abnormal\n * @returns A string representing the HTML table.\n */\n getTooltip(observations: Observation[], sanitizer: DomSanitizer):\n AnnotatedTooltip {\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(observations[0].timestamp, table, sanitizer);\n }\n for (const obs of observations) {\n let isAbnormal = false;\n let obsValue = obs.result;\n if (obs.interpretation && obs.interpretation.code !== NORMAL) {\n isAbnormal = true;\n obsValue = obs.result + ' (' + obs.interpretation.display + ')';\n }\n Tooltip.addRow(\n table, [obs.label, obsValue], sanitizer,\n undefined, // color\n isAbnormal);\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n\n/**\n * Makes a generic tooltip for an AnnotatedObservation with rows for each of\n * its annotation values.\n */\nexport class GenericAnnotatedObservationTooltip extends\n Tooltip {\n constructor(private addTimestampRow: boolean, private color: Color) {\n super();\n }\n\n /**\n * Returns the HTML for a generic tooltip.\n * @param observation The AnnotatedObservation used to generate the tooltip\n * @param sanitizer A DOM sanitizer\n * @param isAbnormal A boolean used to change the color of the text if\n * abnormal\n * @returns If the observation has annotations, a AnnotatedTooltip.\n * If there are no annotations, will return undefined.\n */\n getTooltip(\n observation: AnnotatedObservation, sanitizer: DomSanitizer,\n isAbnormal: boolean = false): AnnotatedTooltip|undefined {\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(\n observation.observation.timestamp, table, sanitizer);\n }\n\n Tooltip.addRow(\n table, [observation.label, this.getObservationValue(observation)],\n sanitizer, this.color, isAbnormal);\n for (const annotation of observation.annotationValues) {\n Tooltip.addRow(table, annotation, sanitizer);\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n /**\n * Helper function that returns a string that reflects the observation\n * value depicted on the tooltip.\n * @param observation The AnnotatedObservation used to generate the tooltip\n */\n\n private getObservationValue(observation: AnnotatedObservation): string {\n const interpretation = observation.observation.interpretation ?\n ' (' + observation.observation.interpretation.display + ')' :\n '';\n // Example: Temperature | 38.8 Deg C (HI)\n if (observation.observation.value && observation.observation.unit) {\n return observation.observation.value.value.toString() + ' ' +\n observation.observation.unit + interpretation;\n }\n // Example: Bacteria Urinalysis | Trace Graded/hpf (ABN)\n if (observation.observation.result) {\n return observation.observation.result + interpretation;\n }\n // Example: Blood Pressure | (HI)\n return interpretation;\n }\n}\n\n/**\n * Makes a generic tooltip for an AnnotatedObservation with rows for each of\n * its annotation values.\n */\nexport class GenericAbnormalTooltip extends\n Tooltip<{[key: string]: number | string}> {\n constructor(private addTimestampRow: boolean, private color: Color) {\n super();\n }\n\n /**\n * Returns the HTML for a generic tooltip.\n * @param params The parameters necessary for the AbnormalTooltip text. It\n * should contain a timestamp field, a value field, a label field, and a\n * unit field.\n * @param sanitizer A DOM sanitizer\n * @returns If the observation has annotations, an AnnotatedTooltip.\n * If there are no annotations, will return undefined.\n */\n getTooltip(params: {[key: string]: number|string}, sanitizer: DomSanitizer):\n AnnotatedTooltip|undefined {\n const table = Tooltip.createNewTable();\n const millis: any = params['timestamp'];\n const timestamp = DateTime.fromMillis(millis).toLocal();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(timestamp, table, sanitizer);\n }\n\n Tooltip.addHeader('Caution: abnormal value', table, sanitizer);\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {SecurityContext} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport * as Color from 'color';\nimport {DateTime} from 'luxon';\n\nimport * as Colors from '../../../theme/verily_colors';\n\nimport {AnnotatedTooltip} from './annotated-tooltip';\n\n/*\n * This base class contains useful helper methods used while making a custom\n * tooltip for a c3 chart, including adding a row to the table, resetting the\n * table, and adding a header.\n *\n * This is functionally a static class, but Typescript doesn't allow for\n * abstract static functions. We make all tooltip classes inherit from Tooltip\n * so that they must implement the getTooltip function.\n *\n * @param T The type of data that the tooltip is derived from.\n */\nexport abstract class Tooltip {\n /**CSS styling for normal tooltip circular color swatch */\n static readonly TOOLTIP_NORMAL_CSS =\n 'display: inline-block; height: 10px; width: 10px; ' +\n 'margin-right: 6px; border-radius: 50%;';\n /**CSS styling for abnormal tooltip triangular color swatch */\n static readonly TOOLTIP_ABNORMAL_CSS =\n 'width: 0; display:inline-block; margin-right: 6px; ' +\n 'height: 0; border-left: 6px solid transparent; ' +\n 'border-right: 6px solid transparent; border-bottom: ' +\n '6px solid ';\n\n /**\n * Creates a new table for the tooltip. Returns a HTMLTableElement.\n */\n static createNewTable(): HTMLTableElement {\n const table: HTMLTableElement = document.createElement('table');\n table.setAttribute('class', 'tooltip');\n return table;\n }\n\n /**\n * Adds a header on the tooltips depicting the timepoint of the data\n * @param timestamp DateTime reflecting the datapoint depicted on the tooltip\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param sanitizer A DOM sanitizer\n * @param colSpan The number of columns that the header spans\n */\n static addTimeHeader(\n timestamp: DateTime, table: HTMLTableElement, sanitizer: DomSanitizer,\n colSpan = 2) {\n Tooltip.addHeader(\n Tooltip.formatTimestamp(timestamp), table, sanitizer, colSpan);\n }\n\n /**\n * Returns a string of the timestamp in format: MM/DD/YYYY HH:MM\n * @param timestamp DateTime reflecting the datapoint depicted on the tooltip\n */\n static formatTimestamp(timestamp: DateTime) {\n return timestamp.toLocal().toLocaleString() + ' ' +\n timestamp.toLocal().toLocaleString(DateTime.TIME_24_SIMPLE);\n }\n\n /**\n * Adds a header to the HTMLTableElement\n * @param content String reflecting content inside the header\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param sanitizer A DOM sanitizer\n * @param colSpan The number of columns that the header spans\n */\n static addHeader(\n content: string, table: HTMLTableElement, sanitizer: DomSanitizer,\n colSpan = 2) {\n // Header row\n const row = table.insertRow();\n const headerCell = document.createElement('th');\n row.appendChild(headerCell);\n headerCell.colSpan = colSpan;\n headerCell.innerHTML = sanitizer.sanitize(SecurityContext.HTML, content);\n }\n\n /**\n * Adds row to the HTMLTableElement\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param cellText String array reflecting the content on the tooltip\n * @param sanitizer A DOM sanitizer\n * @param color Color that is displayed on the legend and the graph.\n * @param isAbnormal Boolean that depicts whether the datapoint is abnormal\n * @param colspan Number that specifies how many columns each cell should span\n */\n static addRow(\n table: HTMLTableElement, cellText: string[], sanitizer: DomSanitizer,\n color?: Color, isAbnormal?: boolean, colspan?: number) {\n const row = table.insertRow();\n for (let i = 0; i < cellText.length; i++) {\n const cell1 = row.insertCell();\n if (colspan) {\n cell1.setAttribute('colspan', colspan.toString());\n }\n if (i === 0) {\n cell1.className = 'name';\n if (isAbnormal) {\n cell1.setAttribute('style', 'color: ' + Colors.ABNORMAL);\n }\n if (color) {\n cell1.appendChild(Tooltip.makeColorSwatch(color, isAbnormal));\n const div = document.createElement('div');\n div.setAttribute('style', 'display: inline-block;');\n div.innerHTML = sanitizer.sanitize(SecurityContext.HTML, cellText[i]);\n cell1.appendChild(div);\n continue;\n }\n } else {\n cell1.className = 'value';\n if (isAbnormal) {\n cell1.setAttribute('style', 'color: ' + Colors.ABNORMAL);\n }\n }\n cell1.innerHTML = sanitizer.sanitize(SecurityContext.HTML, cellText[i]);\n }\n }\n\n /**\n * Helper function that creates the color swatch on the tooltips. If it\n * is regular, it is rectangular. If it is abnormal, it is triangular.\n * @param color Color that is displayed on the legend and the graph.\n * @param isAbnormal Boolean that depicts whether the datapoint is abnormal\n */\n static makeColorSwatch(color: Color, isAbnormal: boolean = false):\n HTMLSpanElement {\n const colorSpan: HTMLSpanElement = document.createElement('span');\n if (isAbnormal) {\n // Creates a triangular color swatch\n colorSpan.setAttribute(\n 'style', this.TOOLTIP_ABNORMAL_CSS + color.toString());\n } else {\n // Creates a circular color swatch\n colorSpan.setAttribute(\n 'style',\n 'background-color: ' + color.toString() + '; ' +\n this.TOOLTIP_NORMAL_CSS);\n }\n return colorSpan;\n }\n\n abstract getTooltip(inputValue: T, sanitizer: DomSanitizer): AnnotatedTooltip;\n}\n\n/**\n * This is a generic tooltip for a data point on the graph. It just takes in\n * the data points C3 provides to the tooltip function, then returns a table\n * with a header of the timestamp and a row for each included point.\n * The left hand side of each row is the series label. The right hand side of\n * each row is the y-value.\n */\nexport class StandardTooltip extends Tooltip {\n constructor(\n private dataPoints: any[], private color: Function, private unit = '') {\n super();\n }\n\n getTooltip(unused: any, sanitizer: DomSanitizer): AnnotatedTooltip {\n const table = Tooltip.createNewTable();\n Tooltip.addTimeHeader(\n DateTime.fromJSDate(new Date(this.dataPoints[0].x)), table, sanitizer);\n\n for (const pt of this.dataPoints) {\n Tooltip.addRow(\n table, [pt.name, pt.value + ' ' + this.unit], sanitizer,\n this.color(pt));\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n","/**\n * Error class for errors with request IDs.\n * Formats the error message with the list of request IDs, the message,\n * and optional json.\n */\nexport class ResultError extends Error {\n readonly shortMessage;\n\n constructor(requestIds: Set, message: string, json?: any) {\n const requestIDMessage = requestIds.size > 0 ?\n `Request IDs: ${Array.from(requestIds).join(', ')}.\\n` :\n '';\n const shortMessage = requestIDMessage + message;\n let completeMessage = shortMessage;\n if (json) {\n completeMessage += `\\nJSON: ${JSON.stringify(json, null, 4)}`;\n }\n super(completeMessage);\n // 'super' needs to be called before accessing 'this', so we need to set\n // this.shortMessage after calling 'super'.\n this.shortMessage = shortMessage;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\nimport {DateTime, Interval} from 'luxon';\n\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from '../conceptmappings/resource-code-manager';\nimport {DisplayGrouping} from '../conceptmappings/resource-codes/display-grouping';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ResultError} from '../result-error';\n\n/**\n * This class is a service that communicates the user-selected concepts on the\n * configuration page (SetupComponent) to CardContainerComponent.\n */\n@Injectable({providedIn: 'root'})\nexport class SetupDataService {\n private today = DateTime.local().startOf('day');\n\n /** Which concepts to display. */\n selectedConcepts = new Array();\n /** Which encounters to show in the date picker. */\n encounters = new Array();\n encountersError?: ResultError;\n /**\n * The first date range to load into the app.\n */\n selectedDateRange: Interval =\n Interval.fromDateTimes(this.today.minus({days: 7}), this.today);\n\n readonly displayGroupMapping: Promise> =\n this.resourceCodeManager.getDisplayGroupMapping(\n this.fhirService, this.resourceCodeCreator);\n\n constructor(\n private resourceCodeManager: ResourceCodeManager,\n private fhirService: FhirService,\n private resourceCodeCreator: ResourceCodeCreator) {}\n}\n","module.exports = \"button {\\n margin-right: 10px;\\n}\\n\\nh3 {\\n padding: 5px;\\n margin: 10px;\\n}\\n\\nh1, h2 {\\n font-family: 'Montserrat', sans-serif;\\n}\\n\\n.search-icon {\\n padding-top: 20px;\\n vertical-align: bottom;\\n}\\n\\n.actions {\\n margin-left: auto;\\n padding: 20px;\\n}\\n\\n.category {\\n padding-left: 10px;\\n}\\n\\n.category-group-tile {\\n padding-bottom: 10px;\\n}\\n\\n.category-label {\\n line-height: 28px;\\n margin: 0px;\\n padding: 0px;\\n padding-left: 15px;\\n}\\n\\n.mainSetup {\\n width: 100%;\\n padding-top: 20px;\\n padding-left: 40px;\\n color: white;\\n height: 100%;\\n}\\n\\n.conceptOptions {\\n padding-left: 25px;\\n}\\n\\n::ng-deep .mat-figure {\\n -ms-flex-align: start !important;\\n align-items: flex-start !important;\\n -ms-flex-pack: left !important;\\n justify-content: left !important;\\n display: -ms-grid !important;\\n}\\n\\n::ng-deep .mat-checkbox-label {\\n line-height: 28px !important;\\n}\\n\\n::ng-deep .mat-toolbar-row, .mat-toolbar-single-row {\\n display: flex;\\n display: -ms-flexbox;\\n}\\n\\n.defaultBackgroundColor {\\n background-color: #202020; /* Grey 900 */\\n}\\n\\n.accentBackgroundColor {\\n /* Deep Purple 800 to Pink 900 */\\n background-image: linear-gradient(to right, #4527A0 , #870D4E);\\n color: white;\\n}\\n\\n::ng-deep app-setup .mat-form-field-wrapper {\\n color: white;\\n}\\n\\n::ng-deep app-setup .mat-checkbox-frame {\\n border-color: white;\\n}\\n\\n::ng-deep app-setup .mat-radio-outer-circle {\\n border-color: white;\\n}\\n\\n::ng-deep app-setup .mat-checkbox-disabled .mat-checkbox-label {\\n color: gray;\\n}\\n\\n::ng-deep app-setup .mat-form-field-empty.mat-form-field-label {\\n color: white;\\n}\\n\\n::ng-deep app-setup .mat-form-field-label {\\n color:white !important;\\n}\\n\\n::ng-deep app-setup .mat-form-field-underline {\\n background-color: white !important;\\n}\\n\\n::ng-deep app-setup .mat-form-field.mat-focused .mat-form-field-ripple {\\n background-color: white !important;\\n}\\n\\n::ng-deep app-setup .mat-form-field-underline {\\n background-color: white !important;\\n}\\n\\napp-setup .mat-input-placeholder {\\n color: white;\\n}\\n\\n.encounters-error {\\n width: 50%;\\n margin-bottom: 16px;\\n white-space: pre-wrap;\\n word-break: break-all;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvc2V0dXAvc2V0dXAuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxxQ0FBcUM7QUFDdkM7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxnQ0FBa0M7TUFBbEMsa0NBQWtDO0VBQ2xDLDhCQUFnQztNQUFoQyxnQ0FBZ0M7RUFDaEMsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFLHlCQUF5QixFQUFFLGFBQWE7QUFDMUM7O0FBRUE7RUFDRSxnQ0FBZ0M7Q0FDakMsOERBQThEO0NBQzlELFlBQVk7QUFDYjs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFdBQVc7QUFDYjs7QUFDQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLFVBQVU7RUFDVixtQkFBbUI7RUFDbkIscUJBQXFCO0VBQ3JCLHFCQUFxQjtBQUN2QiIsImZpbGUiOiJzcmMvYXBwL3NldHVwL3NldHVwLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJidXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbmgzIHtcbiAgcGFkZGluZzogNXB4O1xuICBtYXJnaW46IDEwcHg7XG59XG5cbmgxLCBoMiB7XG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG59XG5cbi5zZWFyY2gtaWNvbiB7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4uYWN0aW9ucyB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nOiAyMHB4O1xufVxuXG4uY2F0ZWdvcnkge1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5jYXRlZ29yeS1ncm91cC10aWxlIHtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XG5cbi5jYXRlZ29yeS1sYWJlbCB7XG4gIGxpbmUtaGVpZ2h0OiAyOHB4O1xuICBtYXJnaW46IDBweDtcbiAgcGFkZGluZzogMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG59XG5cbi5tYWluU2V0dXAge1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogNDBweDtcbiAgY29sb3I6IHdoaXRlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5jb25jZXB0T3B0aW9ucyB7XG4gIHBhZGRpbmctbGVmdDogMjVweDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZmlndXJlIHtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQgIWltcG9ydGFudDtcbiAganVzdGlmeS1jb250ZW50OiBsZWZ0ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IC1tcy1ncmlkICFpbXBvcnRhbnQ7XG59XG5cbjo6bmctZGVlcCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgbGluZS1oZWlnaHQ6IDI4cHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtdG9vbGJhci1yb3csIC5tYXQtdG9vbGJhci1zaW5nbGUtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG59XG5cbi5kZWZhdWx0QmFja2dyb3VuZENvbG9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsgLyogR3JleSA5MDAgKi9cbn1cblxuLmFjY2VudEJhY2tncm91bmRDb2xvciB7XG4gIC8qIERlZXAgUHVycGxlIDgwMCB0byBQaW5rIDkwMCAqL1xuIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzQ1MjdBMCAsICM4NzBENEUpO1xuIGNvbG9yOiB3aGl0ZTtcbn1cblxuOjpuZy1kZWVwICBhcHAtc2V0dXAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIge1xuICBjb2xvcjogd2hpdGU7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1jaGVja2JveC1mcmFtZSB7XG4gIGJvcmRlci1jb2xvcjogd2hpdGU7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6IHdoaXRlO1xufVxuXG46Om5nLWRlZXAgYXBwLXNldHVwIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbCB7XG4gIGNvbG9yOiBncmF5O1xufVxuOjpuZy1kZWVwIGFwcC1zZXR1cCAubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogd2hpdGU7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6d2hpdGUgIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIGFwcC1zZXR1cCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIGFwcC1zZXR1cCAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG59XG5cbmFwcC1zZXR1cCAubWF0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHdoaXRlO1xufVxuXG4uZW5jb3VudGVycy1lcnJvciB7XG4gIHdpZHRoOiA1MCU7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuIl19 */\"","module.exports = \"\\n

{{uiConstants.INITIAL_CONFIGURATION_HEADER}}  

\\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n

{{uiConstants.WHICH_ENCOUNTER_FIRST}}

\\n \\n \\n errorError loading patient encounters.\\n Technical details:
{{setupDataService.encountersError.message}}\\n
\\n \\n
\\n \\n {{encounter.period.toFormat('MM/dd/yyyy')}} {{uiConstants.ENCOUNTER}}\\n \\n
\\n
\\n \\n {{item[1]}}\\n \\n
\\n
\\n
\\n
\\n

{{uiConstants.WHICH_CONCEPTS_FIRST}}

\\n \\n \\n
\\n
\\n \\n \\n search\\n \\n
\\n \\n \\n \\n \\n
\\n
\\n

{{entry[0].label}}

\\n
\\n
\\n \\n {{element.label}} {{uiConstants.NO_DATA_PAST_SIX_MOS}}\\n {{uiConstants.CHECKING_DATA_AVAILABILITY}}\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n {{uiConstants.NO_RESULTS}}\\n
\\n
\\n
\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject, OnDestroy, ViewChild} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {MatRadioGroup} from '@angular/material/radio';\nimport {Router} from '@angular/router';\nimport {DateTime, Interval} from 'luxon';\nimport {Observable} from 'rxjs';\nimport {map, startWith} from 'rxjs/operators';\nimport {APP_TIMESPAN, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {environment} from '../../environments/environment';\nimport {DisplayGrouping} from '../conceptmappings/resource-codes/display-grouping';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {RxNormCodeGroup} from '../conceptmappings/resource-codes/rx-norm-group';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ResultError} from '../result-error';\n\nimport {SetupDataService} from './setup-data.service';\n\nenum LoadStatus {\n LOADING,\n DATA_AVAILABLE,\n DATA_UNAVAILABLE\n}\n\n/**\n * Contains the intial configuration options for the MedTimeLine.\n * Users can choose which concepts to display, or pick the default\n * configuration.\n */\n@Component({\n selector: 'app-setup',\n templateUrl: './setup.component.html',\n styleUrls: ['./setup.component.css']\n})\nexport class SetupComponent implements OnDestroy {\n readonly allConcepts: Promise;\n readonly checkedConcepts = new Map();\n readonly chosenConcepts = new Array();\n readonly useDebugger = environment.useDebugger;\n\n readonly statusConsts = LoadStatus;\n\n /**\n * Which encounter to load into the app first.\n */\n @ViewChild(MatRadioGroup) selectedDateRange: MatRadioGroup;\n\n /**\n * This FormControl monitors changes in the user input typed in the\n * autocomplete.\n */\n readonly conceptCtrl = new FormControl();\n /**\n * An Observable of filtered [DisplayGrouping, ResourceCodesForCard[] pairings\n * based on user input in the autocomplete. Each element of the array contains\n * a DisplayGrouping and filtered ResourceCodesForCards that belong to that\n * DisplayGrouping.\n */\n displayGroupingOptions: Observable>;\n\n /**\n * An array of DisplayGroupings and AxisGroup that belong to that\n * grouping.\n */\n displayGroupings: Promise>;\n\n /**\n * Holds whether there's any data available for each resource code group.\n */\n readonly codeGroupAvailable = new Map();\n\n /**\n * List of times the patient was in the hospital.\n */\n encounters: Encounter[];\n\n // Fixed time periods to offer as options for selection.\n private today: DateTime = DateTime.local().startOf('day');\n readonly lastOneDay =\n Interval.fromDateTimes(this.today.minus({days: 1}), this.today);\n readonly lastThreeDays =\n Interval.fromDateTimes(this.today.minus({days: 3}), this.today);\n readonly lastSevenDays =\n Interval.fromDateTimes(this.today.minus({days: 7}), this.today);\n readonly lastMonth =\n Interval.fromDateTimes(this.today.minus({months: 1}), this.today);\n readonly lastThreeMonths =\n Interval.fromDateTimes(this.today.minus({months: 3}), this.today);\n\n /**\n * The time options that are always available. The boolean indicates which is\n * selected by default.\n */\n staticTimeOptions: Array<[Interval, string, boolean]>;\n\n sortResources = (function(a, b) {\n return a.label.localeCompare(b.label);\n });\n\n /**\n * Promise to load all Medication data that when resolved returns a Set of\n * all RxNormCodes that have data available within the App Timeframe.\n *\n * We load all the medication data on setup to cut down on the number of\n * calls for medication administration data availability and enhance\n * performance.\n */\n private readonly loadedMedications =\n this.fhirService.dataAvailableForMedications();\n\n ngOnDestroy() {\n // Pass the selected information through to the setup data service.\n this.setupDataService.selectedConcepts = this.chosenConcepts;\n this.setupDataService.encounters = this.encounters;\n this.setupDataService.selectedDateRange = this.selectedDateRange.value ?\n this.selectedDateRange.value :\n Interval.fromDateTimes(this.today.minus({days: 7}), this.today);\n }\n\n constructor(\n private router: Router, readonly setupDataService: SetupDataService,\n private fhirService: FhirService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n this.allConcepts =\n setupDataService.displayGroupMapping.then((displayGroups) => {\n /* Load in the concepts to display, flattening them\n * all into a single-depth array. */\n return Array.from(displayGroups.values())\n .reduce((acc, val) => acc.concat(val), []);\n });\n this.displayGroupings =\n setupDataService.displayGroupMapping.then((displayGroups) => {\n return Array.from(displayGroups.entries());\n });\n this.staticTimeOptions = [\n [this.lastThreeMonths, uiConstants.LAST_THREE_MONTHS, false],\n [this.lastMonth, uiConstants.LAST_MONTH, false],\n [this.lastSevenDays, uiConstants.LAST_SEVEN_DAYS, true],\n [this.lastThreeDays, uiConstants.LAST_THREE_DAYS, false],\n [this.lastOneDay, uiConstants.LAST_ONE_DAY, false]\n ];\n this.setupInterface();\n }\n\n /**\n * Sets the status for the AxisGroup based on whether data is available.\n * If not available, the AxisGroup will be unchecked.\n *\n * @param axisGroup AxisGroup to set availability status for\n * @param available whether there is any data for the AxisGroup\n */\n setAxisGroupStatus(axisGroup: AxisGroup, available: boolean) {\n axisGroup.dataAvailable = available;\n if (!available) {\n this.checkedConcepts[axisGroup.label] = false;\n }\n this.codeGroupAvailable.set(\n axisGroup.label,\n available ? LoadStatus.DATA_AVAILABLE : LoadStatus.DATA_UNAVAILABLE);\n }\n\n /**\n * Sets up availability for AxisGroups that are associated with Medications.\n *\n * Since MedicationAdministration loading takes a long time (due to Cerner\n * limitations), we have preloaded the availability for all RxNormCodes.\n * Instead of making a call to the server for each Medication to check\n * availability, we use the pre-loaded list of available RxNormCodes.\n *\n * @param medAxisGroups AxisGroups with at least one axis that has an\n * RxNormCodeGroup.\n */\n setupMedicationAxisGroups(medAxisGroups: AxisGroup[]) {\n this.loadedMedications.then(rxNormCodesWithData => {\n medAxisGroups.forEach((axisGroup: AxisGroup) => {\n const availablityPromises = axisGroup.axes.map(axis => {\n // some AxisGroups have RxNormCodeGroups and non-RxNormCodeGroups axes\n // such as Medication administrations and monitoring (LOINC). We check\n // for availability differently depending on the resource group type.\n if (axis.resourceGroup instanceof RxNormCodeGroup) {\n const axisHasData = axis.resourceGroup.resourceCodes.some(\n (code: RxNormCode) => rxNormCodesWithData.has(code));\n // since we are not using the axisDataAvailableInAppTimeScope\n // function, we need to set axisDataAvailable manually\n axis.axisDataAvailable = axisHasData;\n return Promise.resolve(axisHasData);\n } else {\n return axis.axisDataAvailableInAppTimeScope();\n }\n });\n Promise.all(availablityPromises).then(availablityList => {\n this.setAxisGroupStatus(\n axisGroup, availablityList.some(avail => !!avail));\n });\n });\n });\n }\n\n setupInterface() {\n // Retrieve the patient encounters. When they load in asynchronously,\n // the radio buttons for encounter selection will show up.\n this.getEncounters();\n const medAxisGroups = [];\n this.displayGroupings.then((displayGroupings) => {\n displayGroupings.forEach((row) => {\n // row[1] is an AxisGroup[] corresponding to the display grouping in\n // row[0].\n const axisGroupArray = row[1];\n axisGroupArray.forEach((axisGroup) => {\n // Check off concepts that are on by default and set initial status\n // to loading.\n this.checkedConcepts[axisGroup.label] =\n axisGroup.axes.some(axis => axis.resourceGroup.showByDefault);\n this.codeGroupAvailable.set(axisGroup.label, LoadStatus.LOADING);\n\n // if any of the axes in the axis group are for RxNormCodeGroups,\n // we handle the axis group differently for performance reasons.\n if (axisGroup.axes.some(\n axis => axis.resourceGroup instanceof RxNormCodeGroup)) {\n medAxisGroups.push(axisGroup);\n } else {\n axisGroup.dataAvailableInAppTimeScope().then(available => {\n this.setAxisGroupStatus(axisGroup, available);\n });\n }\n });\n });\n this.setupMedicationAxisGroups(medAxisGroups);\n\n // Watch for changes to the user input on the autocomplete panel.\n this.displayGroupingOptions = this.conceptCtrl.valueChanges.pipe(\n startWith(\n ''), // The autocomplete input starts with nothing typed in.\n map(concept => concept ? this.filter(concept, displayGroupings) :\n displayGroupings.slice()));\n });\n }\n\n private getEncounters() {\n this.setupDataService.encountersError = null;\n this.fhirService.getEncountersForPatient(APP_TIMESPAN)\n .then(\n encounters => {\n if (encounters.length > 0) {\n this.encounters = encounters.sort(\n (a, b) =>\n a.period.start.toMillis() - b.period.start.toMillis());\n }\n },\n rejection => {\n if (rejection instanceof ResultError) {\n this.setupDataService.encountersError = rejection;\n } else if (rejection instanceof Error) {\n this.setupDataService.encountersError =\n new ResultError(new Set(), rejection.message);\n } else {\n this.setupDataService.encountersError =\n new ResultError(new Set(), '', rejection);\n }\n });\n }\n\n /**\n * The user wishes to continue to the main screen of MedTimeLine, with all\n * charts selected.\n */\n onContinue() {\n this.allConcepts.then((allConcepts) => {\n for (const concept of allConcepts) {\n if (this.checkedConcepts[concept.label]) {\n this.chosenConcepts.push(concept);\n }\n }\n this.router.navigate(['/main'], {skipLocationChange: true});\n });\n }\n\n /**\n * The user wishes to select all concepts.\n */\n selectAll() {\n this.allConcepts.then((allConcepts) => {\n for (const concept of allConcepts) {\n if (this.codeGroupAvailable.has(concept.label) &&\n this.codeGroupAvailable.get(concept.label) !==\n LoadStatus.DATA_UNAVAILABLE) {\n this.checkedConcepts[concept.label] = true;\n }\n }\n });\n }\n\n /**\n * The user wishes to clear all select concepts.\n */\n clearAll() {\n this.allConcepts.then((allConcepts) => {\n for (const concept of allConcepts) {\n this.checkedConcepts[concept.label] = false;\n }\n });\n }\n\n /**\n * Filter the concepts shown on the autocomplete menu.\n */\n filter(concept, displayGroupings: Array<[DisplayGrouping, AxisGroup[]]>):\n any[] {\n return displayGroupings\n .filter(entry => {\n return entry[1].some(\n axis => axis.label.toLowerCase().indexOf(\n concept.toLowerCase()) === 0);\n })\n .map(function(entry) {\n const displayGrouping: DisplayGrouping = entry[0];\n const resourceCodesFiltered = entry[1].filter(\n codes => codes.label.toLowerCase().indexOf(\n concept.toLowerCase()) === 0);\n return [displayGrouping, resourceCodesFiltered];\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport * as Color from 'color';\n/**\n * Encodings of the colors for Verily branding.\n */\n\n// Primary color palette\nexport const GREY_900 = Color('#202020');\nexport const BLACK = Color('#000000');\nexport const BLUE_A400 = Color('#2878FF');\nexport const BLUE_A700 = Color('#2861FF');\nexport const DEEP_PURPLE_600 = Color('#5E35B1');\nexport const DEEP_PURPLE_800 = Color('#4527A0');\nexport const PINK_A700 = Color('#C41061');\nexport const PINK_900 = Color('#870D4E');\nexport const PINK_A400 = Color('#FF1643');\nexport const PINK_A700_DARKER = Color('#D40000');\nexport const BLUE_GREY_100 = Color('#C3D7DB');\nexport const BLUE_GREY_500 = Color('#5F7C8A');\nexport const BLUE_GREY_50 = Color('#EBEEF0');\nexport const WHITE = Color('#FFFFFF');\n\n// Secondary color palette\nexport const CYAN = Color('#00C6EF');\nexport const DEEP_CYAN = Color('#009DB7');\nexport const TURQUOISE = Color('#07796A');\nexport const DEEP_TURQUOISE = Color('#045B4C');\nexport const GREEN = Color('#0D8D39');\nexport const DEEP_GREEN = Color('#056823');\nexport const LIME = Color('#80BA17');\nexport const DEEP_LIME = Color('#668E0E');\nexport const GOLD = Color('#FFB233');\nexport const DEEP_GOLD = Color('#C38419');\nexport const ORANGE = Color('#FF8117');\nexport const DEEP_ORANGE = Color('#C35308');\nexport const CORAL = Color('#FF5052');\nexport const DEEP_CORAL = Color('#C14047');\n\n// Color to indicate a selected item.\nexport const SELECTED = BLUE_GREY_50;\n\nexport const ABNORMAL = PINK_A700_DARKER;\n\n/**\n * Returns all the colors that are acceptable for data points to be plotted in.\n */\nexport function getDataColors(): Color[] {\n return [BLUE_A700, DEEP_PURPLE_800, PINK_900, GREEN, GOLD, ORANGE, TURQUOISE];\n}\n","module.exports = \".datePicker {\\n background-color: white;\\n padding-top: 20px;\\n}\\n\\n.mat-form-field {\\n width: 40%;\\n margin-right: 5%;\\n margin-left: 5%;\\n}\\n\\n::ng-deep .mat-h2 {\\n margin-bottom: 0px !important;\\n}\\n\\n/* Remove extra padding below the button. */\\n\\n::ng-deep .mat-mini-fab .mat-button-wrapper {\\n padding: 0px !important;\\n}\\n\\n::ng-deep .mat-h2 {\\n margin-bottom: 0px !important;\\n}\\n\\n::ng-deep td.available{\\n color: black;\\n}\\n\\n::ng-deep td.notInEncounter {\\n color: grey !important;\\n opacity: .5;\\n text-decoration: line-through;\\n}\\n\\n::ng-deep td.inEncounter {\\n color: #4527A0 !important; /* Deep Purple 800 */\\n background-color: #e5f3ec;\\n}\\n\\n::ng-deep td.active.available.inEncounter {\\n color: white !important;\\n}\\n\\ninput {\\n font-family: 'Work Sans', sans-serif;\\n}\\n\\n/* Change colors of ngx-datepicker to match custom material theme */\\n\\n::ng-deep .ranges button.active {\\n background-color: #4527A0 !important; /* Deep Purple 800 */\\n}\\n\\n::ng-deep .md-drppicker .btn {\\n background-color: #4527A0 !important; /* Deep Purple 800 */\\n}\\n\\n::ng-deep td.active.available {\\n background-color: #4527A0 !important; /* Deep Purple 800 */\\n}\\n\\n.errorIcon {\\n width: 40px;\\n height: 40px;\\n line-height: 40px;\\n cursor: default;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvdGltZS1uYXZpZ2F0aW9uL3RpbWVsaW5lLWNvbnRyb2xsZXIvdGltZWxpbmUtY29udHJvbGxlci5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsdUJBQXVCO0VBQ3ZCLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLFVBQVU7RUFDVixnQkFBZ0I7RUFDaEIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDZCQUE2QjtBQUMvQjs7QUFFQSwyQ0FBMkM7O0FBQzNDO0VBQ0UsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSx5QkFBeUIsRUFBRSxvQkFBb0I7RUFDL0MseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0Usb0NBQW9DO0FBQ3RDOztBQUVBLG1FQUFtRTs7QUFDbkU7RUFDRSxvQ0FBb0MsRUFBRSxvQkFBb0I7QUFDNUQ7O0FBRUE7RUFDRSxvQ0FBb0MsRUFBRSxvQkFBb0I7QUFDNUQ7O0FBRUE7RUFDRSxvQ0FBb0MsRUFBRSxvQkFBb0I7QUFDNUQ7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixlQUFlO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvdGltZS1uYXZpZ2F0aW9uL3RpbWVsaW5lLWNvbnRyb2xsZXIvdGltZWxpbmUtY29udHJvbGxlci5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmRhdGVQaWNrZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XG5cbi5tYXQtZm9ybS1maWVsZCB7XG4gIHdpZHRoOiA0MCU7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIG1hcmdpbi1sZWZ0OiA1JTtcbn1cblxuOjpuZy1kZWVwIC5tYXQtaDIge1xuICBtYXJnaW4tYm90dG9tOiAwcHggIWltcG9ydGFudDtcbn1cblxuLyogUmVtb3ZlIGV4dHJhIHBhZGRpbmcgYmVsb3cgdGhlIGJ1dHRvbi4gKi9cbjo6bmctZGVlcCAubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXIge1xuICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtaDIge1xuICBtYXJnaW4tYm90dG9tOiAwcHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIHRkLmF2YWlsYWJsZXtcbiAgY29sb3I6IGJsYWNrO1xufVxuXG46Om5nLWRlZXAgdGQubm90SW5FbmNvdW50ZXIge1xuICBjb2xvcjogZ3JleSAhaW1wb3J0YW50O1xuICBvcGFjaXR5OiAuNTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbjo6bmctZGVlcCB0ZC5pbkVuY291bnRlciB7XG4gIGNvbG9yOiAjNDUyN0EwICFpbXBvcnRhbnQ7IC8qIERlZXAgUHVycGxlIDgwMCAqL1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVmM2VjO1xufVxuXG46Om5nLWRlZXAgdGQuYWN0aXZlLmF2YWlsYWJsZS5pbkVuY291bnRlciB7XG4gIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xufVxuXG5pbnB1dCB7XG4gIGZvbnQtZmFtaWx5OiAnV29yayBTYW5zJywgc2Fucy1zZXJpZjtcbn1cblxuLyogQ2hhbmdlIGNvbG9ycyBvZiBuZ3gtZGF0ZXBpY2tlciB0byBtYXRjaCBjdXN0b20gbWF0ZXJpYWwgdGhlbWUgKi9cbjo6bmctZGVlcCAucmFuZ2VzIGJ1dHRvbi5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDUyN0EwICFpbXBvcnRhbnQ7IC8qIERlZXAgUHVycGxlIDgwMCAqL1xufVxuXG46Om5nLWRlZXAgLm1kLWRycHBpY2tlciAuYnRuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQ1MjdBMCAhaW1wb3J0YW50OyAvKiBEZWVwIFB1cnBsZSA4MDAgKi9cbn1cblxuOjpuZy1kZWVwIHRkLmFjdGl2ZS5hdmFpbGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDUyN0EwICFpbXBvcnRhbnQ7IC8qIERlZXAgUHVycGxlIDgwMCAqL1xufVxuXG4uZXJyb3JJY29uIHtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbiJdfQ== */\"","module.exports = \"
\\n \\n \\n warning\\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, Input, OnInit, Output, Renderer2, ViewChild} from '@angular/core';\nimport {DateTime, Duration, Interval} from 'luxon';\nimport * as moment from 'moment';\nimport {DaterangepickerDirective} from 'ngx-daterangepicker-material';\nimport {APP_TIMESPAN, recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {ResultError} from '../../result-error';\nimport {getDaysForIntervalSet} from '../../utils/date_utils';\n\n/**\n * Date range picker for selecting the time span to show in all the charts.\n *\n * There is a lot of messy date conversion in this class. The problem is that\n * we use luxon DateTime for our date handling across this application, but the\n * date range picker only works with Moment.js datetimes. The only format both\n * classes have converters for is JSDate, so we pass dates through that\n * several places.\n */\n@Component({\n selector: 'app-timeline-controller',\n templateUrl: './timeline-controller.component.html',\n styleUrls: ['./timeline-controller.component.css']\n})\nexport class TimelineControllerComponent implements OnInit {\n @Output() changeDateRange = new EventEmitter();\n @ViewChild(DaterangepickerDirective)\n pickerDirective: DaterangepickerDirective;\n\n /**\n * Holds the encounters for this patient.\n */\n @Input() encounters: Encounter[];\n\n /**\n * Holds the error if there was an error getting the encounters.\n */\n @Input() encountersError: ResultError;\n\n /**\n * Holds the date range to default to on initial setup. If unset, we'll\n * default to the last seven days.\n */\n @Input() selectedDateRange: Interval;\n\n /**\n * Holds all the ISO strings for days covered by all the patient encounters\n * above. Used to gray out datepicker options that are not part of\n * a patient's encounter.\n */\n private daysCoveredByAnEncounter = new Set();\n\n /** Bounds the dates that may be selected. */\n earliestAvailableDate = moment.utc(APP_TIMESPAN.start.toJSDate());\n readonly latestAvailableDate = moment.utc(APP_TIMESPAN.end.toJSDate());\n\n /** Selected timespan is past seven days by default. */\n readonly defaultDateRange = {\n startDate: moment(DateTime.local()\n .minus(Duration.fromObject({days: 7}))\n .startOf('day')\n .toJSDate()),\n endDate: moment(DateTime.local().startOf('day').toJSDate())\n };\n\n /**\n * The date range picker binds to this variable.\n */\n selected: {startDate: moment.Moment, endDate: moment.Moment};\n\n /** The list of encounters to display as available ranges to select. */\n readonly datePickerRanges = {};\n\n /**\n * Whether there was an encounter input into this component.\n */\n hasEncounterError = false;\n\n constructor(\n private renderer: Renderer2,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n ngOnInit() {\n // Set the initial date range selection and fire off a change event.\n const selectedRange = {\n startDate: moment(this.selectedDateRange.start.startOf('day').toJSDate()),\n endDate: moment(this.selectedDateRange.end.startOf('day').toJSDate())\n };\n this.selected = selectedRange;\n this.datesUpdated(selectedRange);\n\n // Set up the encounters in the date picker.\n if (this.encounters && this.encounters.length > 0 &&\n !this.encountersError) {\n this.hasEncounterError = false;\n\n this.encounters = this.encounters.sort(\n (a, b) => a.period.start.toMillis() - b.period.start.toMillis());\n\n // Set the minimum date to select to be the beginning of the\n // earliest encounter that had days that fell inside the app\n // timespan, in UTC.\n this.earliestAvailableDate = moment(\n this.encounters[0].period.start.startOf('day').toUTC().toJSDate());\n\n // We have to store everything as an ISO string because if we\n // store as objects the set membership check doesn't work.\n this.daysCoveredByAnEncounter = new Set(\n getDaysForIntervalSet(this.encounters.map(x => x.period))\n .map(x => x.toISO().slice(0, 10)));\n\n // We manually update the ranges stored in the daterangepicker\n // so that the list of encounters is displayed.\n // We store these in local time to prevent errors with\n // displaying a date different than the dates of the encounter.\n // While being communicated with charts, the interval will be\n // converted to UTC.\n for (const encounter of this.encounters) {\n const start = moment(encounter.period.start.startOf('day').toJSDate());\n const end = moment(encounter.period.end.endOf('day').toJSDate());\n const label =\n start.format('MM/DD/YYYY') + '-' + end.format('MM/DD/YYYY');\n this.datePickerRanges[label] = [start, end];\n }\n this.datePickerRanges[this.uiConstants.LAST_ONE_DAY] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({days: 1}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n this.datePickerRanges[this.uiConstants.LAST_THREE_DAYS] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({days: 3}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n this.datePickerRanges[this.uiConstants.LAST_SEVEN_DAYS] =\n [this.defaultDateRange.startDate, this.defaultDateRange.endDate];\n this.datePickerRanges[this.uiConstants.LAST_MONTH] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({months: 1}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n this.datePickerRanges[this.uiConstants.LAST_THREE_MONTHS] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({months: 3}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n } else {\n this.hasEncounterError = true;\n }\n }\n\n /**\n * Used to add a style to dates in the date picker so that the user can\n * differentiate between dates inside and outside of encounters.\n */\n addCustomClass =\n (m: moment.Moment) => {\n // The slice gets jus tthe date portion of the ISO string.\n return this.daysCoveredByAnEncounter.has(m.toISOString().slice(0, 10)) ?\n 'inEncounter' :\n 'notInEncounter';\n }\n\n /**\n * Emits the date range picked in the date picker as an event.\n * @param range The date range selected in the picker.\n */\n datesUpdated(rangeIn: {startDate: moment.Moment, endDate: moment.Moment}) {\n if (!rangeIn.startDate || !rangeIn.endDate || !this.selected) {\n return;\n }\n if (rangeIn.startDate.isBefore(rangeIn.endDate)) {\n this.selected = rangeIn;\n // Convert to UTC time.\n const interval = Interval.fromDateTimes(\n DateTime.fromJSDate(rangeIn.startDate.toDate())\n .startOf('day')\n .toUTC(),\n DateTime.fromJSDate(rangeIn.endDate.toDate()).endOf('day').toUTC());\n this.changeDateRange.emit(interval);\n\n recordGoogleAnalyticsEvent(\n 'dateRangeChanged', 'timeline',\n interval.start.toLocaleString() + ' - ' +\n interval.end.toLocaleString());\n }\n }\n}\n","module.exports = \"
\\n \\n
{{uiConstants.SYNTH_DATA}}
\\n
{{uiConstants.LOINC_VERIFIED_STRING}}
\\n \\n \\n \\n \\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, Output} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {SetupDataService} from 'src/app/setup/setup-data.service';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {environment} from '../../../environments/environment';\nimport {DisplayGrouping} from '../../conceptmappings/resource-codes/display-grouping';\nimport {HelpDialogComponent} from '../../dialogs/help-dialog/help-dialog.component';\nimport {IfuDialogComponent} from '../../dialogs/ifu-dialog/ifu-dialog.component';\nimport {AxisGroup} from '../../graphs/graphtypes/axis-group';\n\n@Component({\n selector: 'app-timeline-toolbar',\n templateUrl: './timeline-toolbar.component.html',\n styleUrls: ['../../cardcontainer/cardcontainer.component.css']\n})\nexport class TimelineToolbarComponent {\n displayGroupings: Array<[DisplayGrouping, AxisGroup[]]>;\n readonly showMockDataMessage = environment.useMockServer;\n\n @Output() saveSnapshot = new EventEmitter();\n @Output() addTextbox = new EventEmitter();\n\n constructor(\n setupDataService: SetupDataService, private helpDialog: MatDialog,\n private ifuDialog: MatDialog,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n setupDataService.displayGroupMapping.then((displayGroups) => {\n this.displayGroupings = Array.from(displayGroups.entries());\n });\n }\n\n // Emits an event indicating to CardContainer to save a snapshot of the page.\n snapshot() {\n this.saveSnapshot.emit();\n }\n\n // Emits an event indicating to CardContainer to add a blank textbox at the\n // top of the page.\n textbox() {\n this.addTextbox.emit();\n }\n\n openHelpDialog() {\n const dialogRef = this.helpDialog.open(HelpDialogComponent);\n recordGoogleAnalyticsEvent(\n 'viewTutorial', 'tutorial', new Date().toDateString());\n }\n\n openIFU() {\n const dialogRef = this.ifuDialog.open(IfuDialogComponent);\n recordGoogleAnalyticsEvent(\n 'viewTutorial', 'tutorial', new Date().toDateString());\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Duration, Interval} from 'luxon';\n/**\n * For the given date range, returns a DateTime for each day in the time\n * range (converting to local time first) as a list in chronological\n * order. All data points in dateRange will be enclosed by the days listed in\n * the returned array. If specified, additional DateTimes will be included at\n * the 12-hour mark of each day in the interval.\n * @param dateRange The date range to get tick marks for.\n * @param twelveHour Whether or not to include DateTimes at the 12-hour mark of\n * each day.\n *\n * @returns A list of the days in chronological order within the time range.\n */\nexport function getTickMarksForXAxis(\n dateRange: Interval, twelveHour: boolean): DateTime[] {\n const days: DateTime[] = [];\n // The dateRange could be stored in UTC, so convert it back to local\n // time.\n const intervalLocal = Interval.fromDateTimes(\n dateRange.start.toLocal(), dateRange.end.toLocal());\n const startDate: DateTime = intervalLocal.start.startOf('day');\n const dayCount =\n Duration.fromMillis(intervalLocal.end.toMillis() - startDate.toMillis())\n .as('days');\n\n for (let i = 0; i <= dayCount; i++) {\n days.push(startDate.plus({days: i}));\n if (twelveHour) {\n days.push(startDate.plus({days: i, hours: 12}));\n }\n }\n\n return days;\n}\n\n/**\n * Returns a DateTime for each day contained in any of the intervals in the\n * passed-in interval set. If the interval set contains day-boundaries, it will\n * add an extra day to be sure to encompass the full day, like\n * getTickMarksForXAxis. The days returned will be in an array in time order.\n *\n * @param intervals The intervals to list all the days for.\n */\nexport function getDaysForIntervalSet(intervals: Interval[]): DateTime[] {\n const days: DateTime[] = [];\n const allIntervals = Interval.merge(intervals);\n for (const interval of allIntervals) {\n getTickMarksForXAxis(interval, false).forEach(x => days.push(x.toUTC()));\n }\n return days.sort();\n}\n","/**\n * Formats a number as a string to the correct precision.\n *\n * Formats the number into a more \"human-readable\" format.\n * For example, the number 10000 would get formatted to 10,000.\n *\n * @param number the number to format\n * @param precision the precision to format the number to. Passing 0 means\n * no decimal. Passing 1 means 1 digit after the decimal point.\n */\nexport function formatNumberWithPrecision(number: number, precision?: number) {\n // The function Number.toLocalString formats into a more \"human-readable\"\n // format. In IE10 and below, toLocalString always rounds to 2 decimal places.\n // https://stackoverflow.com/questions/21536984/javascript-format-whole-numbers-using-tolocalestring\n // In order to ensure the correct precision in all browsers, We need to adjust\n // the decimal portion of the string after formatting it with the correct\n // precision.\n\n // get the number rounded to the correct precision.\n const numberAtPrecision =\n precision !== undefined ? number.toFixed(precision) : number.toString();\n\n // numberParts will always contain the integer part of the number as the first\n // element in the list.\n const numberParts = numberAtPrecision.split('.');\n const integer = numberParts[0];\n\n const formattedInteger =\n Number(integer).toLocaleString('en-us').split('.')[0];\n\n // if the precision is 0 or there was no decimal value, then just return the\n // formatted integer. Otherwise, add the decimal part back to the formatted\n // integer.\n return (precision === 0 || numberParts.length === 1) ?\n formattedInteger :\n `${formattedInteger}.${numberParts[1]}`;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * This function replaces abbrevations and symbols in a unit string to comply\n * with EHRA guidelines.\n * @param unit The unit string to fix abbreviations of.\n */\nexport function fixUnitAbbreviations(unit: string): string {\n if (unit) {\n return unit.replace('uL', 'microL')\n .replace('µ', 'micro')\n .replace('DegC', 'Deg C');\n }\n return undefined;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {InjectionToken} from '@angular/core';\nimport {DateTime, Duration, Interval} from 'luxon';\n\nimport {environment} from './environments/environment';\n\nexport function recordGoogleAnalyticsEvent(\n eventName: string, eventCategory: string, eventLabel: string) {\n if ((window).gtag) {\n (window).gtag('event', eventName, {\n 'event_category': eventCategory,\n 'event_label': eventLabel\n });\n }\n}\n\n/** The period of time this app will search for patient encounters in. */\nexport const APP_TIMESPAN = environment.production ?\n Interval.fromDateTimes(\n DateTime.utc().minus(Duration.fromObject({months: 6})),\n DateTime.utc()) :\n Interval.fromDateTimes(\n DateTime.utc().minus(Duration.fromObject({months: 60})),\n DateTime.utc());\n\n/**\n * Do not consider any encounters with a start date earlier than a year from\n * now.\n */\nexport const EARLIEST_ENCOUNTER_START_DATE = DateTime.utc().minus({years: 1});\n\n/** Constants used for FHIR resource types. */\nexport enum FhirResourceType {\n Encounter = 'Encounter',\n Observation = 'Observation',\n MedicationAdministration = 'MedicationAdministration',\n MedicationOrder = 'MedicationOrder',\n DocumentReference = 'DocumentReference',\n Patient = 'Patient',\n Specimen = 'Specimen',\n Medication = 'Medication',\n DiagnosticReport = 'DiagnosticReport'\n}\n\n/**\n * Injection token for passing UI constants across the app.\n */\nexport let UI_CONSTANTS_TOKEN = new InjectionToken('UiConstantsToken');\n\n/**\n * UI constants text.\n */\nexport const UI_CONSTANTS = {\n SYNTH_DATA: 'This is synthesized data used only for demo purposes.',\n LOINC_VERIFIED_STRING:\n 'These BCH data mappings were verified 2019-04-30. v.2.2.1.0',\n // Tooltip for adding a card inline\n ADD_TIMELINE_HERE: 'Add timeline here',\n // Dialog for adding an event to the custom timeline\n ADD_TITLE_CUSTOM_EVENT: 'Add title',\n ADD_DESCRIPTION_CUSTOM_EVENT: 'Add description',\n ADD_CARD_HERE: 'Add card here',\n DATE_CUSTOM_EVENT: 'Date',\n TIME_CUSTOM_EVENT: 'Time',\n CANCEL: 'Cancel',\n SAVE: 'Save',\n CONTINUE: 'Continue',\n // Custom timeline constants\n ADD_CUSTOM_TIMELINE: 'Add Custom Timeline',\n CUSTOM_TIMELINE_LABEL: 'Custom Timeline',\n CUSTOM_TIMELINE_INSTRUCTIONS:\n 'Click on this graph to add a flag for anything you want to keep track of.',\n // Annotation constants\n ADD_ANNOTATION: 'Add Textbox',\n ANNOTATION_INSTRUCTIONS: 'Add your text here.',\n SAVE_TEXT_HINT: 'Click the save button to save your text.',\n EDIT_TEXT_HINT: 'Click the edit button to edit this text.',\n // Constants\n NO_DATA_AVAILABLE_TMPL: 'No data between ',\n // Used in menu to add timelines\n ADD_CHART: 'Add Data Timeline',\n SEARCH_FOR_A_CONCEPT: 'Search for a concept',\n // Confirmation dialog for removing a card\n REMOVE_CARD: 'Do you want to remove this card?',\n REMOVE_CARD_NO: 'No',\n REMOVE_CARD_YES: 'Yes, remove this card',\n // Error handling\n BAD_DATA_ERROR: 'Invalid data received. Please check the PowerChart.',\n BAD_ENCOUNTER_ERROR:\n 'Unable to retrieve hospital visit dates for this patient.' +\n ' You can select any time period in the past six months.',\n // Setup screen\n INITIAL_CONFIGURATION_HEADER: 'MedTimeLine',\n LAST_ONE_DAY: 'Since midnight yesterday',\n LAST_THREE_DAYS: 'Last three days',\n LAST_SEVEN_DAYS: 'Last seven days',\n LAST_MONTH: 'Last month',\n LAST_THREE_MONTHS: 'Last three months',\n NO_RESULTS: 'No results found',\n SELECT_ALL: 'Select all',\n CLEAR_SELECTION: 'Clear selection',\n NO_DATA_PAST_SIX_MOS: '(No data found for past six months)',\n CHECKING_DATA_AVAILABILITY: '(Checking data availability...)',\n WHICH_ENCOUNTER_FIRST: 'Which time period would you like to see first?',\n WHICH_CONCEPTS_FIRST: 'Which data timelines would you like to see first?',\n ENCOUNTER: '(patient encounter)',\n // Top banner constants\n CHANGE_DATE_RANGE: 'Change date range',\n MOCK_DATA_BANNER: 'This is synthesized data used for demo purposes only.',\n LAUNCH_TUTORIAL: 'Launch Tutorial',\n IFU: 'Open Instructions for Use',\n SAVE_TO_NOTE: 'Save a screenshot to a PowerChart clinical note',\n // Interacting with cards\n REMOVE_THIS_CARD: 'Remove this card',\n CARD_REMOVED: 'Card removed.',\n UNDO: 'Undo',\n DRAG_THIS_CARD: 'Drag and drop to move this card somewhere else',\n EDIT_THIS_CARD: 'Edit this card',\n SAVE_YOUR_WORK: 'Save your work on this card',\n // Saving to PowerChart\n SAVED_TO_POWERCHART: 'Screenshot saved to PowerChart.',\n ERROR_SAVED_TO_POWERCHART: 'Error saving to PowerChart.',\n DISMISS: 'Dismiss',\n // Tooltip headings\n SUMMARY: 'Summary',\n RESULT: 'Result set',\n CATEGORY: 'Category',\n STATUS: 'Status',\n SPECIMEN: 'Specimen',\n REPORT_ATTACHMENT: 'Report Attachment',\n TIME_SINCE_PREVIOUS_DOSE: 'Time since previous dose in this timeframe',\n TIME_BEFORE_NEXT_DOSE: 'Time before next dose in this timeframe',\n FIRST_DOSE: 'First dose within this timeframe',\n LAST_DOSE: 'Last dose within this timeframe',\n THIS_DOSE: 'This dose',\n PREVIOUS_DOSE: 'Previous dose within this timeframe (for this order)',\n NO_PREVIOUS_DOSE: 'No previous dose within this timeframe (for this order).',\n DOSAGE_INSTRUCTIONS: 'Dosage Instructions'\n};\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nimport {environment_file_locations} from './environment_file_locations';\n\nexport const environment = {\n production: false,\n useMockServer: true,\n mockDataFolder: 'demo_data/test_bmedtimeB',\n mockDataFiles: [\n 'BMedTimeB_DiagReport',\n 'BMedTimeB_Encounter',\n 'BMedTimeB_Obs_labs',\n 'BMedTimeB_Obs_vitals',\n 'BMedtimeB_MB_data',\n 'BMedTimeB_Med_Admins',\n 'BMedTimeB_Med_Orders',\n ],\n ...environment_file_locations,\n useDebugger: false,\n};\n\n/*\n * In development mode, to ignore zone related error stack frames such as\n * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can\n * import the following file, but please comment it out in production mode\n * because it will have performance impact when throw error\n */\nimport 'zone.js/dist/zone-error'; // Included with Angular CLI.\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This file can be replaced during build by using the `fileReplacements`\n// array.// `ng build ---prod` replaces `environment.ts` with\n// `environment.prod.ts`. The list of file replacements can be found in\n// `angular.json`.\n\n// This file is used in the e2e tests.\n\nexport const environment_file_locations = {\n conceptsFolder: 'clinical_concept_configuration',\n vitalGroupFile: 'vital_sign_groups.json',\n vitalConceptsFile: 'vital_signs.json',\n labConceptsFile: 'lab_results.json',\n labGroupFile: 'lab_groups.json',\n radiologyConceptsFile: 'radiology_results.json',\n radiologyGroupFile: 'radiology_groups.json',\n antibioticConceptsFile: 'medications_antibiotics.json',\n antibioticGroupFile: 'medication_groups_antibiotics.json',\n antiviralConceptsFile: 'medications_antivirals.json',\n antiviralGroupFile: 'medication_groups_antivirals.json',\n antifungalConceptsFile: 'medications_antifungals.json',\n antifungalGroupFile: 'medication_groups_antifungals.json',\n microbioGroupFile: 'microbio_groups.json',\n microbioConceptsFile: 'microbio_results.json'\n};\n\n/*\n * In development mode, to ignore zone related error stack frames such as\n * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can\n * import the following file, but please comment it out in production mode\n * because it will have performance impact when throw error\n */\nimport 'zone.js/dist/zone-error'; // Included with Angular CLI.\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {enableProdMode} from '@angular/core';\nimport {platformBrowserDynamic} from '@angular/platform-browser-dynamic';\n\nimport {AppModule} from './app/app.module';\nimport * as FhirConfig from './app/fhir_config';\nimport {environment} from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\n\nif (FhirConfig.googleAnalyticsTag) {\n // Global site tag (gtag.js) - Google Analytics\n document.write(\n ' ');\n document.write(\n '');\n} else {\n // If there is no Google Analytics Tag found, insert an empty script to\n // prevent errors with user interaction.\n document.write('');\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule).catch(\n err => console.log(err));\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/$_lazy_route_resource lazy namespace object","webpack:///./src/app/app-routing.module.ts","webpack:///./src/app/app.component.css","webpack:///./src/app/app.component.html","webpack:///./src/app/app.component.ts","webpack:///./src/app/app.module.ts","webpack:///./src/app/cardcontainer/cardcontainer.component.css","webpack:///./src/app/cardcontainer/cardcontainer.component.html","webpack:///./src/app/cardcontainer/cardcontainer.component.ts","webpack:///./src/app/cardtypes/card/card.component.css","webpack:///./src/app/cardtypes/card/card.component.html","webpack:///./src/app/cardtypes/card/card.component.ts","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component.css","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component.html","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component.ts","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline.component.css","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline.component.html","webpack:///./src/app/cardtypes/customizable-timeline/customizable-timeline.component.ts","webpack:///./src/app/cardtypes/legendstyles.css","webpack:///./src/app/cardtypes/multigraphcard/multigraphcard.component.css","webpack:///./src/app/cardtypes/multigraphcard/multigraphcard.component.ts","webpack:///./src/app/cardtypes/multigraphcard/multigraphcard.html","webpack:///./src/app/cardtypes/textboxcard/textboxcard.component.html","webpack:///./src/app/cardtypes/textboxcard/textboxcard.component.ts","webpack:///./src/app/conceptmappings/annotation-mapping.ts","webpack:///./src/app/conceptmappings/concept-file-configuration.ts","webpack:///./src/app/conceptmappings/resource-code-creator.ts","webpack:///./src/app/conceptmappings/resource-code-manager.ts","webpack:///./src/app/conceptmappings/resource-codes/bch-microbio-code.ts","webpack:///./src/app/conceptmappings/resource-codes/diagnostic-report-code.ts","webpack:///./src/app/conceptmappings/resource-codes/display-grouping.ts","webpack:///./src/app/conceptmappings/resource-codes/loinc-code.ts","webpack:///./src/app/conceptmappings/resource-codes/resource-code-group.ts","webpack:///./src/app/conceptmappings/resource-codes/rx-norm-group.ts","webpack:///./src/app/conceptmappings/resource-codes/rx-norm.ts","webpack:///./src/app/data-selector-menu/data-selector-element/data-selector-element.component.css","webpack:///./src/app/data-selector-menu/data-selector-element/data-selector-element.component.html","webpack:///./src/app/data-selector-menu/data-selector-element/data-selector-element.component.ts","webpack:///./src/app/data-selector-menu/data-selector-menu.component.css","webpack:///./src/app/data-selector-menu/data-selector-menu.component.html","webpack:///./src/app/data-selector-menu/data-selector-menu.component.ts","webpack:///./src/app/debugger/debugger.component.html","webpack:///./src/app/debugger/debugger.component.ts","webpack:///./src/app/debugger/debugger.service.ts","webpack:///./src/app/dialogs/confirm-save/confirm-save.component.css","webpack:///./src/app/dialogs/confirm-save/confirm-save.component.html","webpack:///./src/app/dialogs/confirm-save/confirm-save.component.ts","webpack:///./src/app/dialogs/delete-dialog/delete-dialog.component.html","webpack:///./src/app/dialogs/delete-dialog/delete-dialog.component.ts","webpack:///./src/app/dialogs/help-dialog/help-dialog.component.css","webpack:///./src/app/dialogs/help-dialog/help-dialog.component.html","webpack:///./src/app/dialogs/help-dialog/help-dialog.component.ts","webpack:///./src/app/dialogs/ifu-dialog/ifu-dialog.component.css","webpack:///./src/app/dialogs/ifu-dialog/ifu-dialog.component.html","webpack:///./src/app/dialogs/ifu-dialog/ifu-dialog.component.ts","webpack:///./src/app/fhir-resources/annotated/annotated-diagnostic-report.ts","webpack:///./src/app/fhir-resources/annotated/annotated-microbio-report.ts","webpack:///./src/app/fhir-resources/annotated/annotated-observation.ts","webpack:///./src/app/fhir-resources/attachment.ts","webpack:///./src/app/fhir-resources/diagnostic-report.ts","webpack:///./src/app/fhir-resources/dosage.ts","webpack:///./src/app/fhir-resources/encounter.ts","webpack:///./src/app/fhir-resources/medication-administration.ts","webpack:///./src/app/fhir-resources/medication-order.ts","webpack:///./src/app/fhir-resources/medication.ts","webpack:///./src/app/fhir-resources/microbio-report.ts","webpack:///./src/app/fhir-resources/narrative.ts","webpack:///./src/app/fhir-resources/observation-interpretation-valueset.ts","webpack:///./src/app/fhir-resources/observation.ts","webpack:///./src/app/fhir-resources/sets/fhir-resource-set.ts","webpack:///./src/app/fhir-resources/sets/observation-set.ts","webpack:///./src/app/fhir-resources/specimen.ts","webpack:///./src/app/fhir-server/fhir-cache.ts","webpack:///./src/app/fhir-server/fhir-http.service.ts","webpack:///./src/app/fhir-server/fhir-launch/fhir-launch.component.css","webpack:///./src/app/fhir-server/fhir-launch/fhir-launch.component.html","webpack:///./src/app/fhir-server/fhir-launch/fhir-launch.component.ts","webpack:///./src/app/fhir-server/fhir.service.ts","webpack:///./src/app/fhir-server/mock-fhir.service.ts","webpack:///./src/app/fhir-server/smart-on-fhir-client.ts","webpack:///./src/app/graphs/graphdatatypes/customizabledata.ts","webpack:///./src/app/graphs/graphdatatypes/diagnosticgraphdata.ts","webpack:///./src/app/graphs/graphdatatypes/graphdata.ts","webpack:///./src/app/graphs/graphdatatypes/labeled-series.ts","webpack:///./src/app/graphs/graphdatatypes/linegraphdata.ts","webpack:///./src/app/graphs/graphdatatypes/microbiographdata.ts","webpack:///./src/app/graphs/graphdatatypes/stepgraphdata.ts","webpack:///./src/app/graphs/graphtypes/axis-group.ts","webpack:///./src/app/graphs/graphtypes/axis.ts","webpack:///./src/app/graphs/graphtypes/customizable-graph/customizable-graph-annotation.ts","webpack:///./src/app/graphs/graphtypes/customizable-graph/customizable-graph.component.ts","webpack:///./src/app/graphs/graphtypes/diagnostic-graph/diagnostic-graph.component.ts","webpack:///./src/app/graphs/graphtypes/diagnostic-graph/diagnostic-graph.dialog.component.html","webpack:///./src/app/graphs/graphtypes/diagnostic-graph/diagnostic-graph.dialog.component.ts","webpack:///./src/app/graphs/graphtypes/graph.css","webpack:///./src/app/graphs/graphtypes/graph/graph.component.html","webpack:///./src/app/graphs/graphtypes/graph/graph.component.ts","webpack:///./src/app/graphs/graphtypes/legend-info.ts","webpack:///./src/app/graphs/graphtypes/linegraph/linegraph.component.ts","webpack:///./src/app/graphs/graphtypes/microbio-graph/microbio-graph.component.ts","webpack:///./src/app/graphs/graphtypes/scatterplot/scatterplot.component.ts","webpack:///./src/app/graphs/graphtypes/stepgraph/stepgraph.component.html","webpack:///./src/app/graphs/graphtypes/stepgraph/stepgraph.component.ts","webpack:///./src/app/graphs/graphtypes/tooltips/annotated-tooltip.ts","webpack:///./src/app/graphs/graphtypes/tooltips/diagnostic-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/medication-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/microbio-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/observation-tooltips.ts","webpack:///./src/app/graphs/graphtypes/tooltips/tooltip.ts","webpack:///./src/app/result-error.ts","webpack:///./src/app/setup/setup-data.service.ts","webpack:///./src/app/setup/setup.component.css","webpack:///./src/app/setup/setup.component.html","webpack:///./src/app/setup/setup.component.ts","webpack:///./src/app/theme/verily_colors.ts","webpack:///./src/app/time-navigation/timeline-controller/timeline-controller.component.css","webpack:///./src/app/time-navigation/timeline-controller/timeline-controller.component.html","webpack:///./src/app/time-navigation/timeline-controller/timeline-controller.component.ts","webpack:///./src/app/time-navigation/timeline-toolbar/timeline-toolbar.component.html","webpack:///./src/app/time-navigation/timeline-toolbar/timeline-toolbar.component.ts","webpack:///./src/app/utils/date_utils.ts","webpack:///./src/app/utils/number_utils.ts","webpack:///./src/app/utils/unit_utils.ts","webpack:///./src/constants.ts","webpack:///./src/environments/environment.ts","webpack:///./src/environments/environment_file_locations.ts","webpack:///./src/main.ts"],"names":[],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A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","file":"main.js","sourcesContent":["var map = {\n\t\"./af\": \"./node_modules/moment/locale/af.js\",\n\t\"./af.js\": \"./node_modules/moment/locale/af.js\",\n\t\"./ar\": \"./node_modules/moment/locale/ar.js\",\n\t\"./ar-dz\": \"./node_modules/moment/locale/ar-dz.js\",\n\t\"./ar-dz.js\": \"./node_modules/moment/locale/ar-dz.js\",\n\t\"./ar-kw\": \"./node_modules/moment/locale/ar-kw.js\",\n\t\"./ar-kw.js\": \"./node_modules/moment/locale/ar-kw.js\",\n\t\"./ar-ly\": \"./node_modules/moment/locale/ar-ly.js\",\n\t\"./ar-ly.js\": \"./node_modules/moment/locale/ar-ly.js\",\n\t\"./ar-ma\": \"./node_modules/moment/locale/ar-ma.js\",\n\t\"./ar-ma.js\": \"./node_modules/moment/locale/ar-ma.js\",\n\t\"./ar-sa\": \"./node_modules/moment/locale/ar-sa.js\",\n\t\"./ar-sa.js\": \"./node_modules/moment/locale/ar-sa.js\",\n\t\"./ar-tn\": \"./node_modules/moment/locale/ar-tn.js\",\n\t\"./ar-tn.js\": \"./node_modules/moment/locale/ar-tn.js\",\n\t\"./ar.js\": \"./node_modules/moment/locale/ar.js\",\n\t\"./az\": \"./node_modules/moment/locale/az.js\",\n\t\"./az.js\": \"./node_modules/moment/locale/az.js\",\n\t\"./be\": \"./node_modules/moment/locale/be.js\",\n\t\"./be.js\": \"./node_modules/moment/locale/be.js\",\n\t\"./bg\": \"./node_modules/moment/locale/bg.js\",\n\t\"./bg.js\": \"./node_modules/moment/locale/bg.js\",\n\t\"./bm\": \"./node_modules/moment/locale/bm.js\",\n\t\"./bm.js\": \"./node_modules/moment/locale/bm.js\",\n\t\"./bn\": \"./node_modules/moment/locale/bn.js\",\n\t\"./bn.js\": \"./node_modules/moment/locale/bn.js\",\n\t\"./bo\": \"./node_modules/moment/locale/bo.js\",\n\t\"./bo.js\": \"./node_modules/moment/locale/bo.js\",\n\t\"./br\": \"./node_modules/moment/locale/br.js\",\n\t\"./br.js\": \"./node_modules/moment/locale/br.js\",\n\t\"./bs\": \"./node_modules/moment/locale/bs.js\",\n\t\"./bs.js\": \"./node_modules/moment/locale/bs.js\",\n\t\"./ca\": \"./node_modules/moment/locale/ca.js\",\n\t\"./ca.js\": \"./node_modules/moment/locale/ca.js\",\n\t\"./cs\": \"./node_modules/moment/locale/cs.js\",\n\t\"./cs.js\": \"./node_modules/moment/locale/cs.js\",\n\t\"./cv\": \"./node_modules/moment/locale/cv.js\",\n\t\"./cv.js\": \"./node_modules/moment/locale/cv.js\",\n\t\"./cy\": \"./node_modules/moment/locale/cy.js\",\n\t\"./cy.js\": \"./node_modules/moment/locale/cy.js\",\n\t\"./da\": \"./node_modules/moment/locale/da.js\",\n\t\"./da.js\": \"./node_modules/moment/locale/da.js\",\n\t\"./de\": \"./node_modules/moment/locale/de.js\",\n\t\"./de-at\": \"./node_modules/moment/locale/de-at.js\",\n\t\"./de-at.js\": \"./node_modules/moment/locale/de-at.js\",\n\t\"./de-ch\": \"./node_modules/moment/locale/de-ch.js\",\n\t\"./de-ch.js\": \"./node_modules/moment/locale/de-ch.js\",\n\t\"./de.js\": \"./node_modules/moment/locale/de.js\",\n\t\"./dv\": \"./node_modules/moment/locale/dv.js\",\n\t\"./dv.js\": \"./node_modules/moment/locale/dv.js\",\n\t\"./el\": \"./node_modules/moment/locale/el.js\",\n\t\"./el.js\": \"./node_modules/moment/locale/el.js\",\n\t\"./en-au\": \"./node_modules/moment/locale/en-au.js\",\n\t\"./en-au.js\": \"./node_modules/moment/locale/en-au.js\",\n\t\"./en-ca\": \"./node_modules/moment/locale/en-ca.js\",\n\t\"./en-ca.js\": \"./node_modules/moment/locale/en-ca.js\",\n\t\"./en-gb\": \"./node_modules/moment/locale/en-gb.js\",\n\t\"./en-gb.js\": \"./node_modules/moment/locale/en-gb.js\",\n\t\"./en-ie\": \"./node_modules/moment/locale/en-ie.js\",\n\t\"./en-ie.js\": \"./node_modules/moment/locale/en-ie.js\",\n\t\"./en-il\": \"./node_modules/moment/locale/en-il.js\",\n\t\"./en-il.js\": \"./node_modules/moment/locale/en-il.js\",\n\t\"./en-nz\": \"./node_modules/moment/locale/en-nz.js\",\n\t\"./en-nz.js\": \"./node_modules/moment/locale/en-nz.js\",\n\t\"./eo\": \"./node_modules/moment/locale/eo.js\",\n\t\"./eo.js\": \"./node_modules/moment/locale/eo.js\",\n\t\"./es\": \"./node_modules/moment/locale/es.js\",\n\t\"./es-do\": \"./node_modules/moment/locale/es-do.js\",\n\t\"./es-do.js\": \"./node_modules/moment/locale/es-do.js\",\n\t\"./es-us\": \"./node_modules/moment/locale/es-us.js\",\n\t\"./es-us.js\": \"./node_modules/moment/locale/es-us.js\",\n\t\"./es.js\": \"./node_modules/moment/locale/es.js\",\n\t\"./et\": \"./node_modules/moment/locale/et.js\",\n\t\"./et.js\": \"./node_modules/moment/locale/et.js\",\n\t\"./eu\": \"./node_modules/moment/locale/eu.js\",\n\t\"./eu.js\": \"./node_modules/moment/locale/eu.js\",\n\t\"./fa\": \"./node_modules/moment/locale/fa.js\",\n\t\"./fa.js\": \"./node_modules/moment/locale/fa.js\",\n\t\"./fi\": \"./node_modules/moment/locale/fi.js\",\n\t\"./fi.js\": \"./node_modules/moment/locale/fi.js\",\n\t\"./fo\": \"./node_modules/moment/locale/fo.js\",\n\t\"./fo.js\": \"./node_modules/moment/locale/fo.js\",\n\t\"./fr\": \"./node_modules/moment/locale/fr.js\",\n\t\"./fr-ca\": \"./node_modules/moment/locale/fr-ca.js\",\n\t\"./fr-ca.js\": \"./node_modules/moment/locale/fr-ca.js\",\n\t\"./fr-ch\": \"./node_modules/moment/locale/fr-ch.js\",\n\t\"./fr-ch.js\": \"./node_modules/moment/locale/fr-ch.js\",\n\t\"./fr.js\": \"./node_modules/moment/locale/fr.js\",\n\t\"./fy\": \"./node_modules/moment/locale/fy.js\",\n\t\"./fy.js\": \"./node_modules/moment/locale/fy.js\",\n\t\"./gd\": \"./node_modules/moment/locale/gd.js\",\n\t\"./gd.js\": \"./node_modules/moment/locale/gd.js\",\n\t\"./gl\": \"./node_modules/moment/locale/gl.js\",\n\t\"./gl.js\": \"./node_modules/moment/locale/gl.js\",\n\t\"./gom-latn\": \"./node_modules/moment/locale/gom-latn.js\",\n\t\"./gom-latn.js\": \"./node_modules/moment/locale/gom-latn.js\",\n\t\"./gu\": \"./node_modules/moment/locale/gu.js\",\n\t\"./gu.js\": \"./node_modules/moment/locale/gu.js\",\n\t\"./he\": \"./node_modules/moment/locale/he.js\",\n\t\"./he.js\": \"./node_modules/moment/locale/he.js\",\n\t\"./hi\": \"./node_modules/moment/locale/hi.js\",\n\t\"./hi.js\": \"./node_modules/moment/locale/hi.js\",\n\t\"./hr\": \"./node_modules/moment/locale/hr.js\",\n\t\"./hr.js\": \"./node_modules/moment/locale/hr.js\",\n\t\"./hu\": \"./node_modules/moment/locale/hu.js\",\n\t\"./hu.js\": \"./node_modules/moment/locale/hu.js\",\n\t\"./hy-am\": \"./node_modules/moment/locale/hy-am.js\",\n\t\"./hy-am.js\": \"./node_modules/moment/locale/hy-am.js\",\n\t\"./id\": \"./node_modules/moment/locale/id.js\",\n\t\"./id.js\": \"./node_modules/moment/locale/id.js\",\n\t\"./is\": \"./node_modules/moment/locale/is.js\",\n\t\"./is.js\": \"./node_modules/moment/locale/is.js\",\n\t\"./it\": \"./node_modules/moment/locale/it.js\",\n\t\"./it.js\": \"./node_modules/moment/locale/it.js\",\n\t\"./ja\": \"./node_modules/moment/locale/ja.js\",\n\t\"./ja.js\": \"./node_modules/moment/locale/ja.js\",\n\t\"./jv\": \"./node_modules/moment/locale/jv.js\",\n\t\"./jv.js\": \"./node_modules/moment/locale/jv.js\",\n\t\"./ka\": \"./node_modules/moment/locale/ka.js\",\n\t\"./ka.js\": \"./node_modules/moment/locale/ka.js\",\n\t\"./kk\": \"./node_modules/moment/locale/kk.js\",\n\t\"./kk.js\": \"./node_modules/moment/locale/kk.js\",\n\t\"./km\": \"./node_modules/moment/locale/km.js\",\n\t\"./km.js\": \"./node_modules/moment/locale/km.js\",\n\t\"./kn\": \"./node_modules/moment/locale/kn.js\",\n\t\"./kn.js\": \"./node_modules/moment/locale/kn.js\",\n\t\"./ko\": \"./node_modules/moment/locale/ko.js\",\n\t\"./ko.js\": \"./node_modules/moment/locale/ko.js\",\n\t\"./ku\": \"./node_modules/moment/locale/ku.js\",\n\t\"./ku.js\": \"./node_modules/moment/locale/ku.js\",\n\t\"./ky\": \"./node_modules/moment/locale/ky.js\",\n\t\"./ky.js\": \"./node_modules/moment/locale/ky.js\",\n\t\"./lb\": \"./node_modules/moment/locale/lb.js\",\n\t\"./lb.js\": \"./node_modules/moment/locale/lb.js\",\n\t\"./lo\": \"./node_modules/moment/locale/lo.js\",\n\t\"./lo.js\": \"./node_modules/moment/locale/lo.js\",\n\t\"./lt\": \"./node_modules/moment/locale/lt.js\",\n\t\"./lt.js\": \"./node_modules/moment/locale/lt.js\",\n\t\"./lv\": \"./node_modules/moment/locale/lv.js\",\n\t\"./lv.js\": \"./node_modules/moment/locale/lv.js\",\n\t\"./me\": \"./node_modules/moment/locale/me.js\",\n\t\"./me.js\": \"./node_modules/moment/locale/me.js\",\n\t\"./mi\": \"./node_modules/moment/locale/mi.js\",\n\t\"./mi.js\": \"./node_modules/moment/locale/mi.js\",\n\t\"./mk\": \"./node_modules/moment/locale/mk.js\",\n\t\"./mk.js\": \"./node_modules/moment/locale/mk.js\",\n\t\"./ml\": \"./node_modules/moment/locale/ml.js\",\n\t\"./ml.js\": \"./node_modules/moment/locale/ml.js\",\n\t\"./mn\": \"./node_modules/moment/locale/mn.js\",\n\t\"./mn.js\": \"./node_modules/moment/locale/mn.js\",\n\t\"./mr\": \"./node_modules/moment/locale/mr.js\",\n\t\"./mr.js\": \"./node_modules/moment/locale/mr.js\",\n\t\"./ms\": \"./node_modules/moment/locale/ms.js\",\n\t\"./ms-my\": \"./node_modules/moment/locale/ms-my.js\",\n\t\"./ms-my.js\": \"./node_modules/moment/locale/ms-my.js\",\n\t\"./ms.js\": \"./node_modules/moment/locale/ms.js\",\n\t\"./mt\": \"./node_modules/moment/locale/mt.js\",\n\t\"./mt.js\": \"./node_modules/moment/locale/mt.js\",\n\t\"./my\": \"./node_modules/moment/locale/my.js\",\n\t\"./my.js\": \"./node_modules/moment/locale/my.js\",\n\t\"./nb\": \"./node_modules/moment/locale/nb.js\",\n\t\"./nb.js\": \"./node_modules/moment/locale/nb.js\",\n\t\"./ne\": \"./node_modules/moment/locale/ne.js\",\n\t\"./ne.js\": \"./node_modules/moment/locale/ne.js\",\n\t\"./nl\": \"./node_modules/moment/locale/nl.js\",\n\t\"./nl-be\": \"./node_modules/moment/locale/nl-be.js\",\n\t\"./nl-be.js\": \"./node_modules/moment/locale/nl-be.js\",\n\t\"./nl.js\": \"./node_modules/moment/locale/nl.js\",\n\t\"./nn\": \"./node_modules/moment/locale/nn.js\",\n\t\"./nn.js\": \"./node_modules/moment/locale/nn.js\",\n\t\"./pa-in\": \"./node_modules/moment/locale/pa-in.js\",\n\t\"./pa-in.js\": \"./node_modules/moment/locale/pa-in.js\",\n\t\"./pl\": \"./node_modules/moment/locale/pl.js\",\n\t\"./pl.js\": \"./node_modules/moment/locale/pl.js\",\n\t\"./pt\": \"./node_modules/moment/locale/pt.js\",\n\t\"./pt-br\": \"./node_modules/moment/locale/pt-br.js\",\n\t\"./pt-br.js\": \"./node_modules/moment/locale/pt-br.js\",\n\t\"./pt.js\": \"./node_modules/moment/locale/pt.js\",\n\t\"./ro\": \"./node_modules/moment/locale/ro.js\",\n\t\"./ro.js\": \"./node_modules/moment/locale/ro.js\",\n\t\"./ru\": \"./node_modules/moment/locale/ru.js\",\n\t\"./ru.js\": \"./node_modules/moment/locale/ru.js\",\n\t\"./sd\": \"./node_modules/moment/locale/sd.js\",\n\t\"./sd.js\": \"./node_modules/moment/locale/sd.js\",\n\t\"./se\": \"./node_modules/moment/locale/se.js\",\n\t\"./se.js\": \"./node_modules/moment/locale/se.js\",\n\t\"./si\": \"./node_modules/moment/locale/si.js\",\n\t\"./si.js\": \"./node_modules/moment/locale/si.js\",\n\t\"./sk\": \"./node_modules/moment/locale/sk.js\",\n\t\"./sk.js\": \"./node_modules/moment/locale/sk.js\",\n\t\"./sl\": \"./node_modules/moment/locale/sl.js\",\n\t\"./sl.js\": \"./node_modules/moment/locale/sl.js\",\n\t\"./sq\": \"./node_modules/moment/locale/sq.js\",\n\t\"./sq.js\": \"./node_modules/moment/locale/sq.js\",\n\t\"./sr\": \"./node_modules/moment/locale/sr.js\",\n\t\"./sr-cyrl\": \"./node_modules/moment/locale/sr-cyrl.js\",\n\t\"./sr-cyrl.js\": \"./node_modules/moment/locale/sr-cyrl.js\",\n\t\"./sr.js\": \"./node_modules/moment/locale/sr.js\",\n\t\"./ss\": \"./node_modules/moment/locale/ss.js\",\n\t\"./ss.js\": \"./node_modules/moment/locale/ss.js\",\n\t\"./sv\": \"./node_modules/moment/locale/sv.js\",\n\t\"./sv.js\": \"./node_modules/moment/locale/sv.js\",\n\t\"./sw\": \"./node_modules/moment/locale/sw.js\",\n\t\"./sw.js\": \"./node_modules/moment/locale/sw.js\",\n\t\"./ta\": \"./node_modules/moment/locale/ta.js\",\n\t\"./ta.js\": \"./node_modules/moment/locale/ta.js\",\n\t\"./te\": \"./node_modules/moment/locale/te.js\",\n\t\"./te.js\": \"./node_modules/moment/locale/te.js\",\n\t\"./tet\": \"./node_modules/moment/locale/tet.js\",\n\t\"./tet.js\": \"./node_modules/moment/locale/tet.js\",\n\t\"./tg\": \"./node_modules/moment/locale/tg.js\",\n\t\"./tg.js\": \"./node_modules/moment/locale/tg.js\",\n\t\"./th\": \"./node_modules/moment/locale/th.js\",\n\t\"./th.js\": \"./node_modules/moment/locale/th.js\",\n\t\"./tl-ph\": \"./node_modules/moment/locale/tl-ph.js\",\n\t\"./tl-ph.js\": \"./node_modules/moment/locale/tl-ph.js\",\n\t\"./tlh\": \"./node_modules/moment/locale/tlh.js\",\n\t\"./tlh.js\": \"./node_modules/moment/locale/tlh.js\",\n\t\"./tr\": \"./node_modules/moment/locale/tr.js\",\n\t\"./tr.js\": \"./node_modules/moment/locale/tr.js\",\n\t\"./tzl\": \"./node_modules/moment/locale/tzl.js\",\n\t\"./tzl.js\": \"./node_modules/moment/locale/tzl.js\",\n\t\"./tzm\": \"./node_modules/moment/locale/tzm.js\",\n\t\"./tzm-latn\": \"./node_modules/moment/locale/tzm-latn.js\",\n\t\"./tzm-latn.js\": \"./node_modules/moment/locale/tzm-latn.js\",\n\t\"./tzm.js\": \"./node_modules/moment/locale/tzm.js\",\n\t\"./ug-cn\": \"./node_modules/moment/locale/ug-cn.js\",\n\t\"./ug-cn.js\": \"./node_modules/moment/locale/ug-cn.js\",\n\t\"./uk\": \"./node_modules/moment/locale/uk.js\",\n\t\"./uk.js\": \"./node_modules/moment/locale/uk.js\",\n\t\"./ur\": \"./node_modules/moment/locale/ur.js\",\n\t\"./ur.js\": \"./node_modules/moment/locale/ur.js\",\n\t\"./uz\": \"./node_modules/moment/locale/uz.js\",\n\t\"./uz-latn\": \"./node_modules/moment/locale/uz-latn.js\",\n\t\"./uz-latn.js\": \"./node_modules/moment/locale/uz-latn.js\",\n\t\"./uz.js\": \"./node_modules/moment/locale/uz.js\",\n\t\"./vi\": \"./node_modules/moment/locale/vi.js\",\n\t\"./vi.js\": \"./node_modules/moment/locale/vi.js\",\n\t\"./x-pseudo\": \"./node_modules/moment/locale/x-pseudo.js\",\n\t\"./x-pseudo.js\": \"./node_modules/moment/locale/x-pseudo.js\",\n\t\"./yo\": \"./node_modules/moment/locale/yo.js\",\n\t\"./yo.js\": \"./node_modules/moment/locale/yo.js\",\n\t\"./zh-cn\": \"./node_modules/moment/locale/zh-cn.js\",\n\t\"./zh-cn.js\": \"./node_modules/moment/locale/zh-cn.js\",\n\t\"./zh-hk\": \"./node_modules/moment/locale/zh-hk.js\",\n\t\"./zh-hk.js\": \"./node_modules/moment/locale/zh-hk.js\",\n\t\"./zh-tw\": \"./node_modules/moment/locale/zh-tw.js\",\n\t\"./zh-tw.js\": \"./node_modules/moment/locale/zh-tw.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) { // check for number or string\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn id;\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./node_modules/moment/locale sync recursive ^\\\\.\\\\/.*$\";","function webpackEmptyAsyncContext(req) {\n\t// Here Promise.resolve().then() is used instead of new Promise() to prevent\n\t// uncaught exception popping up in devtools\n\treturn Promise.resolve().then(function() {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t});\n}\nwebpackEmptyAsyncContext.keys = function() { return []; };\nwebpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;\nmodule.exports = webpackEmptyAsyncContext;\nwebpackEmptyAsyncContext.id = \"./src/$$_lazy_route_resource lazy recursive\";","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {NgModule} from '@angular/core';\nimport {RouterModule, Routes} from '@angular/router';\n\nimport {CardcontainerComponent} from './cardcontainer/cardcontainer.component';\nimport {FhirLaunchComponent} from './fhir-server/fhir-launch/fhir-launch.component';\nimport {SetupComponent} from './setup/setup.component';\n\n/* On their end, it's locked down so that the only acceptable redirect\nURL is localhost:8000/. So, we have to do a different path for\nauthentication. */\nconst routes: Routes = [\n {path: 'main', component: CardcontainerComponent},\n {path: 'setup', component: SetupComponent},\n {path: '', component: FhirLaunchComponent}, {path: '**', redirectTo: ''}\n];\n\n\n@NgModule({exports: [RouterModule], imports: [RouterModule.forRoot(routes)]})\nexport class AppRoutingModule {\n}\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2FwcC5jb21wb25lbnQuY3NzIn0= */\"","module.exports = \"\\n\\nMedTimeLine\\n\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component} from '@angular/core';\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.css']\n})\nexport class AppComponent {\n title = 'app';\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport 'fhirclient';\n\nimport {HttpClientModule} from '@angular/common/http';\nimport {NgModule} from '@angular/core';\nimport {FlexLayoutModule} from '@angular/flex-layout';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\n// tslint:disable-next-line:max-line-length\nimport {MatAutocompleteModule, MatButtonModule, MatButtonToggleModule, MatCheckboxModule, MatDatepickerModule, MatDialogModule, MatDividerModule, MatExpansionModule, MatGridListModule, MatListModule, MatMenuModule, MatNativeDateModule, MatProgressSpinnerModule, MatRadioModule, MatSnackBarModule, MatStepperModule, MatToolbarModule, MatTooltipModule} from '@angular/material';\nimport {MatCardModule} from '@angular/material/card';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatInputModule} from '@angular/material/input';\nimport {BrowserModule} from '@angular/platform-browser';\nimport {NoopAnimationsModule} from '@angular/platform-browser/animations';\nimport {NgbModule} from '@ng-bootstrap/ng-bootstrap';\nimport {ChartsModule} from 'ng2-charts';\nimport {DragulaModule} from 'ng2-dragula';\nimport {NgxDaterangepickerMd} from 'ngx-daterangepicker-material';\nimport {UI_CONSTANTS, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {environment} from '../environments/environment';\n\nimport {AppRoutingModule} from './app-routing.module';\nimport {AppComponent} from './app.component';\nimport {CardcontainerComponent} from './cardcontainer/cardcontainer.component';\nimport {CardComponent} from './cardtypes/card/card.component';\n// tslint:disable-next-line:max-line-length\nimport {CustomizableTimelineDialogComponent} from './cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component';\nimport {CustomizableTimelineComponent} from './cardtypes/customizable-timeline/customizable-timeline.component';\nimport {MultiGraphCardComponent} from './cardtypes/multigraphcard/multigraphcard.component';\nimport {TextboxcardComponent} from './cardtypes/textboxcard/textboxcard.component';\nimport {ConceptFileConfiguration} from './conceptmappings/concept-file-configuration';\nimport {ResourceCodeCreator} from './conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from './conceptmappings/resource-code-manager';\nimport {DataSelectorElementComponent} from './data-selector-menu/data-selector-element/data-selector-element.component';\nimport {DataSelectorMenuComponent} from './data-selector-menu/data-selector-menu.component';\nimport {DebuggerComponent} from './debugger/debugger.component';\nimport {ConfirmSaveComponent} from './dialogs/confirm-save/confirm-save.component';\nimport {DeleteDialogComponent} from './dialogs/delete-dialog/delete-dialog.component';\nimport {HelpDialogComponent} from './dialogs/help-dialog/help-dialog.component';\nimport {IfuDialogComponent} from './dialogs/ifu-dialog/ifu-dialog.component';\nimport {FhirHttpService} from './fhir-server/fhir-http.service';\nimport {FhirLaunchComponent} from './fhir-server/fhir-launch/fhir-launch.component';\nimport {FhirService} from './fhir-server/fhir.service';\nimport {MockFhirService} from './fhir-server/mock-fhir.service';\nimport {SMART_ON_FHIR_CLIENT} from './fhir-server/smart-on-fhir-client';\nimport {CustomizableGraphComponent} from './graphs/graphtypes/customizable-graph/customizable-graph.component';\nimport {DiagnosticGraphComponent} from './graphs/graphtypes/diagnostic-graph/diagnostic-graph.component';\nimport {DiagnosticGraphDialogComponent} from './graphs/graphtypes/diagnostic-graph/diagnostic-graph.dialog.component';\nimport {LineGraphComponent} from './graphs/graphtypes/linegraph/linegraph.component';\nimport {MicrobioGraphComponent} from './graphs/graphtypes/microbio-graph/microbio-graph.component';\nimport {ScatterplotComponent} from './graphs/graphtypes/scatterplot/scatterplot.component';\nimport {StepGraphComponent} from './graphs/graphtypes/stepgraph/stepgraph.component';\nimport {SetupComponent} from './setup/setup.component';\nimport {TimelineControllerComponent} from './time-navigation/timeline-controller/timeline-controller.component';\nimport {TimelineToolbarComponent} from './time-navigation/timeline-toolbar/timeline-toolbar.component';\n\n@NgModule({\n declarations: [\n AppComponent,\n FhirLaunchComponent,\n CardcontainerComponent,\n TextboxcardComponent,\n LineGraphComponent,\n ScatterplotComponent,\n StepGraphComponent,\n MultiGraphCardComponent,\n TimelineControllerComponent,\n CustomizableTimelineComponent,\n CustomizableGraphComponent,\n CustomizableTimelineDialogComponent,\n MicrobioGraphComponent,\n DiagnosticGraphComponent,\n TimelineToolbarComponent,\n DataSelectorElementComponent,\n DataSelectorMenuComponent,\n HelpDialogComponent,\n CardComponent,\n DeleteDialogComponent,\n DebuggerComponent,\n SetupComponent,\n ConfirmSaveComponent,\n IfuDialogComponent,\n DiagnosticGraphDialogComponent,\n ],\n imports: [\n BrowserModule,\n NgbModule,\n MatCardModule,\n MatGridListModule,\n HttpClientModule,\n MatListModule,\n MatDividerModule,\n MatIconModule,\n NoopAnimationsModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatProgressSpinnerModule,\n MatButtonModule,\n MatAutocompleteModule,\n MatMenuModule,\n MatTooltipModule,\n FlexLayoutModule.withConfig({useColumnBasisZero: false}),\n MatDialogModule,\n MatStepperModule,\n MatToolbarModule,\n MatSnackBarModule,\n MatDatepickerModule,\n NgxDaterangepickerMd.forRoot({}),\n MatButtonToggleModule,\n MatNativeDateModule,\n MatCheckboxModule,\n MatRadioModule,\n ChartsModule,\n DragulaModule.forRoot(),\n AppRoutingModule,\n MatExpansionModule,\n ],\n providers: [\n ResourceCodeCreator, ResourceCodeManager,\n // This sets up a provider for the smart on fhir client defined by\n // assets/fhir-client.min.js (defined as symbol `FHIR`) so that it can be\n // injected into the service that uses it to allow for easier testing.\n {provide: SMART_ON_FHIR_CLIENT, useValue: FHIR}, {\n provide: FhirService,\n useClass: environment.useMockServer ? MockFhirService : FhirHttpService\n },\n {provide: UI_CONSTANTS_TOKEN, useValue: UI_CONSTANTS}, {\n provide: ConceptFileConfiguration,\n useValue: new ConceptFileConfiguration(\n environment.conceptsFolder, environment.vitalGroupFile,\n environment.vitalConceptsFile, environment.labConceptsFile,\n environment.labGroupFile, environment.radiologyConceptsFile,\n environment.radiologyGroupFile, environment.antibioticConceptsFile,\n environment.antibioticGroupFile, environment.antiviralConceptsFile,\n environment.antiviralGroupFile, environment.antifungalConceptsFile,\n environment.antifungalGroupFile, environment.microbioGroupFile,\n environment.microbioConceptsFile)\n }\n ],\n bootstrap: [AppComponent],\n entryComponents: [\n CustomizableTimelineDialogComponent, HelpDialogComponent,\n DeleteDialogComponent, ConfirmSaveComponent, IfuDialogComponent,\n DiagnosticGraphDialogComponent\n ]\n})\nexport class AppModule {\n}\n","module.exports = \".cardContainer {\\n background-color: #202020; /* GREY_900 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n width: 100%;\\n min-height: 100%;\\n height: 100%;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n /* Disable selecting/highlighting on the page. */\\n -webkit-touch-callout: none; /* iOS Safari */\\n -webkit-user-select: none; /* Safari */\\n -moz-user-select: none; /* Firefox */\\n -ms-user-select: none; /* Internet Explorer/Edge */\\n user-select: none; /* Chrome and Opera */\\n}\\n\\n.draggable {\\n display: flex;\\n display: -ms-flexbox;\\n height: 100%;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n}\\n\\n.flexSpacer {\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\n::ng-deep .mat-toolbar, .mat-toolbar h1, .mat-toolbar h2, .mat-toolbar h3, .mat-toolbar h4, .mat-toolbar h5, .mat-toolbar h6, .mat-toolbar-row, .mat-toolbar-single-row {\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n.mat-toolbar {\\n /* Deep Purple 800 to Pink 900 */\\n background-image: linear-gradient(to right, #4527A0 , #870D4E);\\n color: white;\\n}\\n\\n::ng-deep .gu-unselectable app-data-selector-menu {\\n /* Hide the data selector menus while a card is being dragged. */\\n opacity: 0 !important;\\n}\\n\\n.makeGutters {\\n padding-right: 50px;\\n padding-left: 50px;\\n}\\n\\n::ng-deep .mat-toolbar-single-row {\\n white-space: unset !important;\\n}\\n\\n::ng-deep .timelineToolbarMain {\\n float: right;\\n margin-right: 15px;\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n::ng-deep app-card {\\n flex-direction: row;\\n -ms-flex-direction: row;\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n::ng-deep app-data-selector-menu {\\n flex-direction: row;\\n -ms-flex-direction: row;\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZGNvbnRhaW5lci9jYXJkY29udGFpbmVyLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSx5QkFBeUIsRUFBRSxhQUFhO0VBQ3hDLGFBQWE7RUFDYixvQkFBb0IsRUFBRSxhQUFhO0VBQ25DLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QiwwQkFBMEIsRUFBRSxhQUFhO0VBQ3pDLGdEQUFnRDtFQUNoRCwyQkFBMkIsRUFBRSxlQUFlO0VBQzVDLHlCQUF5QixFQUFFLFdBQVc7S0FDbkMsc0JBQXNCLEVBQUUsWUFBWTtNQUNuQyxxQkFBcUIsRUFBRSwyQkFBMkI7VUFDOUMsaUJBQWlCLEVBQUUscUJBQXFCO0FBQ2xEOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG9CQUFvQjtFQUNwQixZQUFZO0VBQ1osc0JBQXNCO0VBQ3RCLDBCQUEwQixFQUFFLGFBQWE7QUFDM0M7O0FBRUE7RUFDRSxZQUFZO0VBQ1osZ0JBQWdCLEVBQUUsYUFBYTtBQUNqQzs7QUFFQTtFQUNFLG9CQUFvQixFQUFFLGFBQWE7QUFDckM7O0FBRUE7R0FDRyxnQ0FBZ0M7RUFDakMsOERBQThEO0VBQzlELFlBQVk7QUFDZDs7QUFFQTtFQUNFLGdFQUFnRTtFQUNoRSxxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsWUFBWTtFQUNaLGtCQUFrQjtFQUNsQixvQkFBb0IsR0FBRyxhQUFhO0FBQ3RDOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QixhQUFhO0VBQ2Isb0JBQW9CLEVBQUUsYUFBYTtBQUNyQzs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQix1QkFBdUI7RUFDdkIsYUFBYTtFQUNiLG9CQUFvQixFQUFFLGFBQWE7QUFDckMiLCJmaWxlIjoic3JjL2FwcC9jYXJkY29udGFpbmVyL2NhcmRjb250YWluZXIuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5jYXJkQ29udGFpbmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsgLyogR1JFWV85MDAgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIHdpZHRoOiAxMDAlO1xuICBtaW4taGVpZ2h0OiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvKiBGb3IgSUUxMCAqL1xuICAvKiBEaXNhYmxlIHNlbGVjdGluZy9oaWdobGlnaHRpbmcgb24gdGhlIHBhZ2UuICovXG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsgLyogaU9TIFNhZmFyaSAqL1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyAvKiBTYWZhcmkgKi9cbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsgLyogRmlyZWZveCAqL1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOyAvKiBJbnRlcm5ldCBFeHBsb3Jlci9FZGdlICovXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IC8qIENocm9tZSBhbmQgT3BlcmEgKi9cbn1cblxuLmRyYWdnYWJsZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOyAvKiBGb3IgSUUxMCAqL1xufVxuXG4uZmxleFNwYWNlciB7XG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbn1cblxuOjpuZy1kZWVwIC5tYXQtdG9vbGJhciwgLm1hdC10b29sYmFyIGgxLCAubWF0LXRvb2xiYXIgaDIsIC5tYXQtdG9vbGJhciBoMywgLm1hdC10b29sYmFyIGg0LCAubWF0LXRvb2xiYXIgaDUsIC5tYXQtdG9vbGJhciBoNiwgLm1hdC10b29sYmFyLXJvdywgLm1hdC10b29sYmFyLXNpbmdsZS1yb3cge1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDsgLyogRm9yIElFMTAgKi9cbn1cblxuLm1hdC10b29sYmFyIHtcbiAgIC8qIERlZXAgUHVycGxlIDgwMCB0byBQaW5rIDkwMCAqL1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICM0NTI3QTAgLCAjODcwRDRFKTtcbiAgY29sb3I6IHdoaXRlO1xufVxuXG46Om5nLWRlZXAgLmd1LXVuc2VsZWN0YWJsZSBhcHAtZGF0YS1zZWxlY3Rvci1tZW51IHtcbiAgLyogSGlkZSB0aGUgZGF0YSBzZWxlY3RvciBtZW51cyB3aGlsZSBhIGNhcmQgaXMgYmVpbmcgZHJhZ2dlZC4gKi9cbiAgb3BhY2l0eTogMCAhaW1wb3J0YW50O1xufVxuXG4ubWFrZUd1dHRlcnMge1xuICBwYWRkaW5nLXJpZ2h0OiA1MHB4O1xuICBwYWRkaW5nLWxlZnQ6IDUwcHg7XG59XG5cbjo6bmctZGVlcCAubWF0LXRvb2xiYXItc2luZ2xlLXJvdyB7XG4gIHdoaXRlLXNwYWNlOiB1bnNldCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgLnRpbWVsaW5lVG9vbGJhck1haW4ge1xuICBmbG9hdDogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogMTVweDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7ICAvKiBGb3IgSUUxMCAqL1xufVxuXG46Om5nLWRlZXAgYXBwLWNhcmQge1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG59XG5cbjo6bmctZGVlcCBhcHAtZGF0YS1zZWxlY3Rvci1tZW51IHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94OyAvKiBGb3IgSUUxMCAqL1xufVxuIl19 */\"","module.exports = \"\\n \\n \\n \\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n \\n
\\n
\\n \\n \\n \\n \\n \\n \\n
\\n
\\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {MatDialogRef} from '@angular/material/dialog';\nimport {MatSnackBar} from '@angular/material/snack-bar';\nimport html2canvas from 'html2canvas';\nimport {DateTime, Interval} from 'luxon';\nimport {DragulaService} from 'ng2-dragula';\nimport {Subscription} from 'rxjs';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\nimport {v4 as uuid} from 'uuid';\n\nimport {environment} from '../../environments/environment';\nimport {ConfirmSaveComponent} from '../dialogs/confirm-save/confirm-save.component';\nimport {DeleteDialogComponent} from '../dialogs/delete-dialog/delete-dialog.component';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {CustomizableData} from '../graphs/graphdatatypes/customizabledata';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ChartType} from '../graphs/graphtypes/graph/graph.component';\nimport {SetupDataService} from '../setup/setup-data.service';\n\n@Component({\n selector: 'app-cardcontainer',\n templateUrl: './cardcontainer.component.html',\n styleUrls: ['./cardcontainer.component.css'],\n entryComponents: [DeleteDialogComponent],\n})\nexport class CardcontainerComponent {\n // How long to display the snack bar for.\n private readonly DISPLAY_TIME = 6000;\n\n // Whether or not to display the debugger.\n useDebugger = environment.useDebugger;\n\n /**\n * The format of each object in the array is an object representing a line\n * drawn on the chart, that has a value, text, and class field. The value\n * field represents the x-position of the line to be drawn, while the class\n * represents the class name, and the text represents the text displayed near\n * the line.\n */\n eventlines: Array<{[key: string]: number | string}> = [];\n\n // The concepts that are actually being displayed on the page.\n // We keep track of unique ids for each displayed card, to allow removal on\n // clicking the trashcan icon.\n\n readonly displayedConcepts:\n Array<{[key: string]: AxisGroup | string | CustomizableData}> = [];\n\n // The original concepts to duplicate, if necessary.\n readonly originalConcepts: Promise =\n this.setupDataService.displayGroupMapping.then((mapping) => {\n /* Load in the concepts to display, flattening them all into a\n * single-depth array. */\n return Array.from(mapping.values())\n .reduce((acc, val) => acc.concat(val), []);\n });\n\n // Hold an instance of this enum so that the HTML template can access it.\n readonly chartType = ChartType;\n\n /**\n * By default make the date range displayed the past seven days.\n */\n dateRange: Interval =\n Interval.fromDateTimes(DateTime.utc().minus({days: 7}), DateTime.utc());\n\n // Holds a subscription to the observable sequence of events emitted by the\n // Dragula Service.\n private readonly subs = new Subscription();\n\n // Holds the most recently removed card from the container, mapping the index\n // of the displayed card to the displayedConcept value.\n private recentlyRemoved:\n [number, {[key: string]: AxisGroup | string | CustomizableData}];\n\n // The reference for the Delete Card Dialog opened.\n private deleteDialogRef: MatDialogRef;\n\n // The reference for the Save Snapshot Dialog opened.\n private saveDialogRef: MatDialogRef;\n\n // A map of custom timeline id to the event lines corresponding to that\n // timeline.\n private eventsForCustomTimelines =\n new Map>();\n\n\n\n constructor(\n dragulaService: DragulaService,\n readonly setupDataService: SetupDataService,\n private snackBar: MatSnackBar,\n private deleteDialog: MatDialog,\n private saveDialog: MatDialog,\n private fhirService: FhirService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any,\n ) {\n this.setUpCards();\n this.setUpDrag(dragulaService);\n }\n\n private setUpCards() {\n // Add a textbox at the top of the card list.\n this.addTextbox();\n // Add a custom timeline to the top of the card list.\n this.addCustomTimeline();\n // Add all cards selected at the set-up screen.\n for (const concept of this.setupDataService.selectedConcepts) {\n this.displayedConcepts.push({'id': uuid(), 'concept': concept});\n }\n }\n\n // Ensures that the order of displayed concepts is updated as the user drags\n // cards around.\n private setUpDrag(dragulaService: DragulaService) {\n this.subs.add(dragulaService.drop('graphcards').subscribe((value) => {\n // Rearrange the order of this.displayedConcepts if graph/textbox\n // cards are reordered. We do not use dragulaModel since we cannot use\n // it for separate lists on the configuration panel.\n let originalIndex = this.displayedConcepts.map(x => x.id).indexOf(\n value.el.getAttribute('data-index'));\n const siblingIndex = this.getSiblingIdx(value);\n const elementDisplayed = this.displayedConcepts[originalIndex];\n // Add the element to its new position.\n this.displayedConcepts.splice(siblingIndex, 0, elementDisplayed);\n // Adjust the original position if needed.\n if (siblingIndex < originalIndex) {\n originalIndex++;\n }\n this.displayedConcepts.splice(originalIndex, 1);\n\n recordGoogleAnalyticsEvent(\n 'moveCard', 'moveCard',\n (typeof elementDisplayed === 'string') ?\n (elementDisplayed as string) :\n (elementDisplayed.label as string));\n }));\n }\n\n /**\n * Gets the index of the card below a dragged-and-dropped card's new place.\n */\n private getSiblingIdx(value): number {\n let siblingIndex;\n if (value.sibling === null) {\n // Dragged to bottom of list\n siblingIndex = this.displayedConcepts.length;\n } else {\n const siblingId = value.sibling.getAttribute('data-index');\n siblingIndex = this.displayedConcepts.map(x => x.id).indexOf(siblingId);\n }\n return siblingIndex;\n }\n\n /**\n * Adds a new annotation box to the card panel.\n * @param id: The id of the card above the position of the new annotation box.\n */\n addTextbox(id?: string) {\n const index =\n id ? (this.displayedConcepts.map(x => x.id).indexOf(id) + 1) : 0;\n this.displayedConcepts.splice(index, 0, {id: uuid(), concept: 'textbox'});\n }\n\n /**\n * Adds a new custom timeline to the card panel.\n * @param id: The id of the card above the position of the new annotation box.\n */\n addCustomTimeline(id?: string) {\n const index =\n id ? (this.displayedConcepts.map(x => x.id).indexOf(id) + 1) : 0;\n this.displayedConcepts.splice(\n index, 0, {id: uuid(), concept: 'customTimeline'});\n }\n\n // Listen for an event indicating that the date range has been changed on the\n // UI, and update the date range.\n changeDateRange($event) {\n this.dateRange = $event;\n }\n\n // Saves a snapshot of the graph drawer HTML to the EHR using a FhirService.\n snapshot() {\n html2canvas(document.body).then((canvas) => {\n this.saveDialogRef = this.saveDialog.open(\n ConfirmSaveComponent, {data: canvas, height: '80%'});\n\n this.saveDialogRef.afterClosed().subscribe(result => {\n // Only save the snapshot to the EHR if the user confirmed the save.\n if (result) {\n const date = DateTime.fromJSDate(new Date()).toISO();\n this.fhirService.saveStaticNote(canvas, date).then(res => {\n if (res) {\n this.snackBar.open(\n this.uiConstants.SAVED_TO_POWERCHART,\n this.uiConstants.DISMISS, {\n duration: this.DISPLAY_TIME, // Wait 6 seconds before\n // dismissing the snack bar.\n });\n } else {\n this.snackBar.open(\n this.uiConstants.ERROR_SAVED_TO_POWERCHART,\n this.uiConstants.DISMISS, {\n duration: this.DISPLAY_TIME, // Wait 6 seconds before\n // dismissing the snack bar.\n });\n }\n });\n\n\n recordGoogleAnalyticsEvent(\n 'saveStaticSnapshot', 'save', new Date().toDateString());\n }\n });\n });\n }\n\n // Listen for an event indicating that a \"delete\" button has been clicked on a\n // card currently displayed, and update the displayed concepts\n // accordingly after asking for confirmation of deletion.\n removeDisplayedCard($event) {\n const index = this.displayedConcepts.map(x => x.id).indexOf($event.id);\n const concept = this.displayedConcepts[index];\n concept.value = $event.value;\n this.deleteDialogRef = this.deleteDialog.open(DeleteDialogComponent);\n this.deleteDialogRef.afterClosed().subscribe(result => {\n // The user wishes to delete the card.\n if (result) {\n this.displayedConcepts.splice(index, 1);\n this.recentlyRemoved = [index, concept];\n this.openSnackBar();\n if (this.eventsForCustomTimelines.get($event.id)) {\n // We only remove the event lines for this CustomTimeline if the user\n // confirms the deletion of the card.\n this.updateEventLines({id: $event.id});\n }\n }\n });\n }\n\n // Open a snack bar allowing for the user to potentially reverse the removal\n // of cards from the page. Only one snack bar can be opened at a time.\n private openSnackBar() {\n const message = this.uiConstants.CARD_REMOVED;\n const snackBarRef = this.snackBar.open(message, this.uiConstants.UNDO, {\n duration:\n this.DISPLAY_TIME, // Wait 6 seconds before dismissing the snack bar.\n });\n // Undo the most recent deletion according to what is stored in\n // recentlyRemoved.\n snackBarRef.onAction().subscribe(() => {\n const index = this.recentlyRemoved[0];\n this.displayedConcepts.splice(index, 0, this.recentlyRemoved[1]);\n if (this.displayedConcepts[index].concept === 'customTimeline') {\n this.updateEventLines({\n id: this.displayedConcepts[0].id,\n data: this.displayedConcepts[0].value\n });\n }\n recordGoogleAnalyticsEvent(\n 'undoDelete', 'deleteCard',\n Array.from(this.recentlyRemoved.values()).toString());\n });\n }\n\n /**\n * Listens for an event indicating that the user has selected to add the\n * concept card from the top toolbar. The card is added at the top of the\n * page, or, if the id of the closest card is specified, below the closest\n * card.\n * @param label The label of the new concept to add.\n * @param id The id of the card below which to add the new concept.\n */\n\n addConceptCard(label: string, id?: string) {\n this.originalConcepts.then((concepts) => {\n const graphCardValue = concepts.find(obj => (obj.label === label));\n // Insert the card at the top of the page\n // Insert after the closest card rather than before the card.\n const index =\n id ? (this.displayedConcepts.map(x => x.id).indexOf(id) + 1) : 0;\n this.displayedConcepts.splice(\n index, 0, {id: uuid(), concept: graphCardValue});\n });\n }\n\n /**\n * Listens for an event indicating that the user has edited the points on a\n * custom timeline, and updates the x-axis eventlines displayed on all other\n * charts.\n * @param $event The updated CustomizableData from which we calculate event\n * lines for each chart to display, along with the id of the updated.\n *\n */\n\n updateEventLines($event) {\n let times = [];\n if ($event.data) {\n times = Array.from($event.data.annotations.keys()).map(x => Number(x));\n }\n const eventlines = times.map(x => {\n return {\n value: x,\n text: $event.data.annotations.get(x).title,\n color: $event.data.annotations.get(x).color.hex()\n };\n });\n this.eventsForCustomTimelines.set($event.id, eventlines);\n\n // Consolidate all event lines from all custom timelines.\n let allEvents = [];\n for (const events of Array.from(this.eventsForCustomTimelines.values())) {\n allEvents = allEvents.concat(events);\n }\n this.eventlines = allEvents;\n }\n}\n","module.exports = \".mat-card {\\n cursor: -webkit-grab;\\n cursor: grab;\\n margin-top:0px;\\n margin-bottom:0px;\\n margin-left: 35px; /* Leave space for the \\\"add card\\\" button. */\\n padding-top: 0px;\\n padding-bottom: 0px;\\n padding-right: 20px;\\n padding-left: 0px;\\n transition: box-shadow .1s;\\n background-color: rgb(248, 248, 248);\\n flex-direction: row;\\n -ms-flex-direction: row; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n width: 100%;\\n max-width: 100%;\\n}\\n\\n::ng-deep .inEditMode .mat-card {\\n background-color: rgb(226, 226, 226) !important;\\n}\\n\\n.mat-card:hover {\\n background-color: rgb(240, 240, 240);\\n box-shadow: 0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);\\n}\\n\\n.colorbar {\\n margin-right: 6px;\\n min-width: 24px;\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 0 0 0%;\\n -ms-flex: 0 0 0%; /* For IE10 */\\n align-content: center;\\n -ms-flex-line-pack: center; /* Align content: center conversion for IE10 */\\n justify-content: center;\\n -ms-flex-pack: center; /* Justify content: center conversion for IE10 */\\n align-self: stretch;\\n -ms-flex-item-align: stretch; /* Align self: stretch conversion for IE10 */\\n}\\n\\n.mat-icon {\\n color: rgb(34, 44, 66);\\n cursor: pointer;\\n opacity: .3;\\n transition: opacity .3s;\\n}\\n\\n.removeCardButton {\\n opacity: 0;\\n}\\n\\n.mat-card:hover .mat-icon {\\n opacity: .8;\\n}\\n\\n.mat-card:hover .dragCardIcon.mat-icon {\\n opacity: .4;\\n}\\n\\n.dragCardIcon {\\n opacity: 0;\\n margin-bottom: 15px;\\n}\\n\\n.labelColumn {\\n padding: 3px;\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 0 0 auto;\\n -ms-flex: 0 0 auto; /* For IE10 */\\n}\\n\\n.label {\\n width: 100%;\\n word-wrap: break-word;\\n flex: 1 1 auto;\\n -ms-flex: 1 1 auto; /* For IE10 */\\n font-family: 'Montserrat', sans-serif;\\n}\\n\\n::ng-deep .mat-input-element:disabled{\\n color: rgb(0,0,0, .7) !important;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2NhcmQvY2FyZC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0Usb0JBQVk7RUFBWixZQUFZO0VBQ1osY0FBYztFQUNkLGlCQUFpQjtFQUNqQixpQkFBaUIsRUFBRSwyQ0FBMkM7RUFDOUQsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsaUJBQWlCO0VBQ2pCLDBCQUEwQjtFQUMxQixvQ0FBb0M7RUFDcEMsbUJBQW1CO0VBQ25CLHVCQUF1QixFQUFFLGFBQWE7RUFDdEMsYUFBYTtFQUNiLG9CQUFvQixFQUFFLGFBQWE7RUFDbkMsWUFBWTtFQUNaLGdCQUFnQixFQUFFLGFBQWE7RUFDL0IsV0FBVztFQUNYLGVBQWU7QUFDakI7O0FBRUE7RUFDRSwrQ0FBK0M7QUFDakQ7O0FBRUE7RUFDRSxvQ0FBb0M7RUFDcEMsOERBQThEO0FBQ2hFOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGVBQWU7RUFDZiwyQkFBMkI7RUFDM0IsOEJBQThCO0VBQzlCLHNCQUFzQjtFQUN0QiwwQkFBMEIsRUFBRSxhQUFhO0VBQ3pDLGFBQWE7RUFDYixvQkFBb0IsRUFBRSxhQUFhO0VBQ25DLFlBQVk7RUFDWixnQkFBZ0IsRUFBRSxhQUFhO0VBQy9CLHFCQUFxQjtFQUNyQiwwQkFBMEIsRUFBRSw4Q0FBOEM7RUFDMUUsdUJBQXVCO0VBQ3ZCLHFCQUFxQixHQUFHLGdEQUFnRDtFQUN4RSxtQkFBbUI7RUFDbkIsNEJBQTRCLEdBQUcsNENBQTRDO0FBQzdFOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGVBQWU7RUFDZixXQUFXO0VBQ1gsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0UsVUFBVTtFQUNWLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixzQkFBc0I7RUFDdEIsMEJBQTBCLEVBQUUsYUFBYTtFQUN6QyxhQUFhO0VBQ2Isb0JBQW9CLEVBQUUsYUFBYTtFQUNuQyxjQUFjO0VBQ2Qsa0JBQWtCLEVBQUUsYUFBYTtBQUNuQzs7QUFFQTtFQUNFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsY0FBYztFQUNkLGtCQUFrQixFQUFFLGFBQWE7RUFDakMscUNBQXFDO0FBQ3ZDOztBQUVBO0VBQ0UsZ0NBQWdDO0FBQ2xDIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2NhcmQvY2FyZC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLm1hdC1jYXJkIHtcbiAgY3Vyc29yOiBncmFiO1xuICBtYXJnaW4tdG9wOjBweDtcbiAgbWFyZ2luLWJvdHRvbTowcHg7XG4gIG1hcmdpbi1sZWZ0OiAzNXB4OyAvKiBMZWF2ZSBzcGFjZSBmb3IgdGhlIFwiYWRkIGNhcmRcIiBidXR0b24uICovXG4gIHBhZGRpbmctdG9wOiAwcHg7XG4gIHBhZGRpbmctYm90dG9tOiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogMHB4O1xuICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IC4xcztcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0OCwgMjQ4LCAyNDgpO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdzsgLyogRm9yIElFMTAgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuOjpuZy1kZWVwIC5pbkVkaXRNb2RlIC5tYXQtY2FyZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KSAhaW1wb3J0YW50O1xufVxuXG4ubWF0LWNhcmQ6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7XG4gIGJveC1zaGFkb3c6IDAgMCA4cHggcmdiYSgwLDAsMCwuMTgpLDAgOHB4IDE2cHggcmdiYSgwLDAsMCwuMzYpO1xufVxuXG4uY29sb3JiYXIge1xuICBtYXJnaW4tcmlnaHQ6IDZweDtcbiAgbWluLXdpZHRoOiAyNHB4O1xuICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IC8qIEZvciBJRTEwICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94OyAvKiBGb3IgSUUxMCAqL1xuICBmbGV4OiAwIDAgMCU7XG4gIC1tcy1mbGV4OiAwIDAgMCU7IC8qIEZvciBJRTEwICovXG4gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7IC8qIEFsaWduIGNvbnRlbnQ6IGNlbnRlciBjb252ZXJzaW9uIGZvciBJRTEwICovXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7ICAvKiBKdXN0aWZ5IGNvbnRlbnQ6IGNlbnRlciBjb252ZXJzaW9uIGZvciBJRTEwICovXG4gIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gIC1tcy1mbGV4LWl0ZW0tYWxpZ246IHN0cmV0Y2g7ICAvKiBBbGlnbiBzZWxmOiBzdHJldGNoIGNvbnZlcnNpb24gZm9yIElFMTAgKi9cbn1cblxuLm1hdC1pY29uIHtcbiAgY29sb3I6IHJnYigzNCwgNDQsIDY2KTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBvcGFjaXR5OiAuMztcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3M7XG59XG5cbi5yZW1vdmVDYXJkQnV0dG9uIHtcbiAgb3BhY2l0eTogMDtcbn1cblxuLm1hdC1jYXJkOmhvdmVyIC5tYXQtaWNvbiB7XG4gIG9wYWNpdHk6IC44O1xufVxuXG4ubWF0LWNhcmQ6aG92ZXIgLmRyYWdDYXJkSWNvbi5tYXQtaWNvbiB7XG4gIG9wYWNpdHk6IC40O1xufVxuXG4uZHJhZ0NhcmRJY29uIHtcbiAgb3BhY2l0eTogMDtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLmxhYmVsQ29sdW1uIHtcbiAgcGFkZGluZzogM3B4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgLyogRm9yIElFMTAgKi9cbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIGZsZXg6IDAgMCBhdXRvO1xuICAtbXMtZmxleDogMCAwIGF1dG87IC8qIEZvciBJRTEwICovXG59XG5cbi5sYWJlbCB7XG4gIHdpZHRoOiAxMDAlO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICAtbXMtZmxleDogMSAxIGF1dG87IC8qIEZvciBJRTEwICovXG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG59XG5cbjo6bmctZGVlcCAubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWR7XG4gIGNvbG9yOiByZ2IoMCwwLDAsIC43KSAhaW1wb3J0YW50O1xufVxuIl19 */\"","module.exports = \"\\n\\n
\\n clear\\n \\n \\n drag_handle\\n \\n \\n
\\n
\\n
\\n
{{label}}
\\n \\n \\n
\\n \\n \\n
\\n \\n edit\\n \\n save\\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, Input, Output} from '@angular/core';\nimport * as Color from 'color';\nimport * as Colors from 'src/app/theme/verily_colors';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * This is the base template for all the cards in this app. It will show a\n * colored bar on the left hand side with icons for actions, and then\n * optionally a label and legend, then the contents of the card.\n */\n@Component({\n selector: 'app-card',\n templateUrl: './card.component.html',\n styleUrls: ['./card.component.css']\n})\nexport class CardComponent {\n @Input() color: Color = Colors.BLUE_GREY_500;\n @Input() id: string;\n @Input() label: string;\n @Input() isEditable = false;\n @Input() isRemovable = true;\n\n @Output() renderEvent = new EventEmitter();\n @Output() removeEvent = new EventEmitter();\n @Output() editEvent = new EventEmitter();\n @Output() saveEvent = new EventEmitter();\n\n inEditMode = false;\n\n constructor(@Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n // The events below need to get propogated up to the card container.\n\n // Called when the user clicks the trashcan button on the card.\n remove() {\n this.removeEvent.emit(this.id);\n }\n\n // Called when the card resizes.\n resize($event) {\n this.renderEvent.emit($event);\n }\n\n // Called when the user clicks on the edit button.\n edit($event) {\n this.inEditMode = true;\n this.editEvent.emit($event);\n }\n\n // Called when the user hits the save button to exit out of edit mode.\n save($event) {\n this.inEditMode = false;\n this.saveEvent.emit($event);\n }\n}\n","module.exports = \"ngb-timepicker {\\n font-size: 1rem;\\n}\\n\\n::ng-deep fieldset {\\n min-width: 0;\\n padding: 0;\\n margin: 0;\\n border: 0;\\n}\\n\\n::ng-deep .ngb-tp {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-align: center;\\n align-items: center;\\n}\\n\\n::ng-deep .ngb-tp-hour, .ngb-tp-meridian, .ngb-tp-minute, .ngb-tp-second {\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n -ms-flex-align: center;\\n align-items: center;\\n -ms-flex-pack: distribute;\\n justify-content: space-around;\\n}\\n\\n::ng-deep .ngb-tp-input-container {\\n width: 4em;\\n}\\n\\n::ng-deep .ngb-tp-spacer {\\n width: 50px !important;\\n text-align: center;\\n}\\n\\n::ng-deep .btn-link {\\n font-weight: 400;\\n color: #5E35B1;\\n background-color: transparent;\\n border-width: 1px;\\n cursor: pointer;\\n border-radius: 4px;\\n}\\n\\n::ng-deep .form-control {\\n display: block;\\n width: 100%;\\n padding: .375rem .75rem;\\n font-size: 1rem;\\n line-height: 1.5;\\n color: #495057;\\n background-color: #fff;\\n background-clip: padding-box;\\n border: 1px solid #ced4da;\\n border-radius: .25rem;\\n}\\n\\n::ng-deep .ngb-tp-input {\\n text-align: center;\\n width: inherit;\\n}\\n\\n::ng-deep .sr-only {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n overflow: hidden;\\n clip: rect(0,0,0,0);\\n white-space: nowrap;\\n -webkit-clip-path: inset(50%);\\n clip-path: inset(50%);\\n border: none;\\n}\\n\\n::ng-deep .mat-error {\\n font-size: 12px;\\n}\\n\\n.mockPlaceholder {\\n font-size: 12px;\\n color: grey;\\n margin-top: 18px;\\n}\\n\\n::ng-deep .dateInput {\\n width: 100px !important;\\n}\\n\\n::ng-deep ngb-datepicker {\\n z-index: 4;\\n background-color:white;\\n}\\n\\n::ng-deep .date {\\n display: inline-block;\\n vertical-align: middle;\\n}\\n\\n::ng-deep .time {\\n display: inline-block;\\n margin-left:30px;\\n vertical-align: middle;\\n}\\n\\n::ng-deep .date .mockPlaceholder {\\n margin-bottom: 20px;\\n}\\n\\n::ng-deep .date .dateInput {\\n margin-bottom: 20px;\\n}\\n\\n::ng-deep .mat-dialog-container {\\n max-height: 400px !important;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxZQUFZO0VBQ1osVUFBVTtFQUNWLFNBQVM7RUFDVCxTQUFTO0FBQ1g7O0FBRUE7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLHNCQUFzQjtFQUN0QixtQkFBbUI7QUFDckI7O0FBQ0E7RUFDRSxvQkFBb0I7RUFDcEIsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQixzQkFBc0I7RUFDdEIsc0JBQXNCO0VBQ3RCLG1CQUFtQjtFQUNuQix5QkFBeUI7RUFDekIsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsNkJBQTZCO0VBQzdCLGlCQUFpQjtFQUNqQixlQUFlO0VBQ2Ysa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsY0FBYztFQUNkLFdBQVc7RUFDWCx1QkFBdUI7RUFDdkIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2Qsc0JBQXNCO0VBQ3RCLDRCQUE0QjtFQUM1Qix5QkFBeUI7RUFDekIscUJBQXFCO0FBQ3ZCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsVUFBVTtFQUNWLFdBQVc7RUFDWCxVQUFVO0VBQ1YsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkIsNkJBQTZCO0VBQzdCLHFCQUFxQjtFQUNyQixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtFQUNmLFdBQVc7RUFDWCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxVQUFVO0VBQ1Ysc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUtZGlhbG9nL2N1c3RvbWl6YWJsZS10aW1lbGluZS1kaWFsb2cuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIm5nYi10aW1lcGlja2VyIHtcbiAgZm9udC1zaXplOiAxcmVtO1xufVxuXG46Om5nLWRlZXAgZmllbGRzZXQge1xuICBtaW4td2lkdGg6IDA7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgYm9yZGVyOiAwO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cCB7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuOjpuZy1kZWVwIC5uZ2ItdHAtaG91ciwgLm5nYi10cC1tZXJpZGlhbiwgLm5nYi10cC1taW51dGUsIC5uZ2ItdHAtc2Vjb25kIHtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtaW5wdXQtY29udGFpbmVyIHtcbiAgd2lkdGg6IDRlbTtcbn1cblxuOjpuZy1kZWVwIC5uZ2ItdHAtc3BhY2VyIHtcbiAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG46Om5nLWRlZXAgLmJ0bi1saW5rIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICM1RTM1QjE7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbjo6bmctZGVlcCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAuMzc1cmVtIC43NXJlbTtcbiAgZm9udC1zaXplOiAxcmVtO1xuICBsaW5lLWhlaWdodDogMS41O1xuICBjb2xvcjogIzQ5NTA1NztcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2NlZDRkYTtcbiAgYm9yZGVyLXJhZGl1czogLjI1cmVtO1xufVxuXG46Om5nLWRlZXAgLm5nYi10cC1pbnB1dCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgd2lkdGg6IGluaGVyaXQ7XG59XG5cbjo6bmctZGVlcCAuc3Itb25seSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDFweDtcbiAgaGVpZ2h0OiAxcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC13ZWJraXQtY2xpcC1wYXRoOiBpbnNldCg1MCUpO1xuICBjbGlwLXBhdGg6IGluc2V0KDUwJSk7XG4gIGJvcmRlcjogbm9uZTtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZXJyb3Ige1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5tb2NrUGxhY2Vob2xkZXIge1xuICBmb250LXNpemU6IDEycHg7XG4gIGNvbG9yOiBncmV5O1xuICBtYXJnaW4tdG9wOiAxOHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGVJbnB1dCB7XG4gIHdpZHRoOiAxMDBweCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgbmdiLWRhdGVwaWNrZXIge1xuICB6LWluZGV4OiA0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO1xufVxuXG46Om5nLWRlZXAgLmRhdGUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbjo6bmctZGVlcCAudGltZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luLWxlZnQ6MzBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuOjpuZy1kZWVwIC5kYXRlIC5tb2NrUGxhY2Vob2xkZXIge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG46Om5nLWRlZXAgLmRhdGUgLmRhdGVJbnB1dCB7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbjo6bmctZGVlcCAubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBtYXgtaGVpZ2h0OiA0MDBweCAhaW1wb3J0YW50O1xufVxuIl19 */\"","module.exports = \"
\\n
\\n
\\n
Date *
\\n \\n
Invalid date
\\n
\\n
\\n
Time *
\\n \\n \\n
Invalid time
\\n
\\n
\\n Caution: Date outside of current range\\n
\\n
\\n
\\n \\n \\n Please enter a title.\\n \\n \\n \\n \\n
\\n Flag color\\n \\n \\n \\n \\n \\n
\\n
\\n \\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {NgbDateAdapter, NgbDateNativeAdapter} from '@ng-bootstrap/ng-bootstrap';\nimport * as Color from 'color';\nimport {DateTime, Interval} from 'luxon';\n// tslint:disable-next-line:max-line-length\nimport {CustomizableGraphAnnotation} from 'src/app/graphs/graphtypes/customizable-graph/customizable-graph-annotation';\n// tslint:disable-next-line:max-line-length\nimport * as Colors from 'src/app/theme/verily_colors';\n\n/**\n * A Dialog with a textarea input, used to set the description of points on the\n * CustomizableTimeline.\n */\n@Component({\n selector: 'app-customizable-timeline-dialog',\n templateUrl: './customizable-timeline-dialog.component.html',\n styleUrls: ['./customizable-timeline-dialog.component.css'],\n providers: [{provide: NgbDateAdapter, useClass: NgbDateNativeAdapter}]\n})\nexport class CustomizableTimelineDialogComponent {\n // The text input for this dialog box.\n userTitle: string;\n\n // The list of suggested times to display with the autocomplete.\n listOfTimes = [];\n\n // The list of colors the user will be able to choose from.\n listOfColors = [\n Colors.DEEP_CORAL,\n Colors.DEEP_ORANGE,\n Colors.DEEP_TURQUOISE,\n Colors.DEEP_CYAN,\n Colors.DEEP_PURPLE_600,\n ];\n\n // The selected color in this dialog box.\n selectedColor: string;\n\n // The description input for this dialog box.\n userDescription: string;\n\n // The FormControl handling the time selection for this dialog box.\n timeFormControl: FormControl;\n\n // The date selected for this dialog box.\n date: Date;\n\n // The time selected for this dialog box.\n time: any;\n\n // The date range currently being viewed.\n dateRange: Interval;\n\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) public data: any) {\n this.date = new Date(data.date);\n const minutes = this.date.getMinutes();\n const hours = this.date.getHours();\n this.time = {hour: hours, minute: minutes};\n this.timeFormControl =\n new FormControl(this.time, (control: FormControl) => {\n const value = control.value;\n if (!value) {\n return null;\n }\n });\n // Set the default selected color as yellow if unset, or find the BCH Color\n // matching the selected color passed in.\n this.selectedColor = data.color ?\n this.listOfColors.find(c => c.hex() === data.color.hex()) :\n Colors.DEEP_CORAL;\n // Set the title if it is passed in.\n if (data.title) {\n this.userTitle = data.title;\n }\n // Set the description if it is passed in.\n if (data.description) {\n this.userDescription = data.description;\n }\n\n if (data.dateRange) {\n this.dateRange = Interval.fromDateTimes(\n this.data.dateRange.start.toLocal().startOf('day'),\n this.data.dateRange.end.toLocal().endOf('day'));\n }\n }\n\n // Closes the dialog popup without saving the user input.\n onCancel(): void {\n this.dialogRef.close();\n }\n\n // Closes the dialog popup and saves user input.\n onSave(): void {\n this.dialogRef.close(new CustomizableGraphAnnotation(\n DateTime.fromJSDate(this.getSelectedDate()),\n this.userTitle.trim(),\n this.userDescription,\n Color.rgb(this.selectedColor),\n ));\n }\n\n // Constructs a new Date based on user input.\n private getSelectedDate(): Date {\n const dateTime = new Date(this.date);\n if (!this.time || !this.timeFormControl.value) {\n return undefined;\n }\n // For date parsing to work in IE, we must remove all extraneous non-ASCII\n // characters added, and manually change the time.\n dateTime.setHours(this.time.hour, this.time.minute);\n return dateTime;\n }\n\n // Finds incomplete fields that are required and disables saving.\n findIncompleteFields() {\n return !this.userTitle ||\n (this.userTitle && this.userTitle.trim().length === 0) ||\n this.date === null || this.isInvalidDate() ||\n this.timeFormControl.hasError('required') ||\n this.timeFormControl.invalid;\n }\n\n // Returns whether the date input has an invalid date.\n isInvalidDate(): boolean {\n return isNaN(DateTime.fromJSDate(this.date).toMillis());\n }\n\n // Returns whether the date selected by the user falls outside the current\n // date range.\n dateNotInRange(): boolean {\n const dateTime = DateTime.fromJSDate(this.getSelectedDate());\n if (!this.dateRange) {\n return false;\n }\n return !(this.dateRange.contains(dateTime));\n }\n}\n","module.exports = \"::ng-deep [class*=\\\"timeline\\\"] .c3-xgrid-focus {\\n visibility: visible !important;\\n}\\n\\n::ng-deep .timeline .c3 {\\n cursor: default !important;\\n}\\n\\n::ng-deep .inEditMode .timeline .c3 {\\n cursor: pointer !important;\\n}\\n\\n/* Only display icons on flags in the CustomizableGraph if in edit mode. */\\n\\n::ng-deep app-customizable-graph.inEditMode .showIcon {\\n visibility: visible !important;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-custom\\\"] {\\n position: absolute;\\n display: block;\\n font-size: 11px;\\n border-style: solid;\\n padding: 3px;\\n border-width: 1px;\\n border-color: grey;\\n border-radius: 3px;\\n min-height: 25px;\\n width: 200px;\\n max-height: 100px;\\n background-color: white;\\n overflow: auto;\\n color: white;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-whole\\\"] {\\n position: absolute;\\n display: block;\\n min-height: 25px;\\n width: 0px;\\n max-height: 100px;\\n border-left-style: solid;\\n border-width: 1px;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-title-custom\\\"] {\\n margin: 0px;\\n font-size: small;\\n text-align: center;\\n max-width: 120px;\\n display: inline-block;\\n vertical-align: bottom;\\n min-width: 120px;\\n overflow: auto;\\n margin-top: 5px;\\n overflow-wrap: break-word;\\n}\\n\\n::ng-deep [class*=\\\"tooltip-details-custom\\\"] {\\n display: none;\\n overflow: auto;\\n text-align: center;\\n overflow-wrap: break-word;\\n max-width: 120px;\\n}\\n\\n::ng-deep [id*=\\\"expand\\\"] {\\n visibility: hidden;\\n vertical-align: middle;\\n}\\n\\n::ng-deep [id*=\\\"delete\\\"] {\\n visibility: hidden;\\n vertical-align: middle;\\n}\\n\\n::ng-deep [id*=\\\"edit\\\"] {\\n visibility: hidden;\\n margin-top: 8px;\\n}\\n\\n.contents-block {\\n flex-direction: column;\\n -ms-flex-direction: column;\\n display: flex;\\n display: -ms-flexbox;\\n flex: 1 1 100%;\\n -ms-flex: 1 1 100%; /* For IE10 */\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLDhCQUE4QjtBQUNoQzs7QUFFQTtFQUNFLDBCQUEwQjtBQUM1Qjs7QUFFQTtFQUNFLDBCQUEwQjtBQUM1Qjs7QUFFQSwwRUFBMEU7O0FBQzFFO0VBQ0UsOEJBQThCO0FBQ2hDOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLGNBQWM7RUFDZCxlQUFlO0VBQ2YsbUJBQW1CO0VBQ25CLFlBQVk7RUFDWixpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQix1QkFBdUI7RUFDdkIsY0FBYztFQUNkLFlBQVk7QUFDZDs7QUFHQTtFQUNFLGtCQUFrQjtFQUNsQixjQUFjO0VBQ2QsZ0JBQWdCO0VBQ2hCLFVBQVU7RUFDVixpQkFBaUI7RUFDakIsd0JBQXdCO0VBQ3hCLGlCQUFpQjtBQUNuQjs7QUFHQTtFQUNFLFdBQVc7RUFDWCxnQkFBZ0I7RUFDaEIsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQixxQkFBcUI7RUFDckIsc0JBQXNCO0VBQ3RCLGdCQUFnQjtFQUNoQixjQUFjO0VBQ2QsZUFBZTtFQUNmLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLGFBQWE7RUFDYixjQUFjO0VBQ2Qsa0JBQWtCO0VBQ2xCLHlCQUF5QjtFQUN6QixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxrQkFBa0I7RUFDbEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0Usa0JBQWtCO0VBQ2xCLHNCQUFzQjtBQUN4Qjs7QUFDQTtFQUNFLGtCQUFrQjtFQUNsQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLDBCQUEwQjtFQUMxQixhQUFhO0VBQ2Isb0JBQW9CO0VBQ3BCLGNBQWM7RUFDZCxrQkFBa0IsRUFBRSxhQUFhO0FBQ25DIiwiZmlsZSI6InNyYy9hcHAvY2FyZHR5cGVzL2N1c3RvbWl6YWJsZS10aW1lbGluZS9jdXN0b21pemFibGUtdGltZWxpbmUuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjo6bmctZGVlcCBbY2xhc3MqPVwidGltZWxpbmVcIl0gLmMzLXhncmlkLWZvY3VzIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgLnRpbWVsaW5lIC5jMyB7XG4gIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgLmluRWRpdE1vZGUgLnRpbWVsaW5lIC5jMyB7XG4gIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xufVxuXG4vKiBPbmx5IGRpc3BsYXkgaWNvbnMgb24gZmxhZ3MgaW4gdGhlIEN1c3RvbWl6YWJsZUdyYXBoIGlmIGluIGVkaXQgbW9kZS4gKi9cbjo6bmctZGVlcCBhcHAtY3VzdG9taXphYmxlLWdyYXBoLmluRWRpdE1vZGUgLnNob3dJY29uIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZSAhaW1wb3J0YW50O1xufVxuXG46Om5nLWRlZXAgW2NsYXNzKj1cInRvb2x0aXAtY3VzdG9tXCJdIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiAxMXB4O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBwYWRkaW5nOiAzcHg7XG4gIGJvcmRlci13aWR0aDogMXB4O1xuICBib3JkZXItY29sb3I6IGdyZXk7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgbWluLWhlaWdodDogMjVweDtcbiAgd2lkdGg6IDIwMHB4O1xuICBtYXgtaGVpZ2h0OiAxMDBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBjb2xvcjogd2hpdGU7XG59XG5cblxuOjpuZy1kZWVwIFtjbGFzcyo9XCJ0b29sdGlwLXdob2xlXCJdIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWluLWhlaWdodDogMjVweDtcbiAgd2lkdGg6IDBweDtcbiAgbWF4LWhlaWdodDogMTAwcHg7XG4gIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG59XG5cblxuOjpuZy1kZWVwIFtjbGFzcyo9XCJ0b29sdGlwLXRpdGxlLWN1c3RvbVwiXSB7XG4gIG1hcmdpbjogMHB4O1xuICBmb250LXNpemU6IHNtYWxsO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG1heC13aWR0aDogMTIwcHg7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgbWluLXdpZHRoOiAxMjBweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbn1cblxuOjpuZy1kZWVwIFtjbGFzcyo9XCJ0b29sdGlwLWRldGFpbHMtY3VzdG9tXCJdIHtcbiAgZGlzcGxheTogbm9uZTtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbiAgbWF4LXdpZHRoOiAxMjBweDtcbn1cblxuOjpuZy1kZWVwIFtpZCo9XCJleHBhbmRcIl0ge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbjo6bmctZGVlcCBbaWQqPVwiZGVsZXRlXCJdIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuOjpuZy1kZWVwIFtpZCo9XCJlZGl0XCJdIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5jb250ZW50cy1ibG9jayB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBkaXNwbGF5OiBmbGV4O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZmxleDogMSAxIDEwMCU7XG4gIC1tcy1mbGV4OiAxIDEgMTAwJTsgLyogRm9yIElFMTAgKi9cbn1cbiJdfQ== */\"","module.exports = \"\\n \\n
\\n {{this.uiConstants.CUSTOM_TIMELINE_INSTRUCTIONS}}\\n
\\n
\\n
\\n \\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// tslint:disable-next-line:max-line-length\nimport {Component, EventEmitter, Inject, Input, OnChanges, Output, SimpleChanges, ViewChild} from '@angular/core';\nimport {Interval} from 'luxon';\nimport {FhirService} from 'src/app/fhir-server/fhir.service';\nimport {CustomizableData} from 'src/app/graphs/graphdatatypes/customizabledata';\nimport {GraphData} from 'src/app/graphs/graphdatatypes/graphdata';\nimport {GraphComponent} from 'src/app/graphs/graphtypes/graph/graph.component';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * The customizable timeline lets the user plot any events they'd like to keep\n * track of as little flags along a timeline.\n */\n@Component({\n selector: 'app-customizable-timeline',\n templateUrl: './customizable-timeline.component.html',\n styleUrls: ['./customizable-timeline.component.css']\n})\nexport class CustomizableTimelineComponent implements OnChanges {\n // The GraphComponent this card holds.\n @ViewChild(GraphComponent) containedGraph!: GraphComponent;\n\n // The unique ID for this displayed card.\n @Input() id: string;\n\n /**\n * The x-axis for this card.\n */\n @Input() dateRange: Interval;\n // Data stored before deletion of the card. This is separate from this.data\n // to avoid unnecessary re-rendering of the graph.\n @Input() deletedData: any;\n\n // An event indicating that the event lines displayed on all other charts need\n // to be updated.\n @Output()\n updateEventLines =\n new EventEmitter<{[key: string]: string | CustomizableData}>();\n\n /** Propogate remove events up to the card container. */\n @Output() removeEvent = new EventEmitter();\n\n // The data for the graph contained.\n data: CustomizableData;\n\n // Whether or not this CustomizableTimeline is being edited.\n inEditMode = false;\n\n constructor(\n private fhirService: FhirService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n this.data = CustomizableData.defaultEmptySeries();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.deletedData && changes.deletedData.currentValue) {\n this.data = this.deletedData;\n this.containedGraph.data = this.data;\n }\n }\n\n // Listens for an event indicating that the points on the CustomizableGraph\n // have been changed, and emits an event with the modified eventlines\n // displayed on all other charts.\n pointsChanged($event) {\n this.updateEventLines.emit({data: this.data, id: this.id});\n }\n\n // Called when the user clicks the trashcan button on the card.\n remove() {\n this.removeEvent.emit({id: this.id, value: this.data});\n recordGoogleAnalyticsEvent(\n 'deleteCustomTimeline', 'deleteCard', new Date().toDateString());\n }\n}\n","module.exports = \".legend {\\n cursor: pointer;\\n}\\n\\n/* This is the color swatch for the legends.*/\\n\\n.legend span {\\n border-style: solid !important;\\n height: 7px;\\n margin: 3px;\\n vertical-align: center;\\n width: 7px;\\n}\\n\\n/* This is a specific style for MultiGraphCard. */\\n\\n.contents-block {\\n flex-direction: column;\\n -ms-flex-direction: column; /* For IE10 */\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\n.axis {\\n flex: 0 0 auto;\\n -ms-flex: 0 0 auto; /* For IE10 */\\n}\\n\\n.mat-body {\\n font-family: 'Work Sans', sans-serif;\\n font-size: 14px;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL2xlZ2VuZHN0eWxlcy5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBLDZDQUE2Qzs7QUFDN0M7RUFDRSw4QkFBOEI7RUFDOUIsV0FBVztFQUNYLFdBQVc7RUFDWCxzQkFBc0I7RUFDdEIsVUFBVTtBQUNaOztBQUVBLGlEQUFpRDs7QUFDakQ7RUFDRSxzQkFBc0I7RUFDdEIsMEJBQTBCLEVBQUUsYUFBYTtFQUN6QyxhQUFhO0VBQ2Isb0JBQW9CLEVBQUUsYUFBYTtFQUNuQyxZQUFZO0VBQ1osZ0JBQWdCLEVBQUUsYUFBYTtBQUNqQzs7QUFFQTtFQUNFLGNBQWM7RUFDZCxrQkFBa0IsRUFBRSxhQUFhO0FBQ25DOztBQUVBO0VBQ0Usb0NBQW9DO0VBQ3BDLGVBQWU7QUFDakIiLCJmaWxlIjoic3JjL2FwcC9jYXJkdHlwZXMvbGVnZW5kc3R5bGVzLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5sZWdlbmQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIFRoaXMgaXMgdGhlIGNvbG9yIHN3YXRjaCBmb3IgdGhlIGxlZ2VuZHMuKi9cbi5sZWdlbmQgc3BhbiB7XG4gIGJvcmRlci1zdHlsZTogc29saWQgIWltcG9ydGFudDtcbiAgaGVpZ2h0OiA3cHg7XG4gIG1hcmdpbjogM3B4O1xuICB2ZXJ0aWNhbC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogN3B4O1xufVxuXG4vKiBUaGlzIGlzIGEgc3BlY2lmaWMgc3R5bGUgZm9yIE11bHRpR3JhcGhDYXJkLiAqL1xuLmNvbnRlbnRzLWJsb2NrIHtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IC8qIEZvciBJRTEwICovXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94OyAvKiBGb3IgSUUxMCAqL1xuICBmbGV4OiAxIDEgMCU7XG4gIC1tcy1mbGV4OiAxIDEgMCU7IC8qIEZvciBJRTEwICovXG59XG5cbi5heGlzIHtcbiAgZmxleDogMCAwIGF1dG87XG4gIC1tcy1mbGV4OiAwIDAgYXV0bzsgLyogRm9yIElFMTAgKi9cbn1cblxuLm1hdC1ib2R5IHtcbiAgZm9udC1mYW1pbHk6ICdXb3JrIFNhbnMnLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG59Il19 */\"","module.exports = \"\\n.card-error {\\n white-space: pre-wrap;\\n word-break: break-all;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2FyZHR5cGVzL211bHRpZ3JhcGhjYXJkL211bHRpZ3JhcGhjYXJkLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBO0VBQ0UscUJBQXFCO0VBQ3JCLHFCQUFxQjtBQUN2QiIsImZpbGUiOiJzcmMvYXBwL2NhcmR0eXBlcy9tdWx0aWdyYXBoY2FyZC9tdWx0aWdyYXBoY2FyZC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiXG4uY2FyZC1lcnJvciB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuIl19 */\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// tslint:disable-next-line:max-line-length\nimport {Component, EventEmitter, Input, OnChanges, OnInit, Output, QueryList, SimpleChanges, ViewChildren} from '@angular/core';\nimport * as Color from 'color';\nimport {DateTime, Interval} from 'luxon';\nimport {GraphData} from 'src/app/graphs/graphdatatypes/graphdata';\nimport {LabeledSeries} from 'src/app/graphs/graphdatatypes/labeled-series';\nimport {AxisGroup} from 'src/app/graphs/graphtypes/axis-group';\nimport {LegendInfo} from 'src/app/graphs/graphtypes/legend-info';\nimport {recordGoogleAnalyticsEvent} from 'src/constants';\n\nimport {ChartType, GraphComponent} from '../../graphs/graphtypes/graph/graph.component';\nimport {LineGraphComponent} from '../../graphs/graphtypes/linegraph/linegraph.component';\nimport * as Colors from '../../theme/verily_colors';\n\n/**\n * This card holds a label, one or more graphs on one or more axes, and a\n * dragger handle.\n */\n@Component({\n selector: 'app-multigraphcard',\n styleUrls: ['../legendstyles.css', './multigraphcard.component.css'],\n templateUrl: './multigraphcard.html',\n})\nexport class MultiGraphCardComponent implements OnChanges, OnInit {\n /** The GraphComponents this card holds. */\n @ViewChildren(GraphComponent)\n containedGraphs!: QueryList>;\n\n @Input() id: string;\n\n /**\n * The date range to use for graphs in this card\n */\n @Input() dateRange: Interval;\n\n /**\n * The AxisGroup displayed on this card.\n */\n @Input() axisGroup: AxisGroup;\n\n /**\n * The format of each object in the array is an object representing a line\n * drawn on the chart, that has a value, text, and class field. The value\n * field represents the x-position of the line to be drawn, while the class\n * represents the class name, and the text represents the text displayed near\n * the line.\n */\n @Input() eventlines: Array<{[key: string]: number | string}>;\n\n /** The x-regions to draw for this graph. */\n xRegions: Array<[DateTime, DateTime]>;\n\n /** Propogate remove events up to the card container. */\n @Output() removeEvent = new EventEmitter();\n\n /**\n * The label for this graphcard.\n */\n label: string;\n\n /**\n * The units text for this card. Blank if the axes have more than one unit.\n */\n unitsLabel = '';\n\n /** Holds the color corresponding to this card. */\n color: Color = Colors.BLUE_GREY_500; // Default color for a card component.\n\n /** Hold an instance of this enum so the HTML template can reference it. */\n ChartType: typeof ChartType = ChartType;\n\n /**\n * Maps legend categories to the corresponding series so that when you hover\n * over a legend category, it can highlight all the corresponding series.\n */\n readonly legendToSeries = new Map();\n\n /**\n * Sets up the class variables that are dependent on the @Input parameter to\n * this component, resourceCodeGroups.\n * @throws An Error if ResourceCodeGroups is undefined or contains mixed\n * clinical concepts.\n */\n ngOnInit() {\n if (!this.axisGroup) {\n throw Error(\n 'All MultiGraphCardComponents are expected to have an AxisGroup ' +\n ' as the data source, but none provided for card id ' + this.id);\n }\n this.label = this.axisGroup.label;\n this.color = this.axisGroup.displayGroup.fill;\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const dateRange = changes.dateRange;\n if (dateRange && dateRange.previousValue !== dateRange.currentValue) {\n this.loadNewData();\n }\n }\n\n private addSeriesToLegendMap(series: LabeledSeries) {\n // We do not want to add the normalBound series to the legend\n if (series.legendInfo.label ===\n LineGraphComponent.NORMAL_BOUND_SERIES_NAME) {\n return;\n }\n if (!this.legendToSeries.has(series.legendInfo)) {\n this.legendToSeries.set(series.legendInfo, []);\n }\n const added: LabeledSeries[] = this.legendToSeries.get(series.legendInfo);\n added.push(series);\n\n this.legendToSeries.set(series.legendInfo, added);\n }\n\n private loadNewData() {\n Promise\n .all(this.axisGroup.axes.map(\n axis => axis.updateDateRange(this.dateRange)))\n .then(axisData => {\n this.getLabelText().then(lblText => {\n this.unitsLabel = lblText;\n });\n\n // Gather a list of all the unique legends and series displayed.\n this.legendToSeries.clear();\n for (const data of axisData) {\n for (const series of data.series) {\n this.addSeriesToLegendMap(series);\n }\n }\n\n // Kick off the promise to get all the x-regions. It will update\n // the class variable and then everything bound to it will update,\n // too.\n this.getAllXRegions();\n });\n }\n\n /**\n * Gets the label text for this card. If the axes have all matching units,\n * it returns the units; otherwise it returns a blank string.\n */\n private getLabelText(): Promise {\n return Promise\n .all(this.axisGroup.axes.map(\n axis => axis.updateDateRange(this.dateRange)))\n .then(dataArray => dataArray.map(data => data.series))\n .then(seriesNestedArray => {\n const flattened: LabeledSeries[] = [].concat(...seriesNestedArray);\n return flattened.map(series => series.unit)\n .filter(v => v !== undefined);\n })\n .then(allUnits => {\n const units = new Set(allUnits);\n if (units.size === 1 && allUnits[0] !== undefined) {\n return ' (' + allUnits[0] + ')';\n } else {\n this.updateAxisLabels();\n return '';\n }\n });\n }\n\n /**\n * Gets all the X regions for the axes contained in this group.\n */\n private getAllXRegions() {\n return Promise.all(this.axisGroup.axes.map(axis => axis.getXRegions()))\n .then(nestedXRegions => {\n this.xRegions = [].concat(...nestedXRegions);\n });\n }\n\n /**\n * If the axes on this card have different units, make sure that each\n * axis displays its units on the y-axis, for clarity.\n */\n private updateAxisLabels() {\n for (const axis of this.axisGroup.axes) {\n axis.updateDateRange(this.dateRange).then(axisData => {\n if (axisData && axis.label && axisData.series &&\n axisData.series.length > 0 && axisData.series[0].unit) {\n const units = ' (' + axisData.series[0].unit + ')';\n // Only add units if not done so already.\n if (axis.label.indexOf(units) === -1) {\n axis.label += units;\n }\n }\n });\n }\n }\n\n /**\n * Returns true if any of the LabeledSeries passed in has a datapoint\n * in the time range.\n * This is just a convenience function because this can't be evaluated\n * directly in the Angular template.\n */\n hasData(labeledSeries: LabeledSeries[]) {\n return labeledSeries.map(s => s.hasPointInRange(this.dateRange))\n .some(s => s === true);\n }\n\n /**\n * Highlights the listed series in any graph they appear in for this card.\n */\n focusOnSeries(labeledSeries: LabeledSeries[]) {\n this.containedGraphs.forEach(graph => {\n graph.focusOnSeries(labeledSeries);\n });\n }\n\n /**\n * Removes highlight from any series on this card.\n */\n resetChart() {\n this.containedGraphs.forEach(graph => {\n graph.resetChart();\n });\n }\n\n // The events below need to get propogated up to the card container.\n\n /**\n * Called when the user clicks the trashcan button on the card.\n */\n remove() {\n // We do not add a 'value' field because there is no internal value that\n // needs to be restored when the user reverts a deletion.\n this.removeEvent.emit({id: this.id});\n recordGoogleAnalyticsEvent('deleteConcept', 'deleteCard', this.label);\n }\n}\n","module.exports = \"\\n 1\\\" class=\\\"legends-block\\\">\\n \\n
\\n \\n \\n
{{series.key.label}}
\\n
\\n
\\n
\\n
\\n
\\n \\n \\n \\n errorError loading data for: {{axis.label}}. Please check the PowerChart for correct\\n information.\\n Technical details:
{{axis.errorMessage}}\\n
\\n \\n 1 ? axis.label : ''\\\" [showTicks]=\\\"axis.showTicks\\\">\\n 1 ? axis.label : ''\\\" [showTicks]=\\\"axis.showTicks\\\">\\n 1 ? axis.label : ''\\\">\\n \\n 1 ? axis.label : ''\\\">\\n \\n 1 ? axis.label : ''\\\">\\n \\n \\n
\\n
\\n
\"","module.exports = \"\\n \\n \\n \\n {{getHintText()}} \\n \\n \\n\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, ElementRef, EventEmitter, Inject, Input, Output, ViewChild} from '@angular/core';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * A Material Card that displays a label, a textbox, and a draggable handle\n * in a row.\n */\n@Component({\n selector: 'app-textboxcard',\n templateUrl: './textboxcard.component.html',\n})\nexport class TextboxcardComponent {\n @ViewChild('textArea') textAreaElement: ElementRef;\n @Input() id: string;\n\n /** Propogate remove events up to the card container. */\n @Output() removeEvent = new EventEmitter();\n\n // Holds the text typed in the input field of the textbox.\n @Input() noteString: string;\n\n inEditMode = false;\n\n\n constructor(@Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n updateValue() {\n this.textAreaElement.nativeElement.innerHTML = this.noteString;\n }\n\n // The events below need to get propogated up to the card container.\n\n // Called when the user clicks the trashcan button on the card.\n remove() {\n // We pass a 'value' field with the contents of the textbox so that, in case\n // of restoration of a deleted textbox, the previous value can be displayed.\n this.removeEvent.emit({id: this.id, value: this.noteString});\n\n recordGoogleAnalyticsEvent(\n 'deleteTextbox', 'deleteCard', new Date().toDateString());\n }\n\n edit() {\n this.inEditMode = true;\n }\n\n save() {\n this.inEditMode = false;\n }\n\n getHintText() {\n if (this.inEditMode) {\n return this.uiConstants.SAVE_TEXT_HINT;\n } else {\n return this.uiConstants.EDIT_TEXT_HINT;\n }\n }\n}\n","import {Interval} from 'luxon';\n\nimport {AnnotatedObservation} from '../fhir-resources/annotated/annotated-observation';\nimport {AnnotatedMedicationOrder} from '../fhir-resources/medication-order';\nimport {Observation} from '../fhir-resources/observation';\nimport {LOINCCodeGroup} from './resource-codes/loinc-code';\nimport {RxNormCodeGroup} from './resource-codes/rx-norm-group';\n\n/**\n * Returns the function to annotate a Blood Pressure Resource group with\n * a Blood Pressure Location.\n *\n * @param The LOINCCodeGroup for the 'Blood Pressure Details' group\n */\nfunction getBloodPressureAnnotationFunction(\n bpDetailsResourceGroup: LOINCCodeGroup) {\n return (observation: Observation,\n dateRange: Interval): Promise => {\n return bpDetailsResourceGroup.getResourceSet(dateRange).then(obsSet => {\n return AnnotatedObservation.forBloodPressure(\n observation,\n // We only pass in the first ObservationSet, since we\n // know there is only one code whose observations we\n // care about.\n obsSet[0]);\n });\n };\n}\n\n/**\n * Returns the function to annotate a Medication Monitoring Resource group with\n * Medication Administration information.\n *\n * @param The RxNormCode for the Medication Resource group\n */\nfunction getMedicationMonitoringAnnotationFunction(\n rxNormGroup: RxNormCodeGroup) {\n return (observation: Observation,\n dateRange: Interval): Promise => {\n return rxNormGroup.getResourceSet(dateRange).then(rxNorms => {\n const medOrders: AnnotatedMedicationOrder[] = [].concat.apply(\n [], rxNorms.map(rxNorm => rxNorm.orders.resourceList));\n return AnnotatedObservation.forMedicationMonitoring(\n observation, medOrders);\n });\n };\n}\n\n/**\n * List of Configurations for Resource Groups that should have a makeAnnotated\n * function set.\n *\n * Each element in the list should be a JSON object with the following\n * properties:\n * - groupName: should be the name of the ResourceCodeGroup that should have\n * its makeAnnotated attribute set.\n * - makeAnnotatedFunction: a function that takes a reference\n * ResourceCodeGroup and returns a function that should be assigned to the\n * makeAnnotated attribute.\n * - refGroup: the name of the ResourceCodeGroup that needs to be referenced\n * in order to create the makeAnnotated attribute function.\n *\n */\nexport const ANNOTATION_CONFIGURATION = [\n {\n 'groupName': 'Blood Pressure',\n 'makeAnnotatedFunction': (refGroup) =>\n getBloodPressureAnnotationFunction(refGroup),\n 'refGroup': 'Blood Pressure Details'\n },\n {\n 'groupName': 'Vancomycin',\n 'makeAnnotatedFunction': (refGroup) =>\n getMedicationMonitoringAnnotationFunction(refGroup),\n 'refGroup': 'Vancomycin Monitoring Reference'\n },\n {\n 'groupName': 'Gentamicin',\n 'makeAnnotatedFunction': (refGroup) =>\n getMedicationMonitoringAnnotationFunction(refGroup),\n 'refGroup': 'Gentamicin Monitoring Reference'\n }\n];\n","import {antibiotics, antifungals, antivirals, labResult, microbio, radiology, vitalSign} from './resource-codes/display-grouping';\n\n/**\n * Holds information for where the JSON files defining groupings and individual\n * clinical concepts are.\n */\nexport class ConceptFileConfiguration {\n /**\n * Map from DisplayGrouping to a tuple of file names that describe the groups\n * and concepts that belong to that grouping.\n * First file is the Group json file. Second file is the Concept json file.\n * These files should be located within the directory of the assetPath.\n */\n readonly fileMap;\n\n /**\n * The path to where all these files can be found.\n */\n readonly assetPath;\n\n constructor(\n private conceptsFolder = 'clinical_concept_configuration',\n\n vitalGroupFile = 'vital_sign_groups.json',\n vitalConceptsFile = 'vital_signs.json',\n\n labConceptsFile = 'lab_results.json', labGroupFile = 'lab_groups.json',\n\n radiologyConceptsFile = 'radiology_results.json',\n radiologyGroupFile = 'radiology_groups.json',\n\n antibioticConceptsFile = 'medications_antibiotics.json',\n antibioticGroupFile = 'medication_groups_antibiotics.json',\n\n antiviralConceptsFile = 'medications_antivirals.json',\n antiviralGroupFile = 'medication_groups_antivirals.json',\n\n antifungalConceptsFile = 'medications_antifungals.json',\n antifungalGroupFile = 'medication_groups_antifungals.json',\n\n microbioGroupFile = 'microbio_groups.json',\n microbioConceptsFile = 'microbio_results.json') {\n this.fileMap = new Map([\n [vitalSign, [vitalGroupFile, vitalConceptsFile]],\n [labResult, [labGroupFile, labConceptsFile]],\n [radiology, [radiologyGroupFile, radiologyConceptsFile]],\n [antibiotics, [antibioticGroupFile, antibioticConceptsFile]],\n [antivirals, [antiviralGroupFile, antiviralConceptsFile]],\n [antifungals, [antifungalGroupFile, antifungalConceptsFile]],\n [microbio, [microbioGroupFile, microbioConceptsFile]]\n ]);\n\n this.assetPath = './assets/' + this.conceptsFolder;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nimport {HttpClient} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\n\nimport {ChartType} from '../graphs/graphtypes/graph/graph.component';\n\nimport {ConceptFileConfiguration} from './concept-file-configuration';\nimport {BCHMicrobioCode} from './resource-codes/bch-microbio-code';\nimport {DiagnosticReportCode} from './resource-codes/diagnostic-report-code';\nimport {antibiotics, antifungals, antivirals, DisplayGrouping, microbio, radiology} from './resource-codes/display-grouping';\nimport {LOINCCode} from './resource-codes/loinc-code';\nimport {ResourceCode} from './resource-codes/resource-code-group';\nimport {RxNormCode} from './resource-codes/rx-norm';\n\n\n/**\n * Holds basic configuration information for clinical concept groups.\n */\nexport class GroupConfiguration {\n constructor(\n readonly groupName: string, readonly chartType: ChartType,\n readonly showOnSameAxis: boolean,\n readonly displayGrouping: DisplayGrouping,\n readonly parentGroupName?: string) {}\n}\n\n/**\n * Responsible for reading in the configuration files defined in this\n * environment and parsing them into clinical concepts and their\n * corresponding groups.\n */\n@Injectable()\nexport class ResourceCodeCreator {\n constructor(\n private http: HttpClient,\n private conceptFileConfiguration: ConceptFileConfiguration) {}\n\n private static stringToChartType = {\n 'SCATTER': ChartType.SCATTER,\n 'STEP': ChartType.STEP,\n 'MICROBIO': ChartType.MICROBIO,\n 'DIAGNOSTIC': ChartType.DIAGNOSTIC,\n 'LINE': ChartType.LINE\n };\n\n\n private loadJsonForAllGroups: Promise> =\n Promise.all(\n Array.from(this.conceptFileConfiguration.fileMap).map((entry) => {\n const displayGroup: DisplayGrouping = entry[0];\n const groupFile: string = entry[1][0];\n\n return this.http\n .get(this.conceptFileConfiguration.assetPath + '/' + groupFile)\n .toPromise()\n .then(groups => {\n // Without explicit typing here, the TS compiler complains.\n const returned: [DisplayGrouping, any] =\n [displayGroup, groups];\n return returned;\n });\n }));\n\n private loadJsonForAllConcepts: Promise> =\n Promise.all(\n Array.from(this.conceptFileConfiguration.fileMap).map((entry) => {\n const displayGroup: DisplayGrouping = entry[0];\n const conceptsFile: string = entry[1][1];\n\n return this.http\n .get(\n this.conceptFileConfiguration.assetPath + '/' +\n conceptsFile)\n .toPromise()\n .then(clinicalConcepts => {\n // Without explicit typing here, the TS compiler complains.\n const returned: [DisplayGrouping, any] =\n [displayGroup, clinicalConcepts];\n return returned;\n });\n }));\n\n /**\n * Loads in configuration for all the display groupings, including the\n * grouping name, the chart type for the grouping, whether it's displayed\n * by default\n */\n loadAllGroups: Promise> =\n this.loadJsonForAllGroups\n .then((groupsList) => {\n return groupsList.map(\n group => this.createGroupConfigurations(group[0], group[1]));\n })\n // Return one flattened map for all the display groups regardless of\n // their file source.\n .then(\n (allMaps) =>\n new Map(allMaps.map((m) => Array.from(m))\n .reduce((acc, val) => [...acc, ...val])));\n\n\n\n loadAllConcepts: Promise> =\n this.loadAllGroups.then((groupMap: Map) => {\n return this.loadJsonForAllConcepts\n .then((conceptsList) => {\n return conceptsList.map(\n concept => this.createConcepts(concept[0], concept[1]));\n })\n .then((conceptsFromFile: Array>) => {\n // Reduce into one flattened map, allowing for mixing across\n // concept groups.\n const allConceptsMap = new Map();\n for (const mapEntry of conceptsFromFile) {\n for (const entry of Array.from(mapEntry.entries())) {\n const group = entry[0];\n let resourceCodes = entry[1];\n\n if (allConceptsMap.has(group)) {\n resourceCodes =\n resourceCodes.concat(allConceptsMap.get(group));\n }\n allConceptsMap.set(group, resourceCodes);\n }\n }\n\n // Match up the display groupings to their corresponding\n // group configurations.\n const groupConfigurationToResourceCodes =\n new Map();\n allConceptsMap.forEach(\n (concepts: ResourceCode[], groupName: string) => {\n let groupConfiguration = groupMap.get(groupName);\n // If there's no group configured for a clinical concept\n // list, and the configuration was validated before running,\n // we know that there is only one clinical concept in this\n // group and that the group should be configured according\n // to its attributes.\n if (!groupConfiguration) {\n groupConfiguration = new GroupConfiguration(\n groupName, ChartType.LINE, true,\n concepts[0].displayGrouping);\n }\n\n groupConfigurationToResourceCodes.set(\n groupConfiguration, concepts);\n });\n return groupConfigurationToResourceCodes;\n });\n });\n\n /**\n * Creates a ResourceCode. The type of ResourceCode is determined by the\n * passed in displayGrouping.\n *\n * @param displayGrouping DisplayGrouping for the ResourceCode\n * @param concept\n */\n private createResourceCode(displayGrouping: DisplayGrouping, concept: any) {\n const showByDefault = concept.showByDefault ? concept.showByDefault : false;\n const displayBounds: [number, number] = concept.displayBounds ?\n [concept.displayBounds.lower, concept.displayBounds.upper] :\n undefined;\n const forceDisplayBounds =\n concept.forceDisplayBounds ? concept.forceDisplayBounds : false;\n\n if (displayGrouping === radiology) {\n return new DiagnosticReportCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n } else if (displayGrouping === microbio) {\n return new BCHMicrobioCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n } else if ([antibiotics, antifungals, antivirals].includes(\n displayGrouping)) {\n return new RxNormCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n } else {\n return new LOINCCode(\n concept.codeString, displayGrouping, concept.displayName,\n showByDefault, displayBounds, forceDisplayBounds);\n }\n }\n\n /**\n * Reads in a JSON file and creates clinical concepts for each listed\n * configuration. Returns a map of listed display groupings to their\n * corresponding clinical concepts.\n */\n private createConcepts(displayGrouping: DisplayGrouping, json: any):\n Map {\n const groupToConcept = new Map();\n\n for (const concept of json) {\n const code = this.createResourceCode(displayGrouping, concept);\n // Concepts with innerComponentOnly=true are \"components\" of other\n // concepts. (See\n // http://hl7.org/fhir/DSTU2/observation-definitions.html#Observation.component\n // for more information.) In order for us to display these inner\n // components, the Resource Code needs to be created, but we do not\n // explicitly add them to a Resource Group.\n if (concept.innerComponentOnly) {\n continue;\n }\n // If the concept has no higher level grouping, then use its display\n // name as the proxy for its grouping.\n if (!concept.groupNames) {\n concept.groupNames = [concept.displayName];\n }\n\n for (const groupName of concept.groupNames) {\n const concepts = groupToConcept.get(groupName) || [];\n concepts.push(code);\n groupToConcept.set(groupName, concepts);\n }\n }\n return groupToConcept;\n }\n\n /**\n * Reads in a JSON file for display group configurations and maps\n * display group names to simple chart configuration attributes.\n */\n private createGroupConfigurations(\n displayGrouping: DisplayGrouping,\n json: any): Map {\n return json.map(\n group =>\n [group.groupName,\n new GroupConfiguration(\n group.groupName,\n ResourceCodeCreator.stringToChartType[group.graphType],\n group.displayGroupOnSameAxis, displayGrouping,\n group.parentGroupName)]);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\n\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {Axis} from '../graphs/graphtypes/axis';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ChartType} from '../graphs/graphtypes/graph/graph.component';\n\nimport {ANNOTATION_CONFIGURATION} from './annotation-mapping';\nimport {GroupConfiguration, ResourceCodeCreator} from './resource-code-creator';\nimport {BCHMicrobioCode, BCHMicrobioCodeGroup} from './resource-codes/bch-microbio-code';\nimport {DiagnosticReportCode, DiagnosticReportCodeGroup} from './resource-codes/diagnostic-report-code';\nimport {antibiotics, antifungals, antivirals, DisplayGrouping, labResult, microbio, radiology} from './resource-codes/display-grouping';\nimport {LOINCCodeGroup} from './resource-codes/loinc-code';\nimport {LOINCCode} from './resource-codes/loinc-code';\nimport {ResourceCode, ResourceCodeGroup} from './resource-codes/resource-code-group';\nimport {RxNormCode} from './resource-codes/rx-norm';\nimport {RxNormCodeGroup} from './resource-codes/rx-norm-group';\n\n// We declare a new LOINCCode referencing a DocumentReference, but do not\n// include it in the groupings below because it is not graphed/displayed in the\n// configuration sidebar.\nexport const documentReferenceLoinc =\n new LOINCCode('68608-9', undefined, 'Summary', true);\n\n/**\n * ResourceCodeManager is the centralized class where other components can\n * look to find an exhaustive listing of all the resource code groups that the\n * application may display.\n */\n@Injectable()\nexport class ResourceCodeManager {\n /** Keep the same group mapping across instances. */\n private static displayGroupMapping:\n Promise>;\n\n constructor(private sanitizer: DomSanitizer) {}\n\n /**\n * Determines ResourceCodeGroup type from the displayGrouping passed in.\n *\n * @param displayGrouping DisplayGroup to create ResourceCodeGroups with\n * @param fhirService FhirService to create ResourceCodeGroups with\n * @param chartType ChartType to create ResourceCodeGroups with\n * @param sameAxis Whether all the concepts should be shown on the same axis\n * or not.\n * @param groupName The label for the AxisGroup\n * @param conceptList List of concepts to be included in the AxisGroup.\n */\n private createResourceGroups(\n displayGrouping: DisplayGrouping, fhirService: FhirService,\n chartType: ChartType, sameAxis: boolean, groupName: string,\n conceptList: R[]): ResourceCodeGroup[] {\n const axisGroups = new Map();\n // if all concepts should be shown on the same axis, we only have one axis\n // that contains all concepts from the concept list.\n if (sameAxis) {\n axisGroups.set(groupName, conceptList);\n\n // otherwise we need an axis for each concept with the label being the\n // concept's label.\n } else {\n conceptList.forEach(concept => {\n axisGroups.set(concept.label, [concept]);\n });\n }\n\n const resourceGroups = new Array();\n axisGroups.forEach((concepts, label) => {\n let group;\n\n if (concepts[0] instanceof LOINCCode) {\n group = new LOINCCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n } else if (concepts[0] instanceof RxNormCode) {\n group = new RxNormCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n } else if (concepts[0] instanceof DiagnosticReportCode) {\n group = new DiagnosticReportCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n } else if (concepts[0] instanceof BCHMicrobioCode) {\n group = new BCHMicrobioCodeGroup(\n fhirService, label, concepts, displayGrouping, chartType);\n }\n if (group) {\n resourceGroups.push(group);\n }\n });\n return resourceGroups;\n }\n\n /**\n * Creates all AxisGroups.\n * @param resourceGroupMap Mapping from Axis Group label to the list of\n * ResourceCodeGroups that should be included in the axis group.\n * @param fhirService FhirService to create Axes with.\n * @param resourceCodeCreator ResourceCodeCreator to get the group\n * configurations\n * @returns List of AxisGroups\n */\n private createAxisGroups(\n resourceGroupMap: Map,\n fhirService: FhirService,\n resourceCodeCreator: ResourceCodeCreator): Promise {\n return resourceCodeCreator.loadAllGroups.then(groupConfigurationMapping => {\n // mapping of Axis group name to the list of axes in that group. Axes\n // may come from different resource Groups in the case of medications so\n // we need to keep track of the mapping and create the axis group after\n // creating all of the axes.\n const axisGroupMapping = new Map();\n resourceGroupMap.forEach((resourceGroupList, groupName) => {\n // some resources are creating only for the purpose of annotations.\n // These have an undefined chartType. We filter these resource groups\n // out because they should not be included in AxisGroups.\n const axes =\n resourceGroupList\n .filter(resourceGroup => resourceGroup.chartType !== undefined)\n .map(\n resourceGroup => new Axis(\n fhirService, this.sanitizer, resourceGroup,\n resourceGroup.label));\n if (axes.length > 0) {\n let axisGroupName = groupName;\n const groupConfig = groupConfigurationMapping.get(groupName);\n // if a Resource Group has a parent group (such as Medication\n // Administrations and Medication Monitoring), we want the Axis Group\n // name to be the parent group's name.\n if (groupConfig && groupConfig.parentGroupName) {\n axisGroupName = groupConfig.parentGroupName;\n }\n\n if (!axisGroupMapping.has(axisGroupName)) {\n axisGroupMapping.set(axisGroupName, new Array());\n }\n axisGroupMapping.get(axisGroupName).push(...axes);\n }\n });\n const axisGroups = new Array();\n axisGroupMapping.forEach((axisList, axisGroupName) => {\n // if the group is in the group configuration mapping, we use that\n // display group. Otherwise we leave the display group to be inferred\n // during AxisGroup creation.\n const displayGroup = groupConfigurationMapping.has(axisGroupName) ?\n groupConfigurationMapping.get(axisGroupName).displayGrouping :\n undefined;\n axisGroups.push(new AxisGroup(axisList, axisGroupName, displayGroup));\n });\n return axisGroups;\n });\n }\n\n /**\n * Creates a mapping of group names to a list of ResourceCodeGroups.\n * Creates all ResourceCodes and ResourceCodeGroups according to the\n * ResourceCodeCreator.\n *\n * @param fhirService the FhirService instance to create ResourceCodeGroups\n * with.\n * @param resourceCodeCreator: ResourceCodeCreator instance\n * @returns Promise that when resolves gives a mapping from group name to\n * the list of ResourceCodeGroups in that group.\n */\n private getResourceCodeGroups(\n fhirService: FhirService, resourceCodeCreator: ResourceCodeCreator):\n Promise> {\n return resourceCodeCreator.loadAllConcepts.then(\n (groupConfigurationToResourceCodes) => {\n const groupNameToResourceGroups =\n new Map();\n groupConfigurationToResourceCodes.forEach(\n (codeList: R[], config: GroupConfiguration) => {\n const resourceGroups = this.createResourceGroups(\n config.displayGrouping, fhirService, config.chartType,\n config.showOnSameAxis, config.groupName, codeList);\n groupNameToResourceGroups.set(config.groupName, resourceGroups);\n });\n return groupNameToResourceGroups;\n });\n }\n\n /**\n * Annotates ResourceCodeGroups that require additional information.\n * All ResourceCodeGroups need to be created before this method is called,\n * otherwise the group to annotate or the reference group may not be\n * created yet.\n * @param: List of all ResourceCodeGroups that were created.\n */\n annotateResourceGroups(resourceGroups: Map) {\n for (const annotation of ANNOTATION_CONFIGURATION) {\n const groups = resourceGroups.get(annotation.groupName);\n const refGroup = resourceGroups.get(annotation.refGroup);\n if ((!groups || !refGroup) || (refGroup.length > 1)) {\n continue;\n }\n for (const group of groups) {\n // Right now we only support annotating LOINCCodeGroups; could be\n // extended in the future.\n if (group instanceof LOINCCodeGroup) {\n group.setMakeAnnotated(annotation.makeAnnotatedFunction(refGroup[0]));\n }\n }\n }\n }\n\n /**\n * Returns a map where the key is a clinical concept group and the value is\n * a list of axis groups belonging to the clinical concept group.\n */\n getDisplayGroupMapping(\n fhirService: FhirService, resourceCodeCreator: ResourceCodeCreator):\n Promise> {\n if (!ResourceCodeManager.displayGroupMapping) {\n ResourceCodeManager.displayGroupMapping =\n this.getResourceCodeGroups(fhirService, resourceCodeCreator)\n .then((resourceGroupMap) => {\n this.annotateResourceGroups(resourceGroupMap);\n return this\n .createAxisGroups(\n resourceGroupMap, fhirService, resourceCodeCreator)\n .then(axisGroups => {\n const mapping = new Map();\n for (const group of axisGroups) {\n if (mapping.has(group.displayGroup)) {\n mapping.get(group.displayGroup).push(group);\n } else {\n mapping.set(group.displayGroup, [group]);\n }\n }\n return mapping;\n });\n });\n }\n return Promise.resolve(ResourceCodeManager.displayGroupMapping);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {AnnotatedMicrobioReport} from '../../fhir-resources/annotated/annotated-microbio-report';\nimport {MicrobioReport} from '../../fhir-resources/microbio-report';\nimport {FhirService} from '../../fhir-server/fhir.service';\n\nimport {AbstractResourceCodeGroup, ResourceCode} from './resource-code-group';\n\n/**\n * Represents one or more LOINC codes that should be displayed together. In the\n * case of multiple LOINC codes in a group, you should provide a label for that\n * group.\n */\nexport class BCHMicrobioCodeGroup extends\n AbstractResourceCodeGroup {\n /**\n * Gets a list of MicrobioReports corresponding to this code group. Each\n * item in the list has the same specimen type as the label of this group, and\n * each report's list of results has a code that is in this group's list of\n * codes.\n */\n getResourceFromFhir(dateRange: Interval): Promise {\n return this.fhirService.getMicrobioReports(this, dateRange)\n .then(\n reports =>\n reports.map(report => new AnnotatedMicrobioReport(report)));\n }\n\n formatRawResults(rawResults: AnnotatedMicrobioReport[]):\n Promise {\n const microbioReports = rawResults.map(result => result.report);\n return Promise.resolve(microbioReports);\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n * @override\n */\n dataAvailableInAppTimeScope(): Promise {\n return this.fhirService.microbioReportsPresentWithCodes(this, APP_TIMESPAN);\n }\n}\n\n/**\n * Holds BCHMicrobioCode codes. BCH provides a custom mapping for their\n * microbiology data since retrieving it is not yet supported in the Cerner\n * FHIR API implementation.\n */\nexport class BCHMicrobioCode extends ResourceCode {\n static readonly CODING_STRING = 'http://cerner.com/bch_mapping/';\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n // This is not an elegant way of implementing this function but since it's\n // a non-standard API server we aren't going to put much effort into\n // developing it further at this point.\n return fhirService.microbioReportsPresentWithCodes(\n new BCHMicrobioCodeGroup(\n fhirService, this.label, [this], undefined, undefined),\n APP_TIMESPAN);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {AnnotatedDiagnosticReport} from '../../fhir-resources/annotated/annotated-diagnostic-report';\nimport {FhirService} from '../../fhir-server/fhir.service';\n\nimport {AbstractResourceCodeGroup, ResourceCode} from './resource-code-group';\n\n/**\n * Represents one or more DiagnosticReport codes that should be displayed\n * together. In the case of multiple DiagnosticReport codes in a group, you\n * should provide a label for that group.\n */\nexport class DiagnosticReportCodeGroup extends AbstractResourceCodeGroup<\n AnnotatedDiagnosticReport, AnnotatedDiagnosticReport> {\n /**\n * Gets a list of AnnotatedDiagnosticReports corresponding to this code group.\n */\n getResourceFromFhir(dateRange: Interval):\n Promise {\n return this.fhirService.getAnnotatedDiagnosticReports(this, dateRange);\n }\n\n formatRawResults(rawResults: AnnotatedDiagnosticReport[]):\n Promise {\n return Promise.resolve(rawResults);\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n * @override\n */\n dataAvailableInAppTimeScope(): Promise {\n return this.fhirService.diagnosticReportsPresentWithCodes(\n this, APP_TIMESPAN);\n }\n}\n\n/**\n * Holds DiagnosticReport codes, which are technically LOINC codes. This is\n * not grouped with LOINC codes because Observations and DiagnosticReports\n * are inherently different in the Fhir and Cerner implementations.\n */\nexport class DiagnosticReportCode extends ResourceCode {\n static readonly CODING_STRING =\n 'http://hl7.org/fhir/dstu2/valueset-report-codes.html';\n // CODING_STRING could also equal http://loinc.org\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n // Currently utilizing code that is very similar to BCHMicrobioCode\n return fhirService.diagnosticReportsPresentWithCodes(\n new DiagnosticReportCodeGroup(\n fhirService, this.label, [this], undefined, undefined),\n APP_TIMESPAN);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport * as Color from 'color';\nimport * as Colors from '../../theme/verily_colors';\n\nexport const ALL_DISPLAY_GROUPS_MAP = new Map();\n\n/**\n * Represents the category that a certain chart's data might fall into, for\n * example a MedicationConcept such as \"Antibiotic\" or a ClinicalConcept such as\n * \"Lab result\"\n */\nexport class DisplayGrouping {\n static colorIdx = 0;\n fill: Color;\n outline: Color;\n\n constructor(readonly label: string, color?: Color, outline?: Color) {\n let tempColor: Color = color;\n if (color === undefined) {\n tempColor = Colors.getDataColors()[DisplayGrouping.colorIdx];\n DisplayGrouping.colorIdx =\n (DisplayGrouping.colorIdx + 1) % Colors.getDataColors().length;\n }\n this.fill = tempColor;\n this.outline = outline ? outline : tempColor;\n ALL_DISPLAY_GROUPS_MAP.set(label, this);\n }\n}\n\nexport const labResult = new DisplayGrouping('Lab Results', Colors.LIME);\nexport const vitalSign = new DisplayGrouping('Vital Signs', Colors.ORANGE);\nexport const antibiotics = new DisplayGrouping('Antibiotics', Colors.TURQUOISE);\nexport const antivirals = new DisplayGrouping('Antivirals', Colors.GOLD);\nexport const antifungals = new DisplayGrouping('Antifungals', Colors.GREEN);\nexport const microbio = new DisplayGrouping('Microbiology', Colors.CYAN);\n// We declare more DisplayGroupings related to Microbiology results that are\n// used to classify points on the Microbiology chart.\nexport const posPrelimMB = new DisplayGrouping(\n 'Check Result Preliminary', Color('#e4e2e2'), Colors.ABNORMAL);\nexport const negPrelimMB = new DisplayGrouping(\n 'Negative Preliminary', Color('#e4e2e2'), Colors.BLUE_A700);\nexport const posFinalMB =\n new DisplayGrouping('Check Result Final', Colors.ABNORMAL);\nexport const negFinalMB =\n new DisplayGrouping('Negative Final', Colors.BLUE_A700);\n// We declare DisplayGroupings that correspond to report statuses that we might\n// encounter rarely.\nexport const posOtherNB =\n new DisplayGrouping('Check Result, Other', Colors.DEEP_GOLD);\nexport const negOtherMB =\n new DisplayGrouping('Negative, Other', Colors.DEEP_GOLD);\n// Radiology Report categories\nexport const radiology = new DisplayGrouping('Radiology', Colors.PINK_900);\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {AnnotatedObservation} from '../../fhir-resources/annotated/annotated-observation';\nimport {Observation} from '../../fhir-resources/observation';\nimport {ObservationSet} from '../../fhir-resources/sets/observation-set';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport {ChartType} from '../../graphs/graphtypes/graph/graph.component';\n\nimport {DisplayGrouping} from './display-grouping';\nimport {ResourceCode} from './resource-code-group';\nimport {AbstractResourceCodeGroup} from './resource-code-group';\n\n/**\n * Holds LOINC codes.\n */\nexport class LOINCCode extends ResourceCode {\n static readonly CODING_STRING = 'http://loinc.org';\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n return fhirService.observationsPresentWithCode(this, APP_TIMESPAN);\n }\n}\n\n/**\n * Represents one or more LOINC codes that should be displayed together. In the\n * case of multiple LOINC codes in a group, you should provide a label for that\n * group.\n */\nexport class LOINCCodeGroup extends\n AbstractResourceCodeGroup {\n constructor(\n /** FHIR service for retrieving data */\n readonly fhirService: FhirService,\n /** The label for this resource code group. */\n readonly label: string,\n /** The resource codes to display on this Axis. */\n readonly resourceCodes: ResourceCode[],\n /** The display grouping for this resource code group. */\n readonly displayGrouping: DisplayGrouping,\n /** The chart type for this Axis. */\n readonly chartType: ChartType,\n /**\n * The (optional) function that will make an observation into an\n * AnnotatedObservation so that the graph can show the appropriate\n * tooltip.\n */\n private makeAnnotated?: (observation: Observation, dateRange: Interval) =>\n Promise) {\n super(fhirService, label, resourceCodes, displayGrouping, chartType);\n }\n\n setMakeAnnotated(\n makeAnnotatedFunction: (observation: Observation, dateRange: Interval) =>\n Promise) {\n this.makeAnnotated = makeAnnotatedFunction;\n }\n\n /**\n * Gets one ObservationSet for each LOINCCode in the rawResults, and returns\n * a list of those ObservationSets.\n * @param rawResults: List of AnnotatedObservations to group into\n * ObservationSets\n * @returns: list of ObservationSets. One ObservationSet for each LOINCCode\n * found in the rawResults.\n */\n formatRawResults(rawResults: AnnotatedObservation[]):\n Promise {\n const mapObs = new Map();\n let maxPrecision = 0;\n for (const annotatedObservation of rawResults) {\n const observation = annotatedObservation.observation;\n // From this point on, each observation should have a value,\n // result, or interpretation. All observations that just had\n // innerComponents have been flattened out.\n let obsList = mapObs.get(observation.label);\n if (!obsList) {\n obsList = new Array();\n }\n obsList.push(annotatedObservation);\n if (observation.precision > maxPrecision) {\n maxPrecision = observation.precision;\n }\n mapObs.set(observation.label, obsList);\n }\n this.precision = maxPrecision;\n const doubleAnnotationArray = Array.from(mapObs.values());\n\n return Promise.all(doubleAnnotationArray.map(\n singleAnnotationArray =>\n Promise.all(singleAnnotationArray)\n .then(\n resolvedAnnotations =>\n new ObservationSet(resolvedAnnotations))));\n }\n\n /**\n * Gets list of Observations from the FHIR server and makes them annotated\n * if makeAnnotated function is defined.\n * If an Observation contains \"inner components\", this returns separate\n * Observations for those.\n * @param dateRange: date range to get results from FHIR for\n * @returns: List of Annotated Observations\n */\n getResourceFromFhir(dateRange: Interval): Promise {\n return this.fhirService.getObservationsForCodeGroup(this, dateRange)\n .then(\n observationDoubleArray => {\n // Unnest the inner and outer observations into one flattened\n // array per concept group.\n return observationDoubleArray.map(\n obsSingleArray =>\n Array.from(obsSingleArray)\n .reduce((acc: Observation[], observation) => {\n // The outer component may not have a\n // value or result.\n if (observation.value || observation.result ||\n observation.interpretation) {\n acc.push(observation);\n }\n // Add separate ObservationLists for\n // each inner component.\n if (observation.innerComponents.length > 0) {\n for (const innerComponent of\n observation.innerComponents) {\n acc.push(innerComponent);\n }\n }\n return acc;\n }, []));\n },\n rejection => {\n // If there is any error with constructing an Observation for any\n // code in this code group, throw the error.\n throw rejection;\n })\n .then(flattened => {\n const resultList = new Array>();\n flattened.forEach(conceptList => {\n for (const observation of conceptList) {\n if (this.makeAnnotated) {\n resultList.push(this.makeAnnotated(observation, dateRange));\n } else {\n resultList.push(\n Promise.resolve(new AnnotatedObservation(observation)));\n }\n }\n });\n return Promise.all(resultList);\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\n\nimport {TimestampedObject} from '../../fhir-resources/sets/fhir-resource-set';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport {ChartType} from '../../graphs/graphtypes/graph/graph.component';\nimport {DisplayGrouping} from './display-grouping';\n\n/**\n * A code specifying the medication or observation type as well as the specific\n * medication or observation.\n */\nexport abstract class ResourceCode {\n /**\n * The string that holds the FHIR address for the coding system. Every\n * extending class should override this constant, although there is no way\n * we can syntactically enforce this in Typescript.\n */\n static readonly CODING_STRING;\n\n private static readonly CODE_STRING_TO_CODE:\n {[code: string]: ResourceCode} = {};\n\n static fromCodeString(code: string): ResourceCode {\n return ResourceCode.CODE_STRING_TO_CODE[code];\n }\n\n constructor(\n readonly codeString: string, readonly displayGrouping: DisplayGrouping,\n readonly label: string, readonly showByDefault = false,\n /* Absolute axis bounds for the graph displaying this ResourceCode. */\n readonly displayBounds?: [number, number],\n /* Whether or not to force the axis bounds, even if a smaller range\n containing all the data can be calculated. */\n readonly forceDisplayBounds = false) {\n const matchingCode = ResourceCode.CODE_STRING_TO_CODE[codeString];\n if (matchingCode && matchingCode.label !== label) {\n throw Error(\n 'A Resource Code has already been created with this code string but a different label: ' +\n codeString);\n }\n ResourceCode.CODE_STRING_TO_CODE[codeString] = matchingCode || this;\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n */\n abstract dataAvailableInAppTimeScope(fhirService: FhirService):\n Promise;\n}\n\n/**\n * A class that holds a group of resource codes that should be displayed on\n * the same Axis together.\n */\nexport class ResourceCodeGroup {\n /* Whether or not to show this ResourceCodeGroup by default. This is true\n * when any ResourceCode in the group should be shown as default.*/\n readonly showByDefault: boolean;\n\n // The number of decimal places to show for any value associated with this\n // resource group. The default is 0, to minimize errors caused by unnecessary\n // trailing zeros.\n precision = 0;\n\n /**\n * When we've decided whether this resource code group has data available\n * in the app, it doesn't change over the course of the app lifetime, so we\n * cache it.\n */\n resolvedDataAvailableInAppTimeScope: boolean = undefined;\n\n constructor(\n readonly fhirService: FhirService,\n /** The label for this resource code group. */\n readonly label: string,\n /** The resource codes to display on this Axis. */\n readonly resourceCodes: ResourceCode[],\n /** The display grouping for this resource code group. */\n readonly displayGrouping: DisplayGrouping,\n /** The chart type for this Axis. */\n readonly chartType: ChartType) {\n this.showByDefault = this.resourceCodes.some(code => code.showByDefault);\n }\n\n /**\n * Returns whether there is any data available for this ResourceCode within\n * the fixed timescope of this app.\n */\n dataAvailableInAppTimeScope(): Promise {\n if (this.resolvedDataAvailableInAppTimeScope !== undefined) {\n return Promise.resolve(this.resolvedDataAvailableInAppTimeScope);\n }\n return Promise\n .all(this.resourceCodes.map(\n rc => rc.dataAvailableInAppTimeScope(this.fhirService)))\n .then(bools => {\n this.resolvedDataAvailableInAppTimeScope =\n bools.reduce((result, next) => result = result || next);\n return this.resolvedDataAvailableInAppTimeScope;\n });\n }\n}\n\nexport abstract class AbstractResourceCodeGroup<\n T, R extends TimestampedObject> extends ResourceCodeGroup {\n /**\n * Looks in the cache to see if data for this time interval exists. If not,\n * calls the implementing class's getResourceFromFhir function and caches\n * its data, then returns the data for the given time interval.\n */\n getResourceSet(dateRange: Interval): Promise {\n return this.getResourceFromFhir(dateRange).then(rawResults => {\n return this.formatRawResults(rawResults);\n });\n }\n\n /**\n * Formats raw results from the cache to results expected by the rendering\n * code.\n *\n * Note: This should really be a private method and never called by anything\n * except for getResourceSet. Since it is abstract though, we cannot make it\n * private.\n *\n * @param rawResults raw results from the cache that should be formatted.\n */\n abstract formatRawResults(rawResults: R[]): Promise;\n\n /**\n * This function should make the FHIR calls to get promises for the\n * resources corresponding to this resource code group.\n */\n abstract getResourceFromFhir(dateRange: Interval): Promise;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Interval} from 'luxon';\n\nimport {MedicationAdministration} from '../../fhir-resources/medication-administration';\nimport {AnnotatedMedicationOrder, MedicationOrder, MedicationOrderSet} from '../../fhir-resources/medication-order';\n\nimport {AbstractResourceCodeGroup} from './resource-code-group';\nimport {RxNormCode} from './rx-norm';\n\n/**\n * Represents one or more RxNorm codes that should be displayed together. In the\n * case of multiple RxNorm codes in a group, you should provide a label for that\n * group.\n */\nexport class RxNormCodeGroup extends\n AbstractResourceCodeGroup {\n medicationOrderCache = new Map();\n\n /**\n * Gets all Medication Administrations in this group from FHIR for the given\n * date range.\n * @param dateRange date range to get medication administrations for\n */\n getResourceFromFhir(dateRange: Interval):\n Promise {\n return this.fhirService.getMedicationAdministrationsWithCodeGroup(\n this, dateRange);\n }\n\n /**\n * Fills out the order and administration information for each\n * RxNormCode in this group, and returns a list of the populated RxNormCodes.\n * This is a roundabout process because the Cerner implementation of the\n * FHIR standard doesn't allow for searching MedicationOrders by RxNorm code,\n * so we have to search for MedicationAdministrations by RxNorm code and work\n * up from there.\n */\n formatRawResults(rawResults: MedicationAdministration[]):\n Promise {\n const groupedByOrder = this.groupAdministrationsByOrderId(rawResults);\n return this.getMedicationOrdersAndMapToMed(groupedByOrder);\n }\n\n /**\n * Takes a list of lists of MedicationAdministrations and groups them by their\n * order IDs. Each list represents a set of MedicationAdministrations for a\n * specific RxNorm, but they're not arranged by order. For example:\n *\n * [[admin1_rxnorm1_orderA, admin2_rxnorm1_orderB, admin3_rxnorm1_orderB],\n * [admin1_rxnorm2_orderC, admin2_rxnorm2_orderC],\n * [admin1_rxnorm3_orderD]]\n *\n * would yield:\n *\n * {orderA: [admin1_rxnorm1_orderA],\n * orderB: [admin2_rxnorm1_orderB, admin3_rxnorm1_orderB],\n * orderC: [admin1_rxnorm2_orderC, admin2_rxnorm2_orderC],\n * orderD: [admin1_rxnorm3_orderD]\n * }\n * @param medAdmins A list of lists of MedicationAdministrations. See above.\n * @returns A map of order IDs to a list of corresponding\n * MedicationAdministrations.\n */\n private groupAdministrationsByOrderId(medAdmins: MedicationAdministration[]):\n Map {\n let groupedByOrder = new Map();\n // Group medication administrations by medication order.\n groupedByOrder = medAdmins.reduce(\n (groups: Map,\n medAdmin: MedicationAdministration) => {\n // Append this administration to whatever order list it belongs to.\n const orderId: string = medAdmin.medicationOrderId;\n if (!groups.has(orderId)) {\n groups.set(orderId, new Array());\n }\n groups.set(orderId, groups.get(orderId).concat(medAdmin));\n return groups;\n },\n // Use whatever existed in groupedByOrder prior to this iteration as\n // the basis for the reducer to add to.\n groupedByOrder);\n\n return groupedByOrder;\n }\n\n /**\n * Transforms a map with keys of MedicationOrder IDs and values of\n * MedicationAdministrations to a list of RxNormCodes, with the RxNormCodes\n * containing their corresponding MedicationOrders, and the medicationOrders\n * containing their corresponding MedicationAdministrations. For example:\n *\n * {orderA: [admin1_rxnorm1_orderA],\n * orderB: [admin2_rxnorm1_orderB, admin3_rxnorm1_orderB],\n * orderC: [admin1_rxnorm2_orderC, admin2_rxnorm2_orderC],\n * orderD: [admin1_rxnorm3_orderD]\n * }\n *\n * would yield:\n *\n * [RxNorm1 = {orders:\n * [OrderA {administrationsForOrder: [admin1_rxnorm1_orderA]},\n * OrderB {administrationsForOrder: [admin2_rxnorm1_orderB,\n * admin3_rxnorm1_orderB]}]}\n * RxNorm2 = {orders:\n * [OrderC {administrationsForOrder: [admin1_rxnorm2_orderC,\n * admin2_rxnorm2_orderC]}]}\n * RxNorm3 = {orders:\n * [OrderD {administrationsForOrder: [admin1_rxnorm3_orderD]}]}\n *\n * @param groupedByOrder A map with keys of MedicationOrder IDs and values of\n * MedicationAdministrations for those MedicationOrders.\n * @returns A list of RxNormCodes with orders populated\n * @throws Error if the incoming parameter has medication administrations that\n * did not come from the same order for the same med\n */\n private getMedicationOrdersAndMapToMed(\n groupedByOrder: Map):\n Promise {\n const allPromises = Array.from(groupedByOrder.keys()).map(orderId => {\n if (this.medicationOrderCache.has(orderId)) {\n return Promise.resolve(this.medicationOrderCache.get(orderId));\n } else {\n return this.fhirService.getMedicationOrderWithId(orderId).then(\n order => {\n this.medicationOrderCache.set(orderId, order);\n return order;\n },\n rejection => {\n // If there are any errors getting a MedicationOrder for\n // this RxNormCode[], throw the error.\n throw rejection;\n });\n }\n });\n\n // Resolve all the promises and set the corresponding orders for each\n // RxNorm.\n const groupedByMed = new Map();\n return Promise.all(allPromises)\n .then(orders => {\n orders.map(\n (order: MedicationOrder) => {\n const orderId = order.orderId;\n const medicationAdminsForOrder =\n Array.from(groupedByOrder.get(orderId).values());\n // Verify all the administrations have the same RxNormCode and\n // same Order ID.\n const rxNormCodeSet = new Set(\n medicationAdminsForOrder.map(admin => admin.rxNormCode));\n if (rxNormCodeSet.size !== 1) {\n throw Error(\n 'Administrations for order ' + orderId +\n ' are for multiple RxNorms: ' +\n Array.from(rxNormCodeSet.values()));\n }\n\n const orderSet = new Set(medicationAdminsForOrder.map(\n admin => admin.medicationOrderId));\n if (rxNormCodeSet.size !== 1) {\n throw Error(\n 'Administrations for order ' + orderId +\n ' report multiple order IDs: ' + Array.from(orderSet));\n }\n\n // Add the order to the map for the RxNorm code.\n const rxCode = rxNormCodeSet.values().next().value;\n const annotatedOrder = new AnnotatedMedicationOrder(\n order, medicationAdminsForOrder);\n if (groupedByMed.has(rxCode)) {\n groupedByMed.set(\n rxCode, groupedByMed.get(rxCode).concat(annotatedOrder));\n } else {\n groupedByMed.set(rxCode, new Array(annotatedOrder));\n }\n },\n rejection => {\n // If there are any errors constructing MedicationOrders for\n // this RxNormCode[], throw the error.\n throw rejection;\n });\n })\n .then(\n _ => {\n Array.from(groupedByMed.entries()).forEach(medEntry => {\n const rxNorm = medEntry[0];\n const medOrders = medEntry[1];\n rxNorm.orders = new MedicationOrderSet(medOrders);\n });\n // Return all the populated RxNorms.\n return Array.from(groupedByMed.keys());\n },\n rejection => {\n // If any promise is rejected, throw the same rejection.\n throw rejection;\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {APP_TIMESPAN} from 'src/constants';\n\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport * as Colors from '../../theme/verily_colors';\n\nimport {DisplayGrouping} from './display-grouping';\nimport {ResourceCode} from './resource-code-group';\n\nexport class MedicationConceptGroup extends DisplayGrouping {}\n\nexport const ANTIBIOTIC =\n new MedicationConceptGroup('Antibiotic', Colors.DEEP_TURQUOISE);\n\nexport const MEDICATION_GROUPS = [ANTIBIOTIC];\n\n/**\n * Holds RXNorm codes and orders corresponding to them.\n */\nexport class RxNormCode extends ResourceCode {\n static readonly CODING_STRING = 'http://www.nlm.nih.gov/research/umls/rxnorm';\n\n /* Contains a set of medication orders for this RxNorm code. */\n orders: MedicationOrderSet;\n\n dataAvailableInAppTimeScope(fhirService: FhirService): Promise {\n return fhirService.medicationsPresentWithCode(this, APP_TIMESPAN);\n }\n}\n","module.exports = \".configurationCard {\\n background-color: transparent;\\n border-left-style: solid;\\n border-left-width: 5px;\\n height: 40px !important;\\n padding: 3px;\\n}\\n\\n\\n.disableDragging {\\n color: gray;\\n cursor: not-allowed;\\n padding-top: 4px;\\n}\\n\\n\\n.listItem {\\n display: inline-block;\\n height: -webkit-fit-content;\\n height: -moz-fit-content;\\n height: fit-content;\\n padding-left: 5px !important;\\n}\\n\\n\\n.label {\\n height: -webkit-fit-content;\\n height: -moz-fit-content;\\n height: fit-content;\\n line-height: 15px;\\n}\\n\\n\\n.tinytext {\\n font-size: 12px;\\n line-height: 15px;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS1zZWxlY3Rvci1tZW51L2RhdGEtc2VsZWN0b3ItZWxlbWVudC9kYXRhLXNlbGVjdG9yLWVsZW1lbnQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLDZCQUE2QjtFQUM3Qix3QkFBd0I7RUFDeEIsc0JBQXNCO0VBQ3RCLHVCQUF1QjtFQUN2QixZQUFZO0FBQ2Q7OztBQUdBO0VBQ0UsV0FBVztFQUNYLG1CQUFtQjtFQUNuQixnQkFBZ0I7QUFDbEI7OztBQUVBO0VBQ0UscUJBQXFCO0VBQ3JCLDJCQUFtQjtFQUFuQix3QkFBbUI7RUFBbkIsbUJBQW1CO0VBQ25CLDRCQUE0QjtBQUM5Qjs7O0FBRUE7RUFDRSwyQkFBbUI7RUFBbkIsd0JBQW1CO0VBQW5CLG1CQUFtQjtFQUNuQixpQkFBaUI7QUFDbkI7OztBQUVBO0VBQ0UsZUFBZTtFQUNmLGlCQUFpQjtBQUNuQiIsImZpbGUiOiJzcmMvYXBwL2RhdGEtc2VsZWN0b3ItbWVudS9kYXRhLXNlbGVjdG9yLWVsZW1lbnQvZGF0YS1zZWxlY3Rvci1lbGVtZW50LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuY29uZmlndXJhdGlvbkNhcmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC13aWR0aDogNXB4O1xuICBoZWlnaHQ6IDQwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZzogM3B4O1xufVxuXG5cbi5kaXNhYmxlRHJhZ2dpbmcge1xuICBjb2xvcjogZ3JheTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgcGFkZGluZy10b3A6IDRweDtcbn1cblxuLmxpc3RJdGVtIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBoZWlnaHQ6IGZpdC1jb250ZW50O1xuICBwYWRkaW5nLWxlZnQ6IDVweCAhaW1wb3J0YW50O1xufVxuXG4ubGFiZWwge1xuICBoZWlnaHQ6IGZpdC1jb250ZW50O1xuICBsaW5lLWhlaWdodDogMTVweDtcbn1cblxuLnRpbnl0ZXh0IHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBsaW5lLWhlaWdodDogMTVweDtcbn1cbiJdfQ== */\"","module.exports = \"
\\n \\n \\n
\\n
\\n
\\n {{axisGroup.label}}\\n
\\n
\\n {{uiConstants.NO_DATA_AVAILABLE_TMPL + appTimeIntervalString}}\\n
\\n
\\n
\\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {AfterViewInit, Component, Inject, Input} from '@angular/core';\nimport {APP_TIMESPAN, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {AxisGroup} from '../../graphs/graphtypes/axis-group';\n\n/**\n * Represents one element in a list or menu of ResourceCodesForCards\n * that can be added to the main CardContainer.\n */\n@Component({\n selector: 'app-data-selector-element',\n templateUrl: './data-selector-element.component.html',\n styleUrls: ['./data-selector-element.component.css']\n})\nexport class DataSelectorElementComponent implements AfterViewInit {\n /**\n * The ResourceCodes for the card represented by this DataSelectorElement.\n */\n @Input() axisGroup: AxisGroup;\n\n /**\n * Hold an instance of the app time interval so we can display it in the HTML\n */\n readonly appTimeIntervalString = APP_TIMESPAN.start.toFormat('MM/dd/yyyy') +\n ' and ' + APP_TIMESPAN.end.toFormat('MM/dd/yyyy');\n\n /**\n * Whether there is data available within the app timespan for this card.\n */\n dataAvailable = true;\n\n constructor(@Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n ngAfterViewInit() {\n // We have to wait until after view initialization so that the @Input\n // element binding happens.\n this.axisGroup.dataAvailableInAppTimeScope().then(available => {\n this.dataAvailable = available;\n });\n }\n}\n","module.exports = \".addCardInline {\\n color: rgb(248, 248, 248);\\n display: inline-block;\\n opacity: 0.15;\\n transition: opacity 0.3s;\\n /* Needed so that there's not enough space between the cards to hold the icon,\\n just enough to hold the line placeholder.*/\\n margin-bottom:-17px;\\n margin-top:-17px;\\n display: flex;\\n display: -ms-flexbox; /* For IE10 */\\n flex-direction: row;\\n -ms-flex-direction: row; /* For IE10 */\\n align-content: center;\\n -ms-flex-line-pack: center; /* Align content: center conversion for IE10 */\\n justify-content: flex-start;\\n -ms-flex-pack: start; /* Justify content: start conversion for IE10 */\\n align-items: center;\\n -ms-flex-align: center; /* Align items: center conversion for IE10 */\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\nspan {\\n border: 2px dashed rgb(248, 248, 248);\\n /* Only outline the bottom instead of all four sides.*/\\n border-style: none none dotted;\\n display: inline-block;\\n flex: 1 1 0%;\\n -ms-flex: 1 1 0%; /* For IE10 */\\n}\\n\\n.addCardInline:hover {\\n opacity: 1;\\n}\\n\\n.conceptSelector {\\n padding-left: 0px !important;\\n padding-right: 0px !important;\\n min-width: 200px;\\n}\\n\\n.mainConceptSelector {\\n border-left-style: solid;\\n border-left-width: 5px;\\n}\\n\\n::ng-deep .mat-menu-item {\\n line-height: 20px !important;\\n}\\n\\n::ng-deep .mat-list-item-content {\\n margin-top: 8px;\\n}\\n\\n::ng-deep .mat-autocomplete-panel .mat-list-item-content {\\n margin-top: -8px; /* Styling for autocomplete menu items needs to be different.*/\\n}\\n\\n::ng-deep .mat-option {\\n height: -webkit-fit-content !important;\\n height: -moz-fit-content !important;\\n height: fit-content !important;\\n overflow: visible !important;\\n padding: 0px !important;\\n}\\n\\n.conceptForm {\\n margin-left: 10px;\\n margin-right: 10px;\\n}\\n\\n::ng-deep .autoMenu.mat-menu-panel {\\n min-width: 300px;\\n}\\n\\n.conceptFormField {\\n width: 100%;\\n}\\n\\nbutton {\\n font-family: 'Work Sans', sans-serif;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS1zZWxlY3Rvci1tZW51L2RhdGEtc2VsZWN0b3ItbWVudS5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UseUJBQXlCO0VBQ3pCLHFCQUFxQjtFQUNyQixhQUFhO0VBQ2Isd0JBQXdCO0VBQ3hCOzRDQUMwQztFQUMxQyxtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGFBQWE7RUFDYixvQkFBb0IsRUFBRSxhQUFhO0VBQ25DLG1CQUFtQjtFQUNuQix1QkFBdUIsRUFBRSxhQUFhO0VBQ3RDLHFCQUFxQjtFQUNyQiwwQkFBMEIsR0FBRyw4Q0FBOEM7RUFDM0UsMkJBQTJCO0VBQzNCLG9CQUFvQixHQUFHLCtDQUErQztFQUN0RSxtQkFBbUI7RUFDbkIsc0JBQXNCLEdBQUcsNENBQTRDO0VBQ3JFLFlBQVk7RUFDWixnQkFBZ0IsRUFBRSxhQUFhO0FBQ2pDOztBQUVBO0VBQ0UscUNBQXFDO0VBQ3JDLHNEQUFzRDtFQUN0RCw4QkFBOEI7RUFDOUIscUJBQXFCO0VBQ3JCLFlBQVk7RUFDWixnQkFBZ0IsRUFBRSxhQUFhO0FBQ2pDOztBQUVBO0VBQ0UsVUFBVTtBQUNaOztBQUVBO0VBQ0UsNEJBQTRCO0VBQzVCLDZCQUE2QjtFQUM3QixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx3QkFBd0I7RUFDeEIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGdCQUFnQixFQUFFLDhEQUE4RDtBQUNsRjs7QUFFQTtFQUNFLHNDQUE4QjtFQUE5QixtQ0FBOEI7RUFBOUIsOEJBQThCO0VBQzlCLDRCQUE0QjtFQUM1Qix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsV0FBVztBQUNiOztBQUVBO0VBQ0Usb0NBQW9DO0FBQ3RDIiwiZmlsZSI6InNyYy9hcHAvZGF0YS1zZWxlY3Rvci1tZW51L2RhdGEtc2VsZWN0b3ItbWVudS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmFkZENhcmRJbmxpbmUge1xuICBjb2xvcjogcmdiKDI0OCwgMjQ4LCAyNDgpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG9wYWNpdHk6IDAuMTU7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcztcbiAgLyogTmVlZGVkIHNvIHRoYXQgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIGJldHdlZW4gdGhlIGNhcmRzIHRvIGhvbGQgdGhlIGljb24sXG4gIGp1c3QgZW5vdWdoIHRvIGhvbGQgdGhlIGxpbmUgcGxhY2Vob2xkZXIuKi9cbiAgbWFyZ2luLWJvdHRvbTotMTdweDtcbiAgbWFyZ2luLXRvcDotMTdweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7IC8qIEZvciBJRTEwICovXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OyAvKiBGb3IgSUUxMCAqL1xuICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4gIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogQWxpZ24gY29udGVudDogY2VudGVyIGNvbnZlcnNpb24gZm9yIElFMTAgKi9cbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAtbXMtZmxleC1wYWNrOiBzdGFydDsgIC8qIEp1c3RpZnkgY29udGVudDogc3RhcnQgY29udmVyc2lvbiBmb3IgSUUxMCAqL1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAtbXMtZmxleC1hbGlnbjogY2VudGVyOyAgLyogQWxpZ24gaXRlbXM6IGNlbnRlciBjb252ZXJzaW9uIGZvciBJRTEwICovXG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbn1cblxuc3BhbiB7XG4gIGJvcmRlcjogMnB4IGRhc2hlZCByZ2IoMjQ4LCAyNDgsIDI0OCk7XG4gIC8qIE9ubHkgb3V0bGluZSB0aGUgYm90dG9tIGluc3RlYWQgb2YgYWxsIGZvdXIgc2lkZXMuKi9cbiAgYm9yZGVyLXN0eWxlOiBub25lIG5vbmUgZG90dGVkO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZsZXg6IDEgMSAwJTtcbiAgLW1zLWZsZXg6IDEgMSAwJTsgLyogRm9yIElFMTAgKi9cbn1cblxuLmFkZENhcmRJbmxpbmU6aG92ZXIge1xuICBvcGFjaXR5OiAxO1xufVxuXG4uY29uY2VwdFNlbGVjdG9yIHtcbiAgcGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDtcbiAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XG4gIG1pbi13aWR0aDogMjAwcHg7XG59XG5cbi5tYWluQ29uY2VwdFNlbGVjdG9yIHtcbiAgYm9yZGVyLWxlZnQtc3R5bGU6IHNvbGlkO1xuICBib3JkZXItbGVmdC13aWR0aDogNXB4O1xufVxuXG46Om5nLWRlZXAgLm1hdC1tZW51LWl0ZW0gIHtcbiAgbGluZS1oZWlnaHQ6IDIwcHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtbGlzdC1pdGVtLWNvbnRlbnQge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbjo6bmctZGVlcCAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LWxpc3QtaXRlbS1jb250ZW50IHtcbiAgbWFyZ2luLXRvcDogLThweDsgLyogU3R5bGluZyBmb3IgYXV0b2NvbXBsZXRlIG1lbnUgaXRlbXMgbmVlZHMgdG8gYmUgZGlmZmVyZW50LiovXG59XG5cbjo6bmctZGVlcCAubWF0LW9wdGlvbiB7XG4gIGhlaWdodDogZml0LWNvbnRlbnQgIWltcG9ydGFudDtcbiAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDtcbiAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XG59XG5cbi5jb25jZXB0Rm9ybSB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbjo6bmctZGVlcCAuYXV0b01lbnUubWF0LW1lbnUtcGFuZWwge1xuICBtaW4td2lkdGg6IDMwMHB4O1xufVxuXG4uY29uY2VwdEZvcm1GaWVsZCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG5idXR0b24ge1xuICBmb250LWZhbWlseTogJ1dvcmsgU2FucycsIHNhbnMtc2VyaWY7XG59Il19 */\"","module.exports = \"
\\n \\n \\n \\n
\\n\\n \\n \\n \\n \\n \\n \\n\\n\\n
\\n \\n \\n \\n \\n \\n
\\n \\n \\n \\n search\\n \\n \\n \\n \\n \\n \\n \\n
\\n
\\n \\n \\n \\n \\n
\\n \\n \\n \\n
\\n
\\n
\\n
\\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, OnInit, Output, ViewChild} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {MatAutocompleteTrigger, MatMenuTrigger} from '@angular/material';\nimport {Observable} from 'rxjs';\nimport {map, startWith} from 'rxjs/operators';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from '../conceptmappings/resource-code-manager';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {DisplayGrouping} from '../conceptmappings/resource-codes/display-grouping';\nimport {SetupDataService} from '../setup/setup-data.service';\n\n/**\n * Shows a button with expanding menus for selecting data elements to display.\n */\n@Component({\n selector: 'app-data-selector-menu',\n templateUrl: './data-selector-menu.component.html',\n styleUrls: ['./data-selector-menu.component.css']\n})\nexport class DataSelectorMenuComponent {\n /** The trigger for the main menu displayed. */\n @ViewChild(MatMenuTrigger) menuTrigger: MatMenuTrigger;\n /** The trigger for the autocomplete panel displayed. */\n @ViewChild(MatAutocompleteTrigger)\n autocompleteTrigger: MatAutocompleteTrigger;\n\n /**\n * An array of DisplayGroupings and AxisGroup that belong to that\n * grouping.\n */\n displayGroupings: Array<[DisplayGrouping, AxisGroup[]]>;\n\n /** An event that is emitted when the user requests to add a new card. */\n @Output() addCard = new EventEmitter();\n /** An event that is emitted when the user requests to add a textbox. */\n @Output() addTextbox = new EventEmitter();\n /**\n * An event that is emitted when the user requests to add a custom timeline.\n */\n @Output() addCustomTimeline = new EventEmitter();\n\n /** All AxisGroup that correspond to cards displayed on the page. */\n allConcepts: AxisGroup[];\n\n /**\n * The FormControl used to monitor changes in the user input of the\n * autocomplete field.\n */\n readonly conceptCtrl = new FormControl();\n filteredConcepts: Observable;\n\n constructor(\n setupDataService: SetupDataService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n setupDataService.displayGroupMapping.then((displayGroups) => {\n const temp = Array.from(displayGroups.values());\n this.allConcepts = [].concat.apply([], temp);\n this.displayGroupings = Array.from(displayGroups.entries());\n\n // Watch for changes to the user input on the autocomplete panel.\n this.filteredConcepts = this.conceptCtrl.valueChanges.pipe(\n startWith(\n ''), // The autocomplete input starts with nothing typed in.\n map(concept => concept ? this.filter(concept, this.allConcepts) :\n this.allConcepts.slice()));\n });\n }\n\n // Listens for an event indicating that the user has selected to add the\n // concept card from the top toolbar. The label for the card is sent as an\n // event to CardContainer.\n private addConceptCard(label: string) {\n this.addCard.emit(label);\n\n recordGoogleAnalyticsEvent('addConcept', 'addCard', label);\n }\n\n // Emits an event indicating to CardContainer to add a blank textbox at the\n // top of the page.\n private textbox() {\n this.addTextbox.emit();\n\n recordGoogleAnalyticsEvent(\n 'addTextbox', 'addCard', new Date().toDateString());\n }\n\n private customTimeline() {\n this.addCustomTimeline.emit();\n\n recordGoogleAnalyticsEvent(\n 'addCustomTimeline', 'addCard', new Date().toDateString());\n }\n\n // Filter the concepts shown on the autocomplete menu.\n filter(concept, allConcepts): AxisGroup[] {\n return allConcepts.filter(\n option =>\n option.label.toLowerCase().indexOf(concept.toLowerCase()) === 0);\n }\n\n // We close the menu after an option is selected by autocomplete.\n private closeMenus() {\n this.menuTrigger.closeMenu();\n this.autocompleteTrigger.closePanel();\n }\n\n // Listen for the event indicating that an option has been selected in the\n // autocomplete menu.\n private selectOption($event) {\n this.addConceptCard($event.option.value);\n this.closeMenus();\n }\n}\n","module.exports = \"
\\n Browser version: {{browserVersion}}
\\n Authentication information:
\\n URL Parameters: {{parameters}}
\\n\\n Errors surfaced:
\\n
\\n {{error}}\\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nimport 'fhirclient';\n\nimport {Component} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\n\nimport {DebuggerService} from './debugger.service';\n\n@Component({\n selector: 'app-debugger',\n templateUrl: './debugger.component.html',\n})\n\n/**\n * This debugger component surfaces errors stored in the debug service to the\n * UI.\n */\nexport class DebuggerComponent {\n browserVersion: string;\n parameters = new Array();\n\n constructor(\n readonly debugService: DebuggerService, private route: ActivatedRoute) {\n this.browserVersion = navigator.appVersion;\n\n this.route.queryParams.subscribe(params => {\n this.parameters.push(JSON.stringify(params));\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\n\n/**\n * This service accumulates any errors sent to it in the app into an array of\n * strings so that they can be surfaced in the UI.\n */\n@Injectable({providedIn: 'root'})\nexport class DebuggerService {\n errors: string[] = [];\n\n logError(error: string) {\n this.errors.push(error);\n }\n}\n","module.exports = \".previewSave {\\n background-color:#202020; /* GREY_900 */\\n display: -ms-flexbox;\\n display: flex;\\n padding: 15px;\\n width: 90%;\\n overflow: auto;\\n max-height: 80%;\\n /* Disable selecting/highlighting on the page. */\\n -webkit-touch-callout: none; /* iOS Safari */\\n -webkit-user-select: none; /* Safari */\\n -moz-user-select: none; /* Firefox */\\n -ms-user-select: none; /* Internet Explorer/Edge */\\n user-select: none; /* Chrome and Opera */\\n}\\n\\n::ng-deep .previewSave > * {\\n pointer-events: none !important;\\n}\\n\\n.mat-dialog-actions {\\n float: right;\\n}\\n\\nh1 {\\n font-family: 'Montserrat', sans-serif;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGlhbG9ncy9jb25maXJtLXNhdmUvY29uZmlybS1zYXZlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSx3QkFBd0IsRUFBRSxhQUFhO0VBQ3ZDLG9CQUFhO0VBQWIsYUFBYTtFQUNiLGFBQWE7RUFDYixVQUFVO0VBQ1YsY0FBYztFQUNkLGVBQWU7RUFDZixnREFBZ0Q7RUFDaEQsMkJBQTJCLEVBQUUsZUFBZTtFQUM1Qyx5QkFBeUIsRUFBRSxXQUFXO0tBQ25DLHNCQUFzQixFQUFFLFlBQVk7TUFDbkMscUJBQXFCLEVBQUUsMkJBQTJCO1VBQzlDLGlCQUFpQixFQUFFLHFCQUFxQjtBQUNsRDs7QUFFQTtFQUNFLCtCQUErQjtBQUNqQzs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLHFDQUFxQztBQUN2QyIsImZpbGUiOiJzcmMvYXBwL2RpYWxvZ3MvY29uZmlybS1zYXZlL2NvbmZpcm0tc2F2ZS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnByZXZpZXdTYXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjojMjAyMDIwOyAvKiBHUkVZXzkwMCAqL1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiAxNXB4O1xuICB3aWR0aDogOTAlO1xuICBvdmVyZmxvdzogYXV0bztcbiAgbWF4LWhlaWdodDogODAlO1xuICAvKiBEaXNhYmxlIHNlbGVjdGluZy9oaWdobGlnaHRpbmcgb24gdGhlIHBhZ2UuICovXG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsgLyogaU9TIFNhZmFyaSAqL1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyAvKiBTYWZhcmkgKi9cbiAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsgLyogRmlyZWZveCAqL1xuICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOyAvKiBJbnRlcm5ldCBFeHBsb3Jlci9FZGdlICovXG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7IC8qIENocm9tZSBhbmQgT3BlcmEgKi9cbn1cblxuOjpuZy1kZWVwIC5wcmV2aWV3U2F2ZSA+ICoge1xuICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4ubWF0LWRpYWxvZy1hY3Rpb25zIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuXG5oMSB7XG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG59Il19 */\"","module.exports = \"

\\n Save a static image of this page to a PowerChart clinical note?\\n

\\n
Preview:
\\n
\\n
\\n \\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {AfterViewInit, Component, Inject} from '@angular/core';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material';\n\n@Component({\n selector: 'app-confirm-save',\n templateUrl: './confirm-save.component.html',\n styleUrls: ['./confirm-save.component.css']\n})\nexport class ConfirmSaveComponent implements AfterViewInit {\n innerHtml: string;\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(MAT_DIALOG_DATA) readonly data: HTMLCanvasElement) {}\n\n ngAfterViewInit() {\n this.data.setAttribute('id', 'previewImg');\n this.data.setAttribute('style', 'width:500px');\n document.getElementById('previewCanvas').appendChild(this.data);\n }\n\n // The user does not wish to save the snapshot.\n onExit() {\n this.dialogRef.close();\n }\n\n // The user wishes to save the snapshot.\n onConfirm() {\n this.dialogRef.close({\n save: true,\n });\n }\n}\n","module.exports = \"

{{uiConstants.REMOVE_CARD}}

\\n
\\n \\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {MatDialogRef} from '@angular/material/dialog';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\n/**\n * Shows a dialog asking the user to confirm whether or not they wish to delete\n * the card.\n */\n@Component({\n selector: 'app-delete-dialog',\n templateUrl: './delete-dialog.component.html',\n styleUrls: ['../../cardcontainer/cardcontainer.component.css']\n})\nexport class DeleteDialogComponent {\n constructor(\n public dialogRef: MatDialogRef,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n // The user does not wish to delete the card.\n onExit() {\n this.dialogRef.close();\n }\n\n // The user wishes to delete the card.\n onConfirm() {\n this.dialogRef.close({\n delete: true,\n });\n }\n}\n","module.exports = \".stepContent {\\n margin-bottom: 30px;\\n margin-top: 10px;\\n font-size: 20px;\\n}\\n\\n::ng-deep .mat-horizontal-content-container {\\n padding-bottom: 0px !important;\\n}\\n\\n.stepperButtons {\\n float: right;\\n}\\n\\n.stepperButtons button {\\n margin-right: 5px;\\n}\\n\\n::ng-deep .mat-dialog-container {\\n max-height: 500px !important;\\n}\\n\\nimg {\\n max-width: 100%;\\n}\\n\\n.divider {\\n margin-bottom: 20px;\\n margin-top: 10px;\\n border-top-width: 5px !important;\\n}\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGlhbG9ncy9oZWxwLWRpYWxvZy9oZWxwLWRpYWxvZy5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsbUJBQW1CO0VBQ25CLGdCQUFnQjtFQUNoQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsOEJBQThCO0FBQ2hDOztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBO0VBQ0UsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLG1CQUFtQjtFQUNuQixnQkFBZ0I7RUFDaEIsZ0NBQWdDO0FBQ2xDIiwiZmlsZSI6InNyYy9hcHAvZGlhbG9ncy9oZWxwLWRpYWxvZy9oZWxwLWRpYWxvZy5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnN0ZXBDb250ZW50IHtcbiAgbWFyZ2luLWJvdHRvbTogMzBweDtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG46Om5nLWRlZXAgLm1hdC1ob3Jpem9udGFsLWNvbnRlbnQtY29udGFpbmVyIHtcbiAgcGFkZGluZy1ib3R0b206IDBweCAhaW1wb3J0YW50O1xufVxuXG4uc3RlcHBlckJ1dHRvbnMge1xuICBmbG9hdDogcmlnaHQ7XG59XG5cbi5zdGVwcGVyQnV0dG9ucyBidXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZGlhbG9nLWNvbnRhaW5lciB7XG4gIG1heC1oZWlnaHQ6IDUwMHB4ICFpbXBvcnRhbnQ7XG59XG5cbmltZyB7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuLmRpdmlkZXIge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBib3JkZXItdG9wLXdpZHRoOiA1cHggIWltcG9ydGFudDtcbn0iXX0= */\"","module.exports = \"
\\n \\n
\\n\\n \\n \\n {{index +1}}\\n \\n \\n
\\n
\\n MedTimeLine Configuration Screen\\n
\\n \\n
\\n
\\n \\n
\\n
\\n\\n \\n
\\n
\\n
\\n Click on the current date range to open the datepicker.\\n
\\n \\n
\\n \\n
\\n
\\n Choose a patient encounter or pre-set time period on the left.\\n
\\n \\n
\\n \\n
\\n
\\n Alternatively, choose a custom date range.\\n
\\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n The Custom Timeline feature allows you to enter custom events.\\n
\\n
\\n
\\n Click the pencil icon to enter edit mode.\\n
\\n \\n
\\n \\n
\\n
\\n Click the timeline at a place where you would like to add a flag.\\n
\\n \\n
\\n \\n
\\n
\\n In the dialog box, enter a title, description, and select a color for the flag.\\n
\\n \\n
\\n \\n
\\n
\\n You can also manually adjust the date and/or time.\\n
\\n
\\n While in edit mode, you can edit an existing flag, which will open up the dialog box again.\\n
\\n \\n
\\n \\n
\\n
\\n You can also remove flags while in edit mode.\\n
\\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n You can enter notes in the main timeline display area.\\n
\\n
\\n
\\n Click the pencil icon to enter edit mode.\\n
\\n \\n
\\n \\n
\\n
\\n Type in your notes, and click the save button to save the note.\\n
\\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n You can add, remove, and rearrange timelines to optimize the data view for specific patients.\\n
\\n
\\n
\\n To add a timeline, click the plus sign, then select Add Data Timeline.\\n Select the timeline type you want to add, then select the specific timeline.\\n
\\n \\n
\\n \\n
\\n You can also add another Custom Timeline or text notes. You can also search for concept through the autocomplete\\n input.\\n
\\n \\n \\n
\\n To remove a timeline, hover your cursor over the timeline you want to remove. Click the X in the upper left\\n corner of the timeline.\\n
\\n \\n \\n
\\n You can undo a deletion of a card, as well.\\n
\\n \\n \\n
\\n To rearrange timelines, click the label or colored handle on the left hand side of the timeline you want to\\n move, and hold the mouse button and drag and drop the timeline to your desired location.\\n
\\n \\n \\n
\\n
\\n \\n \\n
\\n
\\n\\n \\n
\\n
\\n Timelines are categorized and color-coded by a vertical bar on the leftmost side of the data timeline.\\n
\\n
\\n
\\n You can hover over plotted data point and additional data displays in a tooltip.\\n
\\n \\n \\n \\n
\\n \\n
\\n
\\n \\n \\n
\\n
\\n
\"","import {Component} from '@angular/core';\nimport {MatDialogRef} from '@angular/material';\n\n\n/**\n * This class holds the logic and template for a tutorial stepper dialog.\n */\n@Component({\n selector: 'app-help-dialog',\n templateUrl: './help-dialog.component.html',\n styleUrls: ['./help-dialog.component.css']\n})\nexport class HelpDialogComponent {\n constructor(public dialogRef: MatDialogRef) {}\n\n onExit() {\n this.dialogRef.close();\n }\n}\n","module.exports = \"::ng-deep .ifuViewer {\\n height: 300px;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGlhbG9ncy9pZnUtZGlhbG9nL2lmdS1kaWFsb2cuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGFBQWE7QUFDZiIsImZpbGUiOiJzcmMvYXBwL2RpYWxvZ3MvaWZ1LWRpYWxvZy9pZnUtZGlhbG9nLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyI6Om5nLWRlZXAgLmlmdVZpZXdlciB7XG4gIGhlaWdodDogMzAwcHg7XG59XG4iXX0= */\"","module.exports = \"

MedTimeLine Instructions For Use

\\n
\\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component} from '@angular/core';\nimport {MatDialogRef} from '@angular/material';\n\n@Component({\n selector: 'app-ifu-dialog',\n templateUrl: './ifu-dialog.component.html',\n styleUrls: ['./ifu-dialog.component.css']\n})\nexport class IfuDialogComponent {\n constructor(public dialogRef: MatDialogRef) {}\n\n onExit() {\n this.dialogRef.close();\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DiagnosticReport} from '../diagnostic-report';\nimport {Narrative} from '../narrative';\nimport {TimestampedObject} from '../sets/fhir-resource-set';\n\n/**\n * A diagnostic report with Narrative text extended.\n * Necessary because Narrative is not officially part of the\n * DSTU2 standard of FHIR, but it is an attribute on the\n * DomainResource model that DiagnosticReport is built on top of\n */\nexport class AnnotatedDiagnosticReport extends TimestampedObject {\n readonly report: DiagnosticReport;\n\n /** Text containing details of the radiology report */\n readonly text: Narrative;\n\n /** HTML string reflecting the content inside the url. */\n readonly attachmentHtml: string;\n\n constructor(report: DiagnosticReport, attachmentHtml?: string) {\n super(report.timestamp);\n\n // Grabbing information from the html text in json only if\n // it exists\n if (report.json.text) {\n this.text = new Narrative(report.json.text);\n }\n\n if (attachmentHtml) {\n this.attachmentHtml = attachmentHtml;\n }\n\n this.report = report;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\n\nimport {MicrobioReport} from '../microbio-report';\nimport {TimestampedObject} from '../sets/fhir-resource-set';\n\n/**\n * A microbio report with the timestamp for a specific culture type extended.\n * Necessary because Cerner's implementation of the microbio data\n * does not include the timestamp with the report, but rather with\n * the object.\n */\nexport class AnnotatedMicrobioReport extends TimestampedObject {\n readonly report: MicrobioReport;\n\n constructor(report: MicrobioReport) {\n // Get the timestamp from the collection time of the specimen.\n let timestamp;\n const specimen = report.specimen;\n if (specimen) {\n timestamp = specimen.collectedDateTime ?\n specimen.collectedDateTime :\n (specimen.collectedPeriod ? specimen.collectedPeriod.start :\n undefined);\n }\n super(timestamp);\n this.report = report;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Duration} from 'luxon';\n\nimport {UI_CONSTANTS} from '../../../constants';\nimport {AnnotatedMedicationOrder} from '../medication-order';\nimport {Observation} from '../observation';\nimport {ResultClassWithTimestamp} from '../sets/fhir-resource-set';\nimport {ObservationSet} from '../sets/observation-set';\n\n/**\n * An Observation with additional information to display in its tooltip.\n */\nexport class AnnotatedObservation extends ResultClassWithTimestamp {\n constructor(\n readonly observation: Observation,\n /**\n * The items in this list are [label, value] pairs to be displayed in\n * a tooltip.\n * This array should be treated as immutable.\n */\n readonly annotationValues = new Array<[string, string]>()) {\n super(observation.label, observation.requestId, observation.timestamp);\n }\n\n /**\n * Makes an AnnotatedObservation for medication monitoring.\n * The annotations read out how long it's been since the prior medication\n * dose, and how long it was until the next medication dose was given.\n * @param observation The monitoring observation to annotate\n * @param medicationOrderSet The medication orders containing the doses of the\n * corresponding medication\n * @throws Error if there are two medication orders in MedicationOrderSet\n * that contain the timestamp of the observation\n */\n static forMedicationMonitoring(\n observation: Observation,\n medicationOrders: AnnotatedMedicationOrder[]): AnnotatedObservation {\n // Look in the medication order set's administrations and find the ones\n // closest in time to this observation.\n let timeSinceLast: Duration;\n let timeBeforeNext: Duration;\n const annotations = new Array<[string, string]>();\n\n if (medicationOrders.length > 0) {\n // Flatten all medication admins within the orders into one list and sort\n const allAdmins = [].concat.apply(\n [],\n medicationOrders.map(\n order => order.medicationAdministrationSet.resourceList));\n const sortedAdmins = allAdmins.sort(\n (a, b) => a.medAdministration.timestamp.toMillis() -\n b.medAdministration.timestamp.toMillis());\n\n let idx = 0;\n while (idx < sortedAdmins.length &&\n sortedAdmins[idx].medAdministration.timestamp <\n observation.timestamp) {\n idx++;\n }\n\n // It's guaranteed that there's a dose before the monitoring point and a\n // dose after the monitoring point since we check to make sure\n // the observation is between the first and last administrations.\n // Here we look up those dose numbers and the time difference between\n // the doses and the monitoring point.\n const doseBeforeObs = sortedAdmins[idx - 1];\n const doseAfterObs = sortedAdmins[idx];\n\n timeSinceLast =\n observation.timestamp.diff(doseBeforeObs.medAdministration.timestamp);\n\n timeBeforeNext =\n doseAfterObs.medAdministration.timestamp.diff(observation.timestamp);\n\n annotations.push([\n UI_CONSTANTS.TIME_SINCE_PREVIOUS_DOSE, timeSinceLast.toFormat('h:mm')\n ]);\n\n annotations.push([\n UI_CONSTANTS.TIME_BEFORE_NEXT_DOSE, timeBeforeNext.toFormat('h:mm')\n ]);\n }\n return new AnnotatedObservation(observation, annotations);\n }\n\n /**\n * Makes an AnnotatedObservation for blood pressure, with information about\n * the blood pressure location.\n * @param observation The monitoring observation to annotate\n * @param locationSet The ObservationSet containing Blood Pressure location\n * observations.\n * @throws Error if there are two observations in locationSet\n * that contain the timestamp of the observation\n */\n static forBloodPressure(\n observation: Observation,\n locationSet: ObservationSet): AnnotatedObservation {\n const annotations = new Array<[string, string]>();\n // Find the medication order set that coincides in time with this\n // administration (if any).\n if (locationSet) {\n for (const locationObs of locationSet.resourceList) {\n if (locationObs.observation.timestamp.equals(observation.timestamp)) {\n annotations.push(\n ['Blood Pressure Location', locationObs.observation.result]);\n }\n }\n }\n\n return new AnnotatedObservation(observation, annotations);\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * FHIR type from the DSTU2 version of the standard. Used for containing\n * or referencing attachments (additional data content defined in other formats).\n * Fhir Documentation: https://www.hl7.org/fhir/datatypes.html#Attachment\n */\nexport class Attachment {\n /** Mime type of the content: Ex: text/html, application/pdf */\n readonly contentType: string;\n /** Fhir link to location of data */\n readonly url: string;\n\n constructor(jsonPresentedForm: any) {\n this.contentType = jsonPresentedForm.contentType;\n this.url = jsonPresentedForm.url;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {DateTime} from 'luxon';\n\nimport {DiagnosticReportCode} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {ResultError} from '../result-error';\n\nimport {Attachment} from './attachment';\nimport {ResultClassWithTimestamp} from './sets/fhir-resource-set';\n\n/**\n * FHIR element for DiagnosticReportStatus, from the DSTU2 version of the\n * standard.\n * https://www.hl7.org/fhir/valueset-diagnostic-report-status.html\n */\nexport enum DiagnosticReportStatus {\n Registered = 'Registered',\n Partial = 'Partial',\n Preliminary = 'Preliminary',\n Final = 'Final',\n Amended = 'Amended',\n Corrected = 'Corrected',\n Appended = 'Appended',\n Cancelled = 'Cancelled',\n EnteredInError = 'Enteredinerror',\n Unknown = 'Unknown'\n}\n\nconst statusToEnumMap = new Map([\n ['registered', DiagnosticReportStatus.Registered],\n ['partial', DiagnosticReportStatus.Partial],\n ['preliminary', DiagnosticReportStatus.Preliminary],\n ['final', DiagnosticReportStatus.Final],\n ['amended', DiagnosticReportStatus.Amended],\n ['corrected', DiagnosticReportStatus.Corrected],\n ['appended', DiagnosticReportStatus.Appended],\n ['cancelled', DiagnosticReportStatus.Cancelled],\n ['entered-in-error', DiagnosticReportStatus.EnteredInError],\n ['unknown', DiagnosticReportStatus.Unknown],\n]);\n\n/**\n * FHIR element for DiagnosticServiceSectionCodes, from the DSTU2 version\n * of the standard. Used to represent the department/diagnostic service\n * that created the request. The section codes that we are currently\n * using are not in the FHIR documentation, but are in the examples\n * given in the Cerner sandbox environment.\n * TODO: Add more codes when we get more data. (Issue #30)\n * http://hl7.org/fhir/DSTU2/valueset-diagnostic-service-sections.html\n */\nexport enum DiagnosticServiceSectionCodes {\n RadiologyReport = 'RAD',\n CTReport = 'CT'\n}\n\nconst categoryToEnumMap = new Map([\n ['RADRPT', DiagnosticServiceSectionCodes.RadiologyReport],\n ['CT Report', DiagnosticServiceSectionCodes.CTReport],\n]);\n\n/**\n * FHIR resource for DiagnosticReport, from the DSTU2 version of the standard.\n * https://www.hl7.org/fhir/DSTU2/diagnosticreport.html\n *\n * Cerner currently only supports radiology reports\n */\nexport class DiagnosticReport extends ResultClassWithTimestamp {\n /**\n * Request ID of the request that obtained this report data.\n * Returned by Cerner; not a FHIR standard.\n * TODO: Issue #24\n */\n readonly requestId: string;\n\n readonly id: string;\n\n /** Status for this test */\n readonly status: DiagnosticReportStatus;\n\n /** Category of the report*/\n readonly category: DiagnosticServiceSectionCodes;\n\n /** Report code */\n readonly code: ResourceCode;\n\n /**\n * Not readonly to allow editing in fhir-service\n * Attachment representing html/pdf version of the report.\n */\n presentedForm = new Array();\n\n /** Json returned from FHIR; source of truth */\n readonly json: any;\n\n constructor(json: any, requestId: string) {\n super(\n DiagnosticReport.getLabel(json, requestId), requestId,\n DiagnosticReport.getTimestamp(json));\n\n this.requestId = requestId;\n this.json = json;\n\n if (json.id) {\n this.id = json.id;\n }\n\n if (!json.status) {\n throw new ResultError(\n new Set([this.requestId]), 'The report needs a status to be useful.',\n json);\n }\n this.status = statusToEnumMap.get(json.status);\n\n if (json.category) {\n this.category = categoryToEnumMap.get(json.category.text);\n }\n if (json.presentedForm) {\n for (const presented of json.presentedForm) {\n this.presentedForm.push(new Attachment(presented));\n }\n }\n if (json.code) {\n this.code = DiagnosticReportCode.fromCodeString(json.code.text);\n }\n }\n /**\n * Helper function to extract the label to satisfy the requirement\n * for labels in the ResultClassWithTimestamp.\n * Label currently just text of the code, which is 'RADRPT' in the\n * Cerner examples.\n * @param json The JSON retrieved from the server.\n */\n private static getLabel(json: any, requestId: string) {\n let label;\n if (json.code) {\n label = json.code.text;\n } else {\n throw new ResultError(\n new Set([requestId]), 'The report needs a code to be useful.', json);\n }\n return label;\n }\n\n static getTimestamp(json): DateTime {\n return DateTime.fromISO(json.effectiveDateTime);\n }\n}\n","import {fixUnitAbbreviations} from '../utils/unit_utils';\n\n// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * This object represents relevant components of dosage information, provided\n * in MedicationOrders and MedicationAdministrations.\n */\nexport class Dosage {\n readonly quantity: number;\n readonly unit: string;\n readonly route: string;\n readonly text: string;\n\n constructor(json: any) {\n if (json.dosage) {\n if (json.dosage.quantity) {\n this.quantity = json.dosage.quantity.value;\n this.unit = fixUnitAbbreviations(json.dosage.quantity.unit);\n }\n if (json.dosage.route) {\n this.route = json.dosage.route.text;\n }\n /*\n * The text for the dosage usually contains information about the rate of\n * administration, however the format across different\n * MedicationAdministrations is not consistent. Ex: \"500 mg IV q6hr\" vs\n * \"250 mg = 1 caps Oral Once\"\n */\n this.text = json.dosage.text;\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\nimport {ResultError} from '../result-error';\n\n/**\n * This object represents basic information about an Encounter: what its\n * reason and type were, when it happened, and its ID.\n */\nexport class Encounter {\n readonly encounterId: string;\n readonly period: Interval;\n readonly requestId: string;\n\n constructor(json: any, requestId: string) {\n this.encounterId = json.id;\n this.requestId = requestId;\n\n if (!json.period) {\n throw new ResultError(\n new Set([this.requestId]), 'An encounter must have a time period.',\n json);\n }\n\n const startTime = Encounter.getStartTime(json, this.requestId);\n const endTime = Encounter.getEndTime(json, requestId);\n\n if (endTime < startTime) {\n throw new ResultError(\n new Set([this.requestId]),\n 'The start time comes before the end time.', json);\n }\n if (startTime > DateTime.local()) {\n throw new ResultError(\n new Set([this.requestId]), 'The start time is in the future.', json);\n }\n this.period = Interval.fromDateTimes(startTime, endTime);\n }\n\n /* Extracts the start time from JSON representing an Encounter. */\n static getStartTime(json: any, requestId?: string): DateTime {\n if (!json.period.start) {\n throw new ResultError(\n new Set([requestId]), 'An encounter must have a start date.', json);\n }\n return DateTime.fromISO(json.period.start).toLocal();\n }\n\n /* Extracts the end time from JSON representing an Encounter. */\n static getEndTime(json: any, requestId?: string): DateTime {\n let endTime = json.period.end ?\n DateTime.fromISO(json.period.end).toLocal() :\n undefined;\n if (endTime === undefined || (endTime > DateTime.local())) {\n endTime = DateTime.local();\n }\n return endTime;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\nimport {FhirResourceType} from 'src/constants';\n\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../result-error';\nimport {fixUnitAbbreviations} from '../utils/unit_utils';\n\nimport {Dosage} from './dosage';\nimport {ContainedMedication} from './medication';\nimport {FhirResourceSet, ResultClass, ResultClassWithTimestamp} from './sets/fhir-resource-set';\n\n\n/**\n * FHIR element for MedicationAdministrationStatus, from the DSTU2 version of\n * the standard. http://hl7.org/fhir/DSTU2/valueset-medication-admin-status.html\n */\nexport enum MedicationAdministrationStatus {\n IN_PROGRESS = 'In Progress',\n ON_HOLD = 'On Hold',\n COMPLETED = 'Completed',\n ENTERED_IN_ERROR = 'Entered in Error',\n STOPPED = 'Stopped'\n}\n\nconst statusToEnumMap = new Map([\n ['in-progress', MedicationAdministrationStatus.IN_PROGRESS],\n ['on-hold', MedicationAdministrationStatus.ON_HOLD],\n ['completed', MedicationAdministrationStatus.COMPLETED],\n ['entered-in-error', MedicationAdministrationStatus.ENTERED_IN_ERROR],\n ['stopped', MedicationAdministrationStatus.STOPPED],\n]);\n\n\n/**\n * This object represents a FHIR MedicationAdministration. It does not contain\n * all the information in a standard MedicationAdministration (see\n * https://www.hl7.org/fhir/DSTU2/medicationadministration.html) but instead\n * stores only the information we're interested in seeing.\n */\nexport class MedicationAdministration extends ResultClassWithTimestamp {\n static readonly MED_RESOURCE_TYPE = 'Medication';\n\n readonly wasNotGiven: boolean;\n readonly dosage: Dosage;\n readonly containedMedications: ContainedMedication[] = [];\n readonly effectiveDateTime: DateTime;\n readonly rxNormCode: RxNormCode;\n readonly medicationOrderId: string;\n readonly status: MedicationAdministrationStatus;\n\n /**\n * Makes an MedicationAdministration out of a JSON object that represents a\n * a FHIR MedicationAdministration.\n * https://www.hl7.org/fhir/DSTU2/medicationadministration.html\n * @param json A JSON object that represents a FHIR MedicationAdministration.\n * @param requestId The x-request-id of the request that acquired this\n * medication administration's data.\n */\n constructor(json: any, requestId: string) {\n super(\n json.medicationReference ? json.medicationReference.display :\n json.medicationCodeableConcept ?\n json.medicationCodeableConcept.text :\n null,\n requestId, MedicationAdministration.getTimestamp(json));\n this.rxNormCode = ResultClass.extractMedicationEncoding(json);\n this.medicationOrderId = json.prescription && json.prescription.reference ?\n json.prescription.reference.replace(\n FhirResourceType.MedicationOrder + '/', '') :\n null;\n\n this.dosage = new Dosage(json);\n this.wasNotGiven = json.wasNotGiven;\n this.status = statusToEnumMap.get(json.status);\n\n if (json.contained && json.contained.length > 0) {\n // We first find the element that lists the \"ingredients\" of this\n // MedicationAdministration with each corresponding dosage and reference\n // id. This element of \"contained\" will have the same id as the overall\n // MedicationAdministration's medicationReference number.\n const referenceId =\n json.medicationReference ? json.medicationReference.reference : null;\n\n const ingredientReferences = new Map();\n if (referenceId) {\n const index = json.contained.findIndex(\n el =>\n (el.resourceType ===\n MedicationAdministration.MED_RESOURCE_TYPE &&\n el.product && el.id === referenceId.replace('#', '')));\n const listOfIngredients = json.contained[index];\n if (listOfIngredients && listOfIngredients.product.ingredient) {\n for (const el of listOfIngredients.product.ingredient) {\n if (el.item && el.amount) {\n ingredientReferences.set(el.item.reference.replace('#', ''), el);\n }\n }\n }\n // Remove the element similar to a \"list of ingredients\" from contained.\n if (index > -1) {\n json.contained.splice(index, 1);\n }\n }\n if (ingredientReferences.size > 0 && json.contained.length > 1) {\n // We map the Medications in the list of ingredients to JSON elements\n // containing the RxNorms for each ingredient.\n for (const ing of json.contained) {\n this.containedMedications.push(new ContainedMedication(\n ing, ingredientReferences, this.requestId));\n }\n }\n }\n\n if (!(this.rxNormCode && this.label)) {\n // If a MedicationAdministration has \"Contained\" portions of different\n // ingredients, then there might not be one single RxNorm corresponding to\n // this administration.\n\n // We throw an error if all contained medications do not\n // have an RxNormCode, or if there are no contained medications.\n if (this.containedMedications.length === 0 ||\n (this.containedMedications.length > 0 &&\n this.containedMedications.every(med => (med.code === undefined)))) {\n throw new ResultError(\n new Set([this.requestId]),\n 'JSON must include RxNormCode and a label' +\n ' to be included as a MedicationAdministration.',\n json);\n }\n }\n }\n static getTimestamp(json): DateTime {\n return json.effectiveTimeDateTime ?\n DateTime.fromISO(json.effectiveTimeDateTime).toUTC() :\n json.effectiveTimePeriod ?\n DateTime.fromISO(json.effectiveTimePeriod.start).toUTC() :\n null;\n }\n}\n\n/**\n * A set of MedicalAdministrations that belong together as part of the same\n * series.\n */\nexport class MedicationAdministrationSet extends\n FhirResourceSet {\n readonly maxDose: number;\n readonly minDose: number;\n readonly unit: string;\n readonly rxNormCode: RxNormCode;\n\n /**\n * Constructor for MedicationAdministrationSet.\n * @param medicationAdministrationList The list of MedicationAdministrations\n * belonging together.\n * @throws Error if the administrations have different labels or RxNorms,\n * or if there is not a label, or if the administrations have different\n * units.\n */\n constructor(medicationAdministrationList: AnnotatedAdministration[]) {\n super(medicationAdministrationList);\n\n const rxNorms =\n medicationAdministrationList.map(x => x.medAdministration.rxNormCode);\n if (new Set(rxNorms).size > 1) {\n throw new ResultError(\n this.requestIds,\n `Different RxNorms for administrations: ${rxNorms}.`);\n }\n this.rxNormCode = rxNorms[0];\n\n this.minDose = Math.min(...medicationAdministrationList.map(\n x => x.medAdministration.dosage.quantity));\n this.maxDose = Math.max(...medicationAdministrationList.map(\n x => x.medAdministration.dosage.quantity));\n\n const units = new Set(\n medicationAdministrationList.map(x => x.medAdministration.dosage.unit));\n if (units.size > 1) {\n throw new ResultError(\n this.requestIds,\n `Different units in the administration set: ${\n Array.from(units.values())}.`);\n }\n this.unit = fixUnitAbbreviations(Array.from(units.values())[0]);\n }\n}\n\n/**\n * A MedicationAdministration with additional information relating it to\n * the other administrations in the same order.\n */\nexport class AnnotatedAdministration extends ResultClass {\n /** The medication administration to be annotated. */\n readonly medAdministration: MedicationAdministration;\n\n /**\n * The annotated dose for the dose prior to this one. Undefined if this is\n * the first dose.\n */\n readonly previousDose: AnnotatedAdministration;\n\n constructor(\n medAdmin: MedicationAdministration, prevDose?: AnnotatedAdministration) {\n super(medAdmin.label, medAdmin.requestId);\n this.medAdministration = medAdmin;\n this.previousDose = prevDose;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Disable this check because it's for IE 11 compatibility and we're not worried\n// about that in our testing code.\n/* tslint:disable:object-literal-shorthand*/\n\nimport {AnnotatedAdministration, MedicationAdministration, MedicationAdministrationSet} from '../fhir-resources/medication-administration';\nimport {FhirResourceSet, ResultClass} from '../fhir-resources/sets/fhir-resource-set';\nimport {MedicationConceptGroup, RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../result-error';\nimport {fixUnitAbbreviations} from '../utils/unit_utils';\n\n/**\n * FHIR element for MedicationOrderStatus, from the DSTU2 version of the\n * standard.\n * http://hl7.org/fhir/DSTU2/valueset-medication-order-status.html\n */\nexport const MedicationOrderStatus = {\n ACTIVE: 'active',\n ON_HOLD: 'on-hold',\n COMPLETED: 'completed',\n ENTERED_IN_ERROR: 'entered-in-error',\n STOPPED: 'stopped',\n DRAFT: 'draft',\n};\n\n/**\n * This object represents a FHIR MedicationOrder. It does not contain\n * all the information in a standard MedicationOrder (see\n * https://www.hl7.org/fhir/DSTU2/medicationorder.html) but instead\n * stores only the information we're interested in seeing.\n */\nexport class MedicationOrder extends ResultClass {\n readonly rxNormCode: RxNormCode;\n readonly dosageRetrievalError = 'Could not retrieve dosage instructions.';\n readonly status: string;\n readonly orderId: string;\n\n // By default, we set the instruction message as the retrieval error message,\n // and change it if we find a valid dosage instruction.\n dosageInstruction = this.dosageRetrievalError;\n /**\n * Makes an MedicationOrder out of a list of MedicationAdministrations.\n * https://www.hl7.org/fhir/DSTU2/medicationorder.html\n * @param json The json representing this MedicationOrder.\n * @param requestId The x-request-id of the request that acquired this\n * medication order's data.\n */\n constructor(private json: any, requestId: string) {\n // A MedicationOrder's label is one of the following in order of preference:\n // 1) the medication reference's display anme\n // 2) the medication encoding's text\n // 3) the order's ID\n super(\n json.medicationReference ? json.medicationReference.display :\n json.medicationCodeableConcept ?\n json.medicationCodeableConcept.text :\n json.id,\n requestId);\n\n if (json.dosageInstruction && json.dosageInstruction[0]) {\n if (json.dosageInstruction.length > 1) {\n throw new ResultError(\n new Set([this.requestId]),\n 'JSON must only include one dosage instruction.', json);\n }\n this.dosageInstruction = json.dosageInstruction[0].text;\n }\n this.orderId = json.id;\n this.status = json.status;\n\n this.rxNormCode = ResultClass.extractMedicationEncoding(json);\n\n if (!(this.rxNormCode && this.label)) {\n throw new ResultError(\n new Set([this.requestId]),\n 'JSON must include RxNormCode and a label to be included as a MedicationOrder.',\n json);\n }\n\n // Check this MedicationOrder label against the RxNorm label.\n if (this.label.toLowerCase() !== this.rxNormCode.label.toLowerCase()) {\n throw new ResultError(\n new Set([this.requestId]),\n `The label for this MedicationOrder's RxNorm code doesn't match ` +\n `the label in the data. MedicationOrder label: ${this.label}. ` +\n `RxNorm label: ${this.rxNormCode.label}.`);\n }\n }\n}\n\n/**\n * This object stores a FHIR MedicationOrder object along with additional\n * information including MedicationAdministration information.\n *\n * During initialization, it calculates first/last medication administrations\n * based on the list of medication administrations that the\n * AnnotatedMedicationOrder is initialized with. It does NOT fetch all\n * administrations for the entire order - since this is a very time consuming\n * FHIR call.\n */\nexport class AnnotatedMedicationOrder extends ResultClass {\n readonly order: MedicationOrder;\n\n /**\n * MedicationAdministrationSet associated with the order. This is based\n * on the MedicationAdministrations that this object is initialized with.\n * It may not represent all medication administrations for the entire order.\n */\n medicationAdministrationSet: MedicationAdministrationSet;\n\n /**\n * The MedicationAdministration that occured first. This comes from the list\n * of medication administrations that this object is initialized with. It\n * may not be the first administration of the whole order.\n */\n firstAdministration: MedicationAdministration;\n\n\n /**\n * The MedicationAdministration that occured last. This comes from the list\n * of medication administrations that this object is initialized with. It\n * may not be the last administration of the whole order.\n */\n lastAdministration: MedicationAdministration;\n\n constructor(\n order: MedicationOrder,\n medicationAdministrations: MedicationAdministration[]) {\n super(order.label, order.requestId);\n this.order = order;\n this.setMedicationAdministrations(medicationAdministrations);\n }\n\n /**\n * Sets the MedicationAdministration info for this AnnotatedMedicationOrder.\n * @param medicationAdministrations MedicationAdministrations associated with\n * the order.\n * @throws Error if the label for the list of administrations does not match\n * the label for this order.\n */\n private setMedicationAdministrations(medicationAdministrations:\n MedicationAdministration[]): void {\n if (!medicationAdministrations) {\n return;\n }\n const sortedMedAdmins = medicationAdministrations.sort((a, b) => {\n return a.timestamp.toMillis() - b.timestamp.toMillis();\n });\n this.firstAdministration = sortedMedAdmins[0];\n this.lastAdministration =\n sortedMedAdmins[medicationAdministrations.length - 1];\n\n const annotatedAdmins = [];\n for (let i = 0; i < sortedMedAdmins.length; i++) {\n const admin = sortedMedAdmins[i];\n // if i = 0, this is the first dose so we set the previous\n // dose to undefined. Otherwise, the previous dose is the\n // medication administration at the previous index\n const previousDose = i > 0 ? annotatedAdmins[i - 1] : undefined;\n const annotated = new AnnotatedAdministration(admin, previousDose);\n annotatedAdmins.push(annotated);\n }\n this.medicationAdministrationSet =\n new MedicationAdministrationSet(annotatedAdmins);\n }\n}\n\n/**\n * A set of MedicationOrders that belong together as part of the same\n * series, representing all orders for the medicine in a given time period.\n */\nexport class MedicationOrderSet extends\n FhirResourceSet {\n /*\n * The RxNormCode for this set of data. All data in this set\n * must have the same RxNormCode.\n */\n readonly rxNormCode: RxNormCode;\n readonly medicationConcept: MedicationConceptGroup;\n\n readonly maxDose: number;\n readonly minDose: number;\n readonly unit: string;\n\n /**\n * Constructor for MedicationOrderSet.\n * @param MedicationOrderList The list of MedicationOrders belonging\n * together. This list is sorted by first MedicationAdministration for\n * each order.\n * @throws Error if the observations have different labels/RxNormCodes, or\n * if there is not a label/RxNormCode.\n */\n constructor(medicationOrderList: AnnotatedMedicationOrder[]) {\n // Sort the list by first administration.\n medicationOrderList = medicationOrderList.sort((a, b) => {\n return a.firstAdministration.timestamp.toMillis() -\n b.firstAdministration.timestamp.toMillis();\n });\n super(medicationOrderList);\n // Set the RxNormCode and MedicationConceptGroup for this\n // MedicationOrderSet.\n if (medicationOrderList.length > 0) {\n const firstRxNorm = medicationOrderList[0].order.rxNormCode;\n if (!firstRxNorm) {\n throw new ResultError(\n this.requestIds,\n 'The first resource does not have an RxNorm code.');\n }\n\n for (const rs of medicationOrderList) {\n if (rs.order.rxNormCode !== firstRxNorm) {\n throw new ResultError(\n this.requestIds,\n 'The resource list in this set has mixed RxNorm codes.');\n }\n }\n this.rxNormCode = firstRxNorm;\n this.medicationConcept = this.rxNormCode.displayGrouping;\n\n this.minDose = Math.min(...medicationOrderList.map(\n x => x.medicationAdministrationSet.minDose));\n this.maxDose = Math.max(...medicationOrderList.map(\n x => x.medicationAdministrationSet.maxDose));\n\n const units = new Set(\n medicationOrderList.map(x => x.medicationAdministrationSet.unit));\n if (units.size > 1) {\n throw new ResultError(\n this.requestIds,\n `Different units in the order set: ${Array.from(units.values())}`);\n }\n this.unit = fixUnitAbbreviations(Array.from(units.values())[0]);\n }\n }\n}\n/* tslint:enable:object-literal-shorthand*/\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../result-error';\n\nimport {Dosage} from './dosage';\nimport {ResultClass} from './sets/fhir-resource-set';\n\n/**\n * This object represents relevant components of a medication contained as part\n * of a MedicationAdministration.\n * This is not a FHIR resource, and differs from the defined Medication\n * documentation at http://hl7.org/fhir/dstu2/medication.html.\n */\nexport class ContainedMedication extends ResultClass {\n readonly code: RxNormCode;\n readonly dosage: Dosage;\n readonly id: string;\n constructor(json: any, ingredients: Map, requestId: string) {\n super(json.code ? json.code.text : null, requestId);\n // We want to construct new Medications for jsons containing RxNorm codes.\n if (json.resourceType !== 'Medication') {\n throw new ResultError(\n new Set([this.requestId]), 'Resource must be of type Medication',\n json);\n }\n if (json.code) {\n if (json.code.coding) {\n this.code =\n json.code.coding\n .map(\n // Map the codes to a boolean that is true only if the\n // encoding is an RxNormCode encoding, and the RxNorm code\n // appeas in our RxNormCode list that we care about.\n (coding) => (!coding.system ||\n coding.system.indexOf(\n RxNormCode.CODING_STRING) !== -1) &&\n RxNormCode.fromCodeString(coding.code))\n // Filter out any codes that are not RxNorm codes.\n .filter((code) => !!code)[0];\n }\n }\n if (!this.code) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Medication must have RxNorm code to be useful', json);\n }\n this.id = json.id;\n const reference = ingredients.get(this.id);\n if (!reference) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Medication info must have been contained in ingredient list.', json);\n }\n if (this.id) {\n // The dosage format is different for contained\n // portions of Medications.\n const dosage = {\n dosage: {\n quantity: {\n value: reference.amount.numerator ?\n reference.amount.numerator.value :\n null,\n unit: reference.amount.numerator ? reference.amount.numerator.unit :\n null\n },\n }\n };\n this.dosage = new Dosage(dosage);\n }\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {FhirResourceType} from '../../constants';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {ResultError} from '../result-error';\n\nimport {DiagnosticReportStatus} from './diagnostic-report';\nimport {Observation} from './observation';\nimport {Specimen} from './specimen';\n\n// TODO: Issue #31 (Update mapping for string enums)\n// https://stackoverflow.com/questions/44883072/reverse-mapping-for-string-enums\nconst statusToEnumMap = new Map([\n ['registered', DiagnosticReportStatus.Registered],\n ['partial', DiagnosticReportStatus.Partial],\n ['preliminary', DiagnosticReportStatus.Preliminary],\n ['final', DiagnosticReportStatus.Final],\n ['amended', DiagnosticReportStatus.Amended],\n ['corrected', DiagnosticReportStatus.Corrected],\n ['appended', DiagnosticReportStatus.Appended],\n ['cancelled', DiagnosticReportStatus.Cancelled],\n ['entered-in-error', DiagnosticReportStatus.EnteredInError],\n ['unknown', DiagnosticReportStatus.Unknown],\n]);\n\n/**\n * Resource for MicrobioReport.\n * The parsing for this class is heavily influenced by the custom API BCH\n * built to return DiagnosticReports for microbiology data. In particular, we\n * only parse out specimens and results from the \"contained\" portion of the\n * resource instead of supporting retrieval by reference since the Cerner\n * implementation of the FHIR standard won't allow microbiology retrieval.\n *\n * This currently does not extend DiagnosticReport. TODO: Issue #24- maintain\n * More clearly delineate what belongs in FHIR resources and what is\n * added/derived\n */\nexport class MicrobioReport {\n readonly id: string;\n\n /** Specimen this report is based on */\n readonly specimen: Specimen;\n\n /** Results in the form of observations */\n readonly results = new Array();\n\n /** Status for this test */\n readonly status: DiagnosticReportStatus;\n\n /** Request ID of the request that obtained this report data */\n readonly requestId: string;\n\n constructor(json: any, requestId: string) {\n this.requestId = requestId;\n\n if (json.id) {\n this.id = json.id;\n }\n\n if (!json.status) {\n throw new ResultError(\n new Set([this.requestId]), 'The report needs a status to be useful.',\n json);\n }\n this.status = statusToEnumMap.get(json.status);\n\n // Contained resources may be either specimens or observations.\n const contained = json.contained;\n const specimens = [];\n for (const rsc of contained) {\n if (rsc.resourceType === FhirResourceType.Specimen) {\n specimens.push(new Specimen(rsc, this.requestId));\n } else if (rsc.resourceType === FhirResourceType.Observation) {\n try {\n this.results.push(new Observation(rsc, this.requestId));\n } catch (err) {\n // silently ignore observations within diagnostic reports that have\n // errors. Errors may occur because an observation may not have a\n // LOINC code we recognize or may have an inconsistent label.\n // Please see Observation constructor for all error cases.\n console.log(err);\n }\n }\n // Silently ignore all other contained resource types.\n }\n if (specimens.length > 1) {\n throw new ResultError(\n new Set([this.requestId]),\n 'The report cannot have multiple specimens.');\n }\n this.specimen = specimens[0];\n }\n\n /**\n * The custom microbiology API provided does not allow for calling for\n * a specific microbio code, so this function parses the entire anticipated\n * JSON repsonse and filters by code.\n * @param json The JSON retrieved from the server.\n * @param codeGroup The CodeGroup of tests we're looking for.\n */\n static parseAndFilterMicrobioData(json: any, codeGroup: BCHMicrobioCodeGroup):\n MicrobioReport[] {\n if (!json || !json.entry) {\n return [];\n }\n // We cannot get the request ID from the Microbiology response. Therefore\n // we hardcode the request ID to just be a constant string.\n const requestId = 'Microbiology Request';\n\n const diagnosticReports: MicrobioReport[] = json.entry.map(\n result => new MicrobioReport(result.resource, requestId));\n\n const mapToUpdate = new Map();\n // Get all unique codes for all DiagnosticReport results.\n for (const report of diagnosticReports) {\n const codes: ResourceCode[] =\n report.results.map(r => r.codes)\n .reduce((prev: ResourceCode[], curr: ResourceCode[]) => {\n return prev.concat(curr);\n }, []);\n const uniqueCodes: ResourceCode[] = Array.from(new Set(codes));\n for (const code of uniqueCodes) {\n let existing = mapToUpdate.get(code);\n if (!existing) {\n existing = [];\n }\n existing.push(report);\n mapToUpdate.set(code, existing);\n }\n }\n let reports = new Array();\n for (const code of codeGroup.resourceCodes) {\n if (mapToUpdate.has(code)) {\n reports = reports.concat(mapToUpdate.get(code));\n }\n }\n return reports;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * Fhir documentation: https://www.hl7.org/fhir/narrative.html\n * Exists as an attribute of DomainResource\n * (https://www.hl7.org/fhir/DSTU2/domainresource.html)\n */\nexport class Narrative {\n /** The original html; might be presented in different formats */\n readonly div: string;\n /** Status of the text: generated | extensions | additional | empty*/\n readonly status: string;\n\n constructor(jsonText: any) {\n if (jsonText) {\n this.div = jsonText.div;\n this.status = jsonText.status;\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/** This is the URL for the coding system for observation interpretations. */\nexport const OBSERVATION_INTERPRETATION_VALUESET_URL =\n 'http://hl7.org/fhir/ValueSet/observation-interpretation';\n\n/**\n * These are codes corresponding to ObservationInterpretations used in\n * MicrobioGraph.\n */\nexport const CHECK_RESULT_CODE = 'CHECKRESULT';\nexport const NEGFLORA_CODE = 'NEGORFLORA';\nexport const NEG_CODE = 'NEG';\nexport const NORMAL = 'N';\nexport const PARTIAL = 'Partial';\n\n/**\n * Represents the possible interpretations for observations. Each interpretation\n * has a code (usually 1-3 characters) plus a text description for display.\n * This class also keeps track of a map of codes to display text.\n */\nexport class ObservationInterpretation {\n static codeToObject = new Map();\n\n readonly code: string;\n readonly display: string;\n\n constructor(code: string, display: string) {\n this.code = code;\n this.display = display;\n ObservationInterpretation.codeToObject.set(code, this);\n }\n}\n\n/**\n * These are the FHIR standard value set values.\n * http://hl7.org/fhir/valueset-observation-interpretation.html\n */\nconst STANDARD_FHIR_INTERPRETATIONS = [\n new ObservationInterpretation('<', 'Off scale low'),\n new ObservationInterpretation('>', 'Off scale high'),\n new ObservationInterpretation('A', 'Abnormal'),\n new ObservationInterpretation('A', 'Critically abnormal'),\n new ObservationInterpretation('AC', 'Anti-complementary substances present'),\n new ObservationInterpretation('B', 'Better'),\n new ObservationInterpretation('D', 'Significant change down'),\n new ObservationInterpretation('DET', 'Detected'),\n new ObservationInterpretation('H', 'High'),\n new ObservationInterpretation('HH', 'Critically high'),\n new ObservationInterpretation('HM', 'Hold for Medical Review'),\n new ObservationInterpretation('HU', 'Very high'),\n new ObservationInterpretation('I', 'Intermediate'),\n new ObservationInterpretation('IE', 'Insufficient evidence'),\n new ObservationInterpretation('IND', 'Indeterminate'),\n new ObservationInterpretation('L', 'Low'),\n new ObservationInterpretation('LL', 'Critically low'),\n new ObservationInterpretation('LU', 'Very low'),\n new ObservationInterpretation(\n 'MS',\n 'Moderately susceptible. Indicates for microbiology susceptibilities only.'),\n new ObservationInterpretation(NORMAL, 'Normal'),\n new ObservationInterpretation('ND', 'Not Detected'),\n new ObservationInterpretation(NEG_CODE, 'Negative'),\n new ObservationInterpretation('NR', 'Non-reactive'),\n new ObservationInterpretation('NS', 'Non-susceptible'),\n new ObservationInterpretation(\n 'null', 'No range defined, or normal ranges don\\'t apply'),\n new ObservationInterpretation(\n 'OBX', 'Interpretation qualifiers in separate OBX segments'),\n new ObservationInterpretation('POS', 'Positive'),\n new ObservationInterpretation('QCF', 'Quality Control Failure'),\n new ObservationInterpretation('R', 'Resistant'),\n new ObservationInterpretation('RR', 'Reactive'),\n new ObservationInterpretation('S', 'Susceptible'),\n new ObservationInterpretation('SDD', 'Susceptible-dose dependent'),\n new ObservationInterpretation('SYN-R', 'Synergy - resistant'),\n new ObservationInterpretation('SYN-S', 'Synergy - susceptible'),\n new ObservationInterpretation('TOX', 'Cytotoxic substance present'),\n new ObservationInterpretation('U', 'Significant change up'),\n new ObservationInterpretation(\n 'VS',\n 'Very susceptible. Indicates for microbiology susceptibilities only.'),\n new ObservationInterpretation('W', 'Worse'),\n new ObservationInterpretation('WR', 'Weakly reactive')\n];\n\n/**\n * This valueset is extensible, so here are some that BCH extends it with\n * for its microbiology results.\n */\nconst BCH_CUSTOM_INTERPRETATIONS = [\n new ObservationInterpretation(CHECK_RESULT_CODE, 'Check result'),\n new ObservationInterpretation(NEGFLORA_CODE, 'Negative or Flora')\n];\n\nconst ALL_INTERPRETATIONS =\n [].concat(BCH_CUSTOM_INTERPRETATIONS, STANDARD_FHIR_INTERPRETATIONS);\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\n\nimport {BCHMicrobioCode} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {ResultError} from '../result-error';\nimport {fixUnitAbbreviations} from '../utils/unit_utils';\n\nimport {OBSERVATION_INTERPRETATION_VALUESET_URL, ObservationInterpretation} from './observation-interpretation-valueset';\nimport {ResultClass} from './sets/fhir-resource-set';\n\n\n/**\n * These are the quantity attributes provided by FHIR. See\n * https://www.hl7.org/fhir/datatypes.html#quantity\n */\ninterface Quantity {\n value: number;\n comparator: string;\n unit: string;\n system: string;\n code: string;\n}\n\n/**\n * FHIR element for ObservationStatus, from the DSTU2 version of the\n * standard.\n * http://hl7.org/fhir/DSTU2/valueset-observation-status.html\n */\nexport enum ObservationStatus {\n Registered = 'Registered',\n Preliminary = 'Preliminary',\n Final = 'Final',\n Amended = 'Amended',\n Cancelled = 'Cancelled',\n EnteredInError = 'Enteredinerror',\n Unknown = 'Unknown'\n}\n\nconst statusToEnumMap = new Map([\n ['registered', ObservationStatus.Registered],\n ['preliminary', ObservationStatus.Preliminary],\n ['final', ObservationStatus.Final],\n ['amended', ObservationStatus.Amended],\n ['cancelled', ObservationStatus.Cancelled],\n ['entered-in-error', ObservationStatus.EnteredInError],\n ['unknown', ObservationStatus.Unknown],\n]);\n\n/**\n * This object represents a FHIR Observation. It does not contain all the\n * information in a standard Observation\n * (see https://www.hl7.org/fhir/observation.html#resource) but instead stores\n * only the information we're interested in seeing.\n *\n * In general, in terms of the MedTimeLine app, we represent an Observation\n * as a point on a line graph for a lab or a vital sign. Observations also hold\n * information about microbiology report results that show up in the\n * microbiology graph tooltips.\n */\nexport class Observation extends ResultClass {\n readonly codes: ResourceCode[] = [];\n timestamp: DateTime;\n readonly value: Quantity;\n // Populated if the Observation contains a qualitative result, such\n // as \"Yellow\", rather than a numerical value.\n readonly result: string;\n readonly normalRange: [number, number];\n readonly unit: string;\n readonly innerComponents: Observation[] = [];\n // The display string associated with the code for this Observation.\n readonly display: string;\n readonly interpretation: ObservationInterpretation;\n readonly status: ObservationStatus;\n\n // The number of decimal places stored in the value.\n readonly precision: number;\n\n /**\n * Makes an Observation out of a JSON object that represents a\n * a FHIR observation.\n * @param json A JSON object that represents a FHIR observation.\n * @param requestId The x-request-id of the request that acquired this\n * observation's data.\n */\n constructor(private json: any, requestId: string) {\n super(Observation.getLabel(json), requestId);\n\n this.timestamp = Observation.getTimestamp(json);\n if (json.code) {\n if (json.code.coding) {\n if (json.code.coding[0].system === BCHMicrobioCode.CODING_STRING) {\n this.codes =\n json.code.coding\n .map((coding) => BCHMicrobioCode.fromCodeString(coding.code))\n // Filter out any codes that are not in our mapping.\n .filter((code) => !!code);\n this.display = json.code.coding[0].display;\n } else {\n this.codes =\n json.code.coding\n .map(\n // Map the codes to a boolean that is true only if the\n // encoding is a LOINC encoding, and the LOINC code appeas\n // in our LOINCCode list that we care about.\n (coding) => (!coding.system ||\n coding.system.indexOf(\n LOINCCode.CODING_STRING) !== -1) &&\n LOINCCode.fromCodeString(coding.code))\n // Filter out any codes that are not LOINC codes.\n .filter((code) => !!code);\n }\n }\n }\n\n if (json.interpretation) {\n if (json.interpretation.coding) {\n const coding = json.interpretation.coding[0];\n if (coding.system === OBSERVATION_INTERPRETATION_VALUESET_URL) {\n if (ObservationInterpretation.codeToObject.has(coding.code)) {\n this.interpretation =\n ObservationInterpretation.codeToObject.get(coding.code);\n } else {\n throw new ResultError(\n new Set([this.requestId]), 'Unsupported interpretation code.',\n coding);\n }\n }\n } else if (json.interpretation.text) {\n // BCH uses a non-standard coding system so we make interpretations on\n // the fly.\n this.interpretation = new ObservationInterpretation(\n json.interpretation.text, json.interpretation.text);\n }\n }\n\n if (json.component) {\n json.component.forEach(element => {\n const innerObs = new Observation(element, this.requestId);\n if (!innerObs.timestamp) {\n innerObs.timestamp = this.timestamp;\n }\n this.innerComponents.push(innerObs);\n });\n }\n\n if (!this.codes || this.codes.length === 0) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Observations have to have a LOINC code to be useful. ', json);\n }\n\n if (!this.label) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Observations have to have a label to be useful.', json);\n }\n\n // Check the observation label against the LOINC code label.\n if (this.label.toLowerCase() !== this.codes[0].label.toLowerCase()) {\n throw new ResultError(\n new Set([this.requestId]),\n `The label for this observation's LOINC code doesn't match ` +\n `the label in the data. Observation label: ${this.label}. ` +\n `LOINC label: ${this.codes[0].label}. `,\n json);\n }\n\n\n this.value = json.valueQuantity ? json.valueQuantity : null;\n if (this.value) {\n this.unit = fixUnitAbbreviations(this.value.unit);\n }\n\n // We must calculate precision before the value is stored as a number,\n // where precision is lost. If the value stored in the json has\n // a precision of 0 and is less than 1, then we change the precision to\n // 1 to display decimals and better UI.\n\n if (json.valueQuantity && json.valueQuantity.value) {\n const values = json.valueQuantity.value.toString().split('.');\n this.precision = values.length > 1 ? values[1].length : 0;\n if (values[0] === '0' && this.precision === 0) {\n this.precision = 1;\n }\n } else {\n // If the values are not present and are instead displayed as a value\n // of 0, the precision is set to 1 to prevent duplicated display of values\n this.precision = 1;\n }\n\n this.result =\n json.valueCodeableConcept ? json.valueCodeableConcept.text : null;\n if (this.value === null && this.result === null && !this.interpretation &&\n (this.innerComponents && this.innerComponents.length === 0)) {\n throw new ResultError(\n new Set([this.requestId]),\n 'An Observation must have a value, result, inner components, ' +\n 'or an interpretation to be useful.',\n json);\n }\n\n // The FHIR standard says that if there's only one range then it should be\n // what is \"normal\" for that measure. Otherwise they should be labeled.\n // We are going to err on the side of safety and not include a normal\n // range unless there's just the one, and it includes a high and low\n // field. https://www.hl7.org/fhir/DSTU2/observation.html#4.20.4.4\n if (json.referenceRange && json.referenceRange.length === 1) {\n if (json.referenceRange[0].low && json.referenceRange[0].high) {\n this.normalRange = [\n json.referenceRange[0].low.value, json.referenceRange[0].high.value\n ];\n }\n }\n\n this.status = statusToEnumMap.get(json.status);\n }\n\n private static getLabel(json: any) {\n let label;\n if (json.code) {\n label = json.code.text;\n if (json.code.coding) {\n if (json.code.coding[0].system === BCHMicrobioCode.CODING_STRING) {\n label = json.code.coding[0].display;\n }\n }\n }\n return label;\n }\n\n static getTimestamp(json: any): DateTime {\n return json.effectiveDateTime ?\n DateTime.fromISO(json.effectiveDateTime).toUTC() :\n json.issued ? DateTime.fromISO(json.issued).toUTC() : null;\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n\nimport {DateTime} from 'luxon';\n\nimport {RxNormCode} from '../../conceptmappings/resource-codes/rx-norm';\nimport {ResultError} from '../../result-error';\n\n\nexport class TimestampedObject {\n constructor(readonly timestamp: DateTime) {}\n}\n\nexport class ResultClassWithTimestamp extends TimestampedObject {\n constructor(\n readonly label: string, readonly requestId: string,\n readonly timestamp: DateTime) {\n super(timestamp);\n }\n}\n\nexport class RawResource {\n constructor(public json: any, public requestId: string) {}\n}\n\n/**\n * A class that has label and requestId attributes.\n *\n * TODO: Figure out how to combine with ResultClassWithTimestamp.\n */\nexport class ResultClass {\n constructor(readonly label: string, readonly requestId: string) {}\n\n /**\n * Parses the passed-in JSON and gets out a RxNormCode.\n *\n * This function prefers to directly get the RxNorm code from the resource's\n * encoding. If it can't get that, it will get the prescription's label,\n * then try to map it back to a RxNorm code. If it can't find a suitable\n * RxNorm code, it will pass back an undefined object.\n */\n static extractMedicationEncoding(json: any): RxNormCode {\n let rxNormCode: RxNormCode;\n if (json.medicationCodeableConcept) {\n if (json.medicationCodeableConcept.coding) {\n rxNormCode =\n (json.medicationCodeableConcept.coding\n .map(\n // Map the codes to a boolean that is true only if the\n // encoding is an RxNorm encoding, and the RxNorm code\n // appears in our RxNormCode list that we care about.\n (coding) => (!coding.system ||\n coding.system.indexOf(\n RxNormCode.CODING_STRING) !== -1) &&\n RxNormCode.fromCodeString(coding.code))\n // Filter out any codes that are not RxNorm codes.\n .filter((code) => !!code))[0];\n }\n return rxNormCode;\n }\n }\n}\n\n/**\n * A set of FHIR resources. All resources that are a part of this set must\n * have the same label.\n */\nexport class FhirResourceSet {\n /**\n * The list of resources that belong together.\n */\n readonly resourceList: T[];\n readonly requestIds: Set;\n\n /*\n * The label for this set of data. All data in this set\n * must have the same label.\n */\n label: string;\n\n /**\n * Constructor for FhirResourceSet.\n * @param resourceList The list of resources belonging together.\n * @throws Error if the resources have different labels, or if there is not\n * a label.\n */\n constructor(resourceList: T[]) {\n this.requestIds = new Set(resourceList.map(resource => resource.requestId));\n\n if (!resourceList) {\n throw new ResultError(this.requestIds, 'Resource list is undefined.');\n }\n\n if (resourceList.length > 0) {\n const firstLabel = resourceList[0].label;\n if (!firstLabel) {\n throw new ResultError(\n this.requestIds, 'The first resource does not have a label.');\n }\n\n const allLabels = new Set(resourceList.map(rs => rs.label.toLowerCase()));\n if (allLabels.size !== 1) {\n throw new ResultError(\n this.requestIds,\n `The resource list in this set has mixed labels: ${\n Array.from(allLabels.values())}`);\n }\n this.label = firstLabel;\n }\n\n this.resourceList = resourceList;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\n\nimport {fixUnitAbbreviations} from '../../utils/unit_utils';\nimport {AnnotatedObservation} from '../annotated/annotated-observation';\n\nimport {FhirResourceSet} from './fhir-resource-set';\n\n/**\n * A set of observations that belong together as part of the same series.\n */\nexport class ObservationSet extends FhirResourceSet {\n /**\n * The normal ranges for this set of observations. It maps a timestamp of each\n * Observation with a normal range to the corresponding normal range.\n */\n normalRanges = new Map();\n\n /**\n * The units for this set of observations. Left unset if the normal\n * range is different across the observations.\n */\n readonly unit: string;\n\n /**\n * Whether or not any Observations belonging to this ObservationSet contain\n * qualitative results rather than numerical values.\n */\n readonly anyQualitative: boolean = false;\n\n /**\n * Constructor for ObservationSet.\n * @param observationList The list of observations belonging together.\n * @throws Error if the observations have different labels, as this indicates\n * that they are data points from different series, or if there is not\n * a label.\n */\n constructor(observationList: AnnotatedObservation[]) {\n super(observationList);\n\n let firstUnit;\n if (observationList.length > 0) {\n firstUnit = observationList[0].observation.unit;\n }\n // Ensure that the labels of the data are all the same.\n let differentUnits = false;\n\n for (const obs of observationList) {\n // Some observations may not have a normal range.\n if (obs.observation.normalRange) {\n this.normalRanges.set(\n obs.observation.timestamp, obs.observation.normalRange);\n }\n // Some observations may not have a normal range.\n if (obs.observation.unit && obs.observation.unit !== firstUnit) {\n differentUnits = true;\n }\n }\n if (!differentUnits && firstUnit) {\n this.unit = fixUnitAbbreviations(firstUnit);\n }\n\n this.anyQualitative = observationList.some(\n obs => (obs.observation.result !== null && !obs.observation.value));\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\nimport {ResultError} from '../result-error';\n/**\n * FHIR resource for a Specimen, from the DSTU2 standard.\n * https://www.hl7.org/fhir/DSTU2/specimen.html\n */\nexport class Specimen {\n /** If this is a contained resource, then it will have an ID string. */\n readonly id: string;\n\n /** Kind of material that forms the specimen */\n readonly type: string;\n\n /** Where the specimen was collected */\n readonly bodySite: string;\n\n /**\n * When the specimen was collected. The specimen will have one or the other\n * of these defined, but not both.\n */\n readonly collectedDateTime: DateTime;\n readonly collectedPeriod: Interval;\n\n readonly requestId: string;\n\n constructor(json: any, requestId: string) {\n this.requestId = requestId;\n\n if (json.id) {\n this.id = json.id;\n }\n\n if (!json.type) {\n throw new ResultError(\n new Set([this.requestId]),\n 'A specimen must have a type to be useful.', json);\n }\n\n this.type = json.type.text;\n\n if (!json.collection) {\n throw new ResultError(\n new Set([this.requestId]),\n 'A specimen must have collection information to be useful.', json);\n }\n if (json.collection.collectedPeriod && json.collection.collectedDateTime) {\n throw new ResultError(\n new Set([this.requestId]),\n 'Only collectedPeriod or collectionDateTime should be defined.' +\n json);\n }\n\n if (json.collection.collectedPeriod) {\n const collectedPeriod = json.collection.collectedPeriod;\n // If only the start time is present, put it into collectedDateTime.\n if (collectedPeriod.start && !collectedPeriod.end) {\n this.collectedDateTime = DateTime.fromISO(collectedPeriod.start);\n } else {\n this.collectedPeriod = Interval.fromDateTimes(\n DateTime.fromISO(collectedPeriod.start),\n DateTime.fromISO(collectedPeriod.end));\n }\n }\n\n if (json.collection.collectedDateTime) {\n this.collectedDateTime =\n DateTime.fromISO(json.collection.collectedDateTime);\n }\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\n\nimport {APP_TIMESPAN, FhirResourceType} from '../../constants';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {DiagnosticReport} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration} from '../fhir-resources/medication-administration';\nimport {Observation} from '../fhir-resources/observation';\nimport {RawResource, ResultClass, ResultClassWithTimestamp} from '../fhir-resources/sets/fhir-resource-set';\n\nconst GREATER_OR_EQUAL = 'ge';\nconst LESS_OR_EQUAL = 'le';\nconst LESS_THAN = 'lt';\n\n/**\n * Gets the next page of search results from the smart API. This function\n * assumes that the same smartApi was used to call the original search.\n *\n * @param smartApi The resolved smartOnFhirClient\n * @param response The response from the previous page of search results\n * @param results The list of all formatted results processed in previous page\n * responses\n */\nfunction getNextSearchResultsPage(\n smartApi,\n response,\n results,\n ): Promise {\n const requestId = response.headers('x-request-id');\n const responseData = response.data.entry || [];\n\n results = results.concat(\n responseData.map(result => new RawResource(result.resource, requestId)));\n\n // if there are anymore pages, get the next set of results.\n if (response.data.link.some((linkItem) => linkItem.relation === 'next')) {\n return smartApi.patient.api.nextPage({bundle: response.data})\n .then(\n nextResponse => {\n return getNextSearchResultsPage(smartApi, nextResponse, results);\n },\n rejection => {\n throw rejection;\n });\n }\n return Promise.resolve(results);\n}\n\n/**\n * Gets all pages of search results for the given query params. Formats\n * the results into RawResource objects.\n *\n * @param smartApi The resolved smartOnFhirClient\n * @param queryParams the params to pass to the search function\n */\nfunction fetchAllFromFhir(smartApi, queryParams): Promise {\n const results = [];\n return smartApi.patient.api.search(queryParams)\n .then(\n response => {\n return getNextSearchResultsPage(smartApi, response, results)\n .then(res => {\n return res.filter(result => !!result);\n });\n },\n rejection => {\n throw rejection;\n });\n}\n\n/**\n * Abstract Class for Fetching and Caching FHIR Resources.\n */\nexport abstract class FhirCache {\n /**\n * Cache of Raw Resources.\n * A mapping from the timestamp as a date string to a list of RawResources\n * that have that timestamp.\n * We store the date string so that we can test whether the map has a\n * date easily because Datetime equality is not straightforward.\n * We store RawResources instead of the actual resources\n * (MedicationAdministration, Observation, etc) because we want\n * to cache all results, even if one of the resources does not pass the\n * validation done during construction. This way, we do not need to fetch\n * the invalid resource again for the same date range.\n */\n protected cache = new Map();\n\n /**\n * List of RawResources that have a timestamp today. We do not want to\n * cache today's results because we will want to refresh them the next time\n * we fetch the resource in order to get any new results.\n */\n private todaysResults: RawResource[];\n\n /**\n * The time that today's results were last fetched from FHIR. This helps us\n * not fetch today's results more frequently than necessary if results are\n * fetched multiple times during page loading.\n */\n private timeOfLastRefreshOfTodaysResults: DateTime;\n\n /**\n * A function that takes a RawResource object and converts it to the\n * Resource object to be returned.\n *\n * @param result: the RawResource to convert\n * @returns an instance of a Resource that extends ResultClassWithTimestamp\n */\n protected abstract createFunction(result: RawResource): T;\n\n /**\n * A function that takes a date range and returns the search query params\n *\n * @param dateRange: the dateRange to fetch from FHIR\n * @returns the JSON query params to search with.\n */\n protected abstract getQueryParams(dateRange: Interval);\n\n /**\n * A function to get the timestamp from the RawResource. The resulting\n * timestamp will be the cache key for this result.\n *\n * @param result the RawResource object to get the timestamp from\n * @returns the DateTime object representing the time the result happened at\n */\n protected abstract getTimestampFromRawResource(result: RawResource): DateTime;\n\n /**\n * Splits an Interval date range by day.\n *\n * @param dateRange: the Interval to split into days\n * @returns an array of intervals (each 1 day long) corresponding to the days\n * in the given date range.\n */\n private splitDateRangeByDay(dateRange: Interval): Interval[] {\n return Interval\n .fromDateTimes(\n dateRange.start.startOf('day'), dateRange.end.endOf('day'))\n .splitBy({days: 1});\n }\n\n /**\n * Fetches the resources from FHIR for the given date range and updates\n * the cache with these results.\n *\n * The results are stored as RawResources\n * so that a validation error during object creation does not prevent the\n * cache from being updated.\n *\n * @param smartApi: the resolved Smart on FHIR API Client instance\n * @param dateRange: the date range to fetch from FHIR\n */\n fetchResourceAndAddToCache(smartApi, dateRange: Interval): Promise {\n const queryParams = this.getQueryParams(dateRange);\n // fetches the results from FHIR and groups them by timestamp.\n const fetchAllPromise =\n fetchAllFromFhir(smartApi, queryParams).then((results: []) => {\n const resultMap = new Map();\n for (const result of results) {\n const resultDate =\n this.getTimestampFromRawResource(result).toISODate();\n if (!resultMap.has(resultDate)) {\n resultMap.set(resultDate, new Array());\n }\n resultMap.get(resultDate).push(result);\n }\n return resultMap;\n });\n\n // after the data fetch resolves, updates the cache for each day that was\n // fetched with the results that were found. If no results were found for\n // a given day, we set to an empty list.\n return Promise.resolve(fetchAllPromise).then(resultMap => {\n const currentTime = DateTime.utc();\n for (const day of this.splitDateRangeByDay(dateRange)) {\n const dayAsString = day.start.toISODate();\n if (dayAsString === currentTime.toISODate()) {\n this.todaysResults = resultMap.get(dayAsString) || [];\n this.timeOfLastRefreshOfTodaysResults = currentTime;\n } else {\n this.cache.set(dayAsString, resultMap.get(dayAsString) || []);\n }\n }\n });\n }\n\n /** Gets the RawResources from the Cache for each day in the date range. */\n private getResourceFromCache(dateRange: Interval): RawResource[] {\n const results = new Array();\n for (const day of this.splitDateRangeByDay(dateRange)) {\n const dayString = day.start.toISODate();\n if (dayString === DateTime.utc().toISODate()) {\n results.push(...this.todaysResults);\n } else {\n results.push(...this.cache.get(dayString));\n }\n }\n return results;\n }\n\n /**\n * Gets the resources for the given date range.\n *\n * If any days within the date range are not in the cache already, we fetch\n * the results for that range and add them to the cache.\n *\n * Then we return all instances of the Resource that are within the given\n * date range.\n *\n * @param dateRange: the Interval to fetch data within.\n * @returns an array of Resource objects that extend ResultClassWithTimestamp\n */\n getResource(smartApi, dateRange: Interval): Promise {\n // splits the date range by day and checks if the cache contains that day.\n // Merges days not in the cache into a list of intervals that cover those\n // days.\n const rangesToFetch =\n Interval.merge(this.splitDateRangeByDay(dateRange).filter(day => {\n const currentTime = DateTime.utc();\n if (day.start.toISODate() === currentTime.toISODate()) {\n // we filter out today if we have refreshed today's results\n // within the last minute.\n return !(\n this.timeOfLastRefreshOfTodaysResults &&\n currentTime\n .diff(this.timeOfLastRefreshOfTodaysResults, 'minutes')\n .minutes < 1);\n // sometimes due to timezone handling we end up with a date that\n // is after today. We do not need to fetch that date.\n } else if (day.start.toMillis() > currentTime.toMillis()) {\n return false;\n }\n return !this.cache.has(day.start.toISODate());\n }));\n\n // for each date interval, fetch the resource from FHIR and add the data\n // to the cache.\n const fetchPromises = rangesToFetch.map(range => {\n return this.fetchResourceAndAddToCache(smartApi, range);\n });\n\n // after all date ranges have been fetched from FHIR and added to the\n // cache. Get all data from the cache for the full date range.\n return Promise.all(fetchPromises)\n .then(\n _ => {\n return this.getResourceFromCache(dateRange)\n .map(result => this.createFunction(result))\n .filter(result => !!result);\n },\n rejection => {\n throw rejection;\n });\n }\n}\n\n/** Cache for MedicationAdministrations */\nexport class MedicationCache extends FhirCache {\n /** Promise to load all results into the Cache within the App Timespan. */\n resultsLoaded: Promise;\n\n getResource(smartApi, dateRange: Interval):\n Promise {\n // if we have not alraedy loaded all the results into the cache within the\n // App Timespan, add them first. This helps with loading time for subsequent\n // calls for medications.\n if (!this.resultsLoaded) {\n this.resultsLoaded =\n this.fetchResourceAndAddToCache(smartApi, APP_TIMESPAN);\n }\n return this.resultsLoaded.then(() => {\n return super.getResource(smartApi, dateRange);\n });\n }\n\n /**\n * Creates a MedicationAdministration from a RawResource.\n * Note: will return undefined if the Medication Encoding extracted from the\n * RawResource is undefined.\n */\n createFunction(result: RawResource): MedicationAdministration {\n // In the MedicationAdministration constructor we throw an Error if the\n // rxNormCode is undefined. It will be undefined if we do not have a mapping\n // for that rxNormCode. Because we are querying for all\n // MedicationAdministrations (not just a particular code), we need to filter\n // those results out before we try to create the MedicationAdministration\n // object.\n if (ResultClass.extractMedicationEncoding(result.json)) {\n return new MedicationAdministration(result.json, result.requestId);\n }\n }\n\n getQueryParams(dateRange: Interval) {\n return {\n type: FhirResourceType.MedicationAdministration,\n query: {\n effectivetime: {\n $and: [\n GREATER_OR_EQUAL + dateRange.start.toISODate(),\n LESS_OR_EQUAL + dateRange.end.toISODate()\n ]\n },\n notgiven: 'false',\n status: 'in-progress,completed,on-hold',\n // Despite documentation, this is the number of results per page,\n // not the total number of results.\n // https://groups.google.com/d/msg/cerner-fhir-developers/iW8hXIWcRX0/Y9mA__OqAQAJ\n _count: 200\n }\n };\n }\n\n getTimestampFromRawResource(result: RawResource): DateTime {\n return MedicationAdministration.getTimestamp(result.json);\n }\n}\n\n/** Cache for DiagnosticReports */\nexport class DiagnosticReportCache extends FhirCache {\n createFunction(result: RawResource): DiagnosticReport {\n return new DiagnosticReport(result.json, result.requestId);\n }\n\n getQueryParams(dateRange: Interval) {\n return {\n type: FhirResourceType.DiagnosticReport,\n query: {\n date: {\n $and: [\n GREATER_OR_EQUAL + dateRange.start.toISODate(),\n // We are adding one millisecond to the end date because we want\n // less or equal to the date range, but the spec only allows\n // strictly less than param.\n LESS_THAN + dateRange.end.plus({millisecond: 1}).toISODate()\n ]\n }\n }\n };\n }\n\n getTimestampFromRawResource(result: RawResource) {\n return Observation.getTimestamp(result.json);\n }\n}\n\n/** Cache for Observations */\nexport class ObservationCache extends FhirCache {\n /** The LOINCCode that the cached observations are associated with. */\n readonly code: LOINCCode;\n\n constructor(code: LOINCCode) {\n super();\n this.code = code;\n }\n\n createFunction(result: RawResource): Observation {\n return new Observation(result.json, result.requestId);\n }\n\n getQueryParams(dateRange: Interval) {\n return {\n type: FhirResourceType.Observation,\n query: {\n code: LOINCCode.CODING_STRING + '|' + this.code.codeString,\n date: {\n $and: [\n GREATER_OR_EQUAL + dateRange.start.toISODate(),\n LESS_OR_EQUAL + dateRange.end.toISODate()\n ]\n },\n // 100 is the maximum page size allowed by Cerner for observations.\n _count: 100\n }\n };\n }\n\n getTimestampFromRawResource(result: RawResource) {\n return Observation.getTimestamp(result.json);\n }\n}\n\n/** Cache for Encounters. */\nexport class EncounterCache {\n /** List of cached RawResources representing raw Encounters. */\n private cache: RawResource[];\n\n /** The last time the cache was refreshed. */\n private lastFhirFetchTime: DateTime;\n\n /**\n * Gets all Encounters.\n * Note: Encounters cannot be searched by date, so this will return all\n * encounters.\n */\n getResource(smartApi): Promise {\n const currentTime = DateTime.utc();\n let cachePromise;\n // if the last fetch of Encounters from FHIR was within 1 minute, we don't\n // need to fetch them again. Since we may call this method multiple times\n // when loading the page, we want to ensure we aren't making unecessary\n // calls.\n if (this.lastFhirFetchTime &&\n currentTime.diff(this.lastFhirFetchTime, 'minutes').minutes < 1) {\n cachePromise = Promise.resolve(this.cache);\n } else {\n this.lastFhirFetchTime = currentTime;\n const queryParams = {\n type: FhirResourceType.Encounter,\n };\n cachePromise = fetchAllFromFhir(smartApi, queryParams).then(results => {\n this.cache = results;\n this.lastFhirFetchTime = currentTime;\n return results;\n });\n }\n return Promise.resolve(cachePromise)\n .then(\n results => {\n return results\n .filter(result => {\n const status = result.json.status;\n // Lots of encounters have errors where start times come\n // after end times. To reduce those errors surfacing, we\n // pre-parse start and end times, as well as statuses, and\n // only return those encounters that are in the application\n // timespan and aren't cancelled or in the future.\n const startTime = Encounter.getStartTime(result.json);\n const endTime = Encounter.getEndTime(result.json);\n\n const inTimeSpan =\n (startTime && APP_TIMESPAN.contains(startTime)) ||\n (endTime && APP_TIMESPAN.contains(endTime));\n\n return status !== 'cancelled' && status !== 'planned' &&\n inTimeSpan;\n })\n .map(result => new Encounter(result.json, result.requestId));\n },\n rejection => {\n throw rejection;\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {Inject, Injectable} from '@angular/core';\nimport {DateTime, Interval} from 'luxon';\n\nimport {APP_TIMESPAN, EARLIEST_ENCOUNTER_START_DATE, FhirResourceType} from '../../constants';\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {documentReferenceLoinc} from '../conceptmappings/resource-code-manager';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCodeGroup} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {DebuggerService} from '../debugger/debugger.service';\nimport {AnnotatedDiagnosticReport} from '../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReport, DiagnosticReportStatus} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration, MedicationAdministrationStatus} from '../fhir-resources/medication-administration';\nimport {MedicationOrder} from '../fhir-resources/medication-order';\nimport {MicrobioReport} from '../fhir-resources/microbio-report';\nimport {Observation, ObservationStatus} from '../fhir-resources/observation';\nimport * as FhirConfig from '../fhir_config';\n\nimport {DiagnosticReportCache, EncounterCache, MedicationCache, ObservationCache} from './fhir-cache';\nimport {FhirService} from './fhir.service';\nimport {SMART_ON_FHIR_CLIENT} from './smart-on-fhir-client';\n\n@Injectable()\nexport class FhirHttpService extends FhirService {\n /** Cache for all MedicationAdministrations. */\n protected static medicationCache = new MedicationCache();\n\n /** Cache for all DiagnosticReports. */\n protected static diagnosticReportCache = new DiagnosticReportCache();\n\n /**\n * Cache for all Observations. Map from LOINCCode to the ObservationCache\n * for that LOINCCode.\n */\n protected static observationCache = new Map();\n\n /** Cache for all Encounters. */\n protected static encounterCache = new EncounterCache();\n\n readonly smartApiPromise: Promise;\n\n constructor(\n private debugService: DebuggerService,\n @Inject(SMART_ON_FHIR_CLIENT) smartOnFhirClient: any,\n private http: HttpClient, resourceCodeCreator: ResourceCodeCreator) {\n super(resourceCodeCreator);\n // Create a promise which resolves to the smart API when the smart API is\n // ready. This allows clients of this service to call service methods\n // which depend on the API, regardless of whether the API is ready or not.\n this.smartApiPromise = new Promise(\n (resolve, reject) => smartOnFhirClient.oauth2.ready(\n smart => resolve(smart), err => reject(err)));\n }\n\n /**\n * Gets observations from a specified date range with a specific LOINC code.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getObservationsWithCode(code: LOINCCode, dateRange: Interval):\n Promise {\n let cacheForCode = FhirHttpService.observationCache.get(code);\n\n if (!cacheForCode) {\n cacheForCode = new ObservationCache(code);\n FhirHttpService.observationCache.set(code, cacheForCode);\n }\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return cacheForCode.getResource(smartApi, dateRange)\n .then((results: Observation[]) => {\n return results.filter(\n result =>\n result.status !== ObservationStatus.EnteredInError);\n });\n });\n }\n\n /**\n * Checks if there are any observations with the given LOINC Code within the\n * given date range.\n *\n * Note: Only fetches single page of results from FHIR server to enhance\n * performance.\n *\n * @param code LOINC code to check if there are any observations for\n * @param dateRange the time interval the observations should fall between\n */\n observationsPresentWithCode(code: LOINCCode, dateRange: Interval):\n Promise {\n const queryParams = new ObservationCache(code).getQueryParams(dateRange);\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(\n ([smartApi, codes]) =>\n smartApi.patient.api.search(queryParams)\n .then(response => !!response.data.entry));\n }\n\n /**\n * Checks which RxNormCodes are present within the App Timespan.\n *\n * As a result, the MedicationCache is populated with all data within the\n * App Timespan.\n *\n * @returns A Promise that resolves to the Set of RxNormCodes with data\n * available.\n */\n dataAvailableForMedications(): Promise> {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return FhirHttpService.medicationCache\n .getResource(smartApi, APP_TIMESPAN)\n .then((results: MedicationAdministration[]) => {\n const codesPresent = new Set();\n results.forEach(med => codesPresent.add(med.rxNormCode));\n return codesPresent;\n });\n });\n }\n\n /**\n * Gets medication data from a specified date range with a specific Rx code\n * @param code The RxNormCode codes for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getMedicationAdministrationsWithCodes(\n codes: RxNormCode[],\n dateRange: Interval): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return FhirHttpService.medicationCache\n .getResource(smartApi, dateRange)\n .then(\n (results: MedicationAdministration[]) => results.filter(\n result => codes.includes(result.rxNormCode) &&\n result.status !==\n MedicationAdministrationStatus.ENTERED_IN_ERROR));\n });\n }\n\n /**\n * Determines whether their is a medication present with the given code\n * during the given date range\n * @param code The RxNormCode to get medications for\n * @param dateRange The date range to get medications for\n */\n medicationsPresentWithCode(code: RxNormCode, dateRange: Interval):\n Promise {\n return this.getMedicationAdministrationsWithCodes([code], dateRange)\n .then(medAdmins => {\n return medAdmins.length > 0 ? true : false;\n });\n }\n\n /**\n * Gets order for specified external id.\n * @param id The id to pull the order from.\n */\n getMedicationOrderWithId(id: string): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(\n ([smartApi, codes]) =>\n smartApi.patient.api\n .read({type: FhirResourceType.MedicationOrder, 'id': id})\n .then(\n (result: any) => {\n const requestId = result.headers('x-request-id');\n return new MedicationOrder(result.data, requestId);\n },\n // Do not return any MedicationOrders for\n // this code if one of the MedicationOrder\n // constructions throws an error.\n rejection => {\n this.debugService.logError(rejection);\n throw rejection;\n }));\n }\n\n /**\n * Gets the encounters for the patient for any encounter that falls in the\n * given date range.\n * @param dateRange Return all encounters that covered any time in this\n * date range.\n */\n getEncountersForPatient(dateRange: Interval): Promise {\n if (!dateRange) {\n dateRange = APP_TIMESPAN;\n }\n // The Cerner implementation of the Encounter search does not offer any\n // filtering by date at this point, so we grab all the encounters\n // then filter them down to those which intersect with the date range\n // we query, and those that have a start date no earlier than a year\n // prior to now.\n return this.smartApiPromise.then(smartApi => {\n return FhirHttpService.encounterCache.getResource(smartApi).then(\n (results: Encounter[]) =>\n results\n .filter(\n (result: Encounter) =>\n dateRange.intersection(result.period) !== null)\n .filter(\n (result: Encounter) => result.period.start >=\n EARLIEST_ENCOUNTER_START_DATE));\n });\n }\n\n /**\n * Saves the current image of the graphs rendered as a DocumentReference\n * (static save).\n * @param html The inner HTML to keep in the Document.\n * @param date The date the note was written on.\n */\n saveStaticNote(image: HTMLCanvasElement, date: string): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes]).then(([\n smartApi,\n codes\n ]) => {\n const postBody = {\n resourceType: FhirResourceType.DocumentReference,\n subject: {\n reference: [FhirResourceType.Patient, smartApi.patient.id].join('/')\n },\n type: {\n coding: [{\n system: LOINCCode.CODING_STRING, // must be loinc\n code: documentReferenceLoinc.codeString, // Summary Note\n }],\n },\n indexed: DateTime.utc().toISO(),\n status:\n 'current', // Required; only supported option is 'current'\n // https://fhir.cerner.com/millennium/dstu2/infrastructure/document-reference/#body-fields\n content: [{\n attachment: {\n contentType: 'application/xhtml+xml;charset=utf-8',\n data: btoa('')\n }\n }],\n context: {\n encounter: {\n reference: [\n FhirResourceType.Encounter, smartApi.tokenResponse.encounter\n ].join('/')\n }\n }\n };\n return smartApi.patient.api.create({resource: postBody})\n .then(\n resolve => {\n return true;\n },\n reject => {\n return false;\n });\n });\n }\n\n /**\n * Gets the MicrobioReports for the patient for any report that falls in\n * the given date range.\n * @param codeGroup The CodeGroup to retrieve MicrobioReports for.\n * @param dateRange Return all MicrobioReports that covered any time in this\n * date range.\n */\n getMicrobioReports(codeGroup: BCHMicrobioCodeGroup, dateRange: Interval):\n Promise {\n if (!FhirConfig.microbiology) {\n console.warn(\n 'No microbiology parameters available in the configuration.');\n return Promise.resolve([]);\n }\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(\n ([smartApi, codes]) => {\n // YYYY-MM-DD format for dates\n let callParams = new HttpParams();\n callParams = callParams.append('patient', smartApi.patient.id);\n callParams = callParams.append('category', 'microbiology'),\n callParams = callParams.append(\n 'item-date', 'ge' + dateRange.start.toFormat('yyyy-MM-dd'));\n callParams = callParams.append(\n 'item-date', 'le' + dateRange.end.toFormat('yyyy-MM-dd'));\n callParams = callParams.append('_format', 'json');\n\n const authString = btoa(\n FhirConfig.microbiology.username + ':' +\n FhirConfig.microbiology.password);\n const httpHeaders = new HttpHeaders({\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Authorization': 'Basic ' + authString,\n });\n\n return this.http\n .get(\n [\n FhirConfig.microbiology.url,\n FhirResourceType.DiagnosticReport\n ].join('/'),\n {headers: httpHeaders, params: callParams})\n .toPromise()\n .then((res: any) => {\n return MicrobioReport.parseAndFilterMicrobioData(\n res, codeGroup);\n });\n },\n rejection => {\n this.debugService.logError(rejection);\n throw rejection;\n });\n }\n\n /**\n * Returns AnnotateDiagnosticReport from a specified date range with a\n * specific DiagnosticReportCodeGroup code.\n *\n * @param code The DiagnosticReportCodeGroup for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getAnnotatedDiagnosticReports(\n codeGroup: DiagnosticReportCodeGroup,\n dateRange: Interval): Promise {\n const codes = codeGroup.resourceCodes;\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, _]) => {\n return FhirHttpService.diagnosticReportCache\n .getResource(smartApi, dateRange)\n .then((results: DiagnosticReport[]) => {\n const annotatedReportsArr =\n results\n .filter((result: DiagnosticReport) => {\n return codes.includes(result.code) &&\n result.status !==\n DiagnosticReportStatus.EnteredInError;\n })\n .map(report => this.addAttachment(report));\n return Promise.all(annotatedReportsArr);\n });\n });\n }\n\n /**\n * Helper function that makes the HTTP call to get the html attachment.\n * The responseType will always be text, and not the default json.\n * If any error exists, it will catch the http error and return the message\n * @param url Fhir link to location of data\n */\n getAttachment(url: string): Promise {\n return Promise.all([this.smartApiPromise, this.loadAllCodes])\n .then(([smartApi, codes]) => {\n const httpHeaders = new HttpHeaders({\n 'Accept': 'text/html',\n 'Authorization': 'Bearer ' + smartApi.tokenResponse.access_token\n });\n return this.http\n .get(url, {headers: httpHeaders, responseType: 'text'})\n .toPromise()\n .then((res: any) => res)\n .catch(err => err.message);\n });\n }\n}\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2ZoaXItc2VydmVyL2ZoaXItbGF1bmNoL2ZoaXItbGF1bmNoLmNvbXBvbmVudC5jc3MifQ== */\"","module.exports = \"Launching authentication...\\n
\\n Authentication Information
\\n Base URI: {{this.baseURL}}
\\n Redirect URI : {{this.redirectURL}}
\\n Scopes: {{this.scope}};
\\n URL parameters: {{this.parameters}}
\\n \\n
\\nError: This app is not configured for this EHR.\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport 'fhirclient';\n\nimport {Component, OnInit} from '@angular/core';\nimport {ActivatedRoute} from '@angular/router';\nimport {Router} from '@angular/router';\n\nimport {environment} from '../../../environments/environment';\n\nimport * as FhirConfig from '../../fhir_config';\n\n/* Type definition for SMART on FHIR client (from assets/fhir-client.min.js) */\ndeclare var FHIR: any;\n\n@Component({\n selector: 'app-fhir-launch',\n templateUrl: './fhir-launch.component.html',\n styleUrls: ['./fhir-launch.component.css']\n})\nexport class FhirLaunchComponent implements OnInit {\n error = false;\n\n scope: string = [\n 'launch', 'patient/Observation.read', 'patient/Patient.read',\n 'patient/MedicationOrder.read', 'patient/MedicationAdministration.read',\n 'patient/DocumentReference.read', 'patient/DocumentReference.write',\n 'patient/Encounter.read', 'patient/DiagnosticReport.read',\n 'patient/Binary.read'\n ].join(' ');\n\n // We hold these variables in-class for authentication debugging.\n clientId: string;\n baseURL: string;\n redirectURL: string;\n useDebugger: boolean;\n parameters = new Array();\n\n constructor(private router: Router, private route: ActivatedRoute) {}\n\n ngOnInit() {\n if (environment.useMockServer) {\n this.router.navigate(['setup']);\n } else {\n this.useDebugger = environment.useDebugger;\n\n this.route.queryParams.subscribe(params => {\n const state = params['state'];\n const code = params['code'];\n if (state && code) {\n // Navigate to the setup page, passing the code & state parameters\n // along with the URL.\n this.router.navigateByUrl('/setup?code=' + code + '&state=' + state);\n } else {\n if (this.useDebugger) {\n this.clientId = FhirConfig.credentials.client_id;\n this.baseURL = FhirConfig.url.baseURL;\n this.redirectURL = FhirConfig.url.redirectURL;\n this.route.queryParams.subscribe(pms => {\n this.parameters.push(JSON.stringify(pms));\n });\n return;\n }\n\n this.beginAuthenticationFlow();\n }\n });\n }\n }\n\n beginAuthenticationFlow() {\n const clientId = FhirConfig.credentials.client_id;\n if (!clientId) {\n this.error = true;\n } else {\n FHIR.oauth2.authorize({\n 'client_id': clientId,\n 'scope': this.scope,\n 'redirect_uri': FhirConfig.url.redirectURL\n });\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\nimport {Interval} from 'luxon';\nimport {of} from 'rxjs';\n\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from '../conceptmappings/resource-code-manager';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCodeGroup} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {LOINCCode, LOINCCodeGroup} from '../conceptmappings/resource-codes/loinc-code';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {RxNormCodeGroup} from '../conceptmappings/resource-codes/rx-norm-group';\nimport {AnnotatedDiagnosticReport} from '../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReport} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration} from '../fhir-resources/medication-administration';\nimport {MedicationOrder} from '../fhir-resources/medication-order';\nimport {MicrobioReport} from '../fhir-resources/microbio-report';\nimport {Observation} from '../fhir-resources/observation';\n\n@Injectable()\nexport abstract class FhirService {\n protected loadAllCodes = this.resourceCodeCreator.loadAllConcepts;\n\n constructor(private resourceCodeCreator: ResourceCodeCreator) {}\n\n /**\n * Returns whether there are any observations with this code in the given\n * time range.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n abstract observationsPresentWithCode(code: LOINCCode, dateRange: Interval):\n Promise;\n\n /**\n * Returns whether there are any microbio Reports with this code in the given\n * time range.\n * @param code The BCHMicrobio code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n microbioReportsPresentWithCodes(\n codeGroup: BCHMicrobioCodeGroup, dateRange: Interval): Promise {\n // Just ask for one result to reduce the call time.\n return this.getMicrobioReports(codeGroup, dateRange, 1)\n .then(reports => reports.length > 0, rejection => {\n // If any MicrobioReports for this code results in an error, do not\n // show any MicrobioReports at all.\n throw rejection;\n });\n }\n\n /**\n * Checks which RxNormCodes are present within the App Timespan.\n *\n * @returns A Promise that resolves to the Set of RxNormCodes with data\n * available.\n */\n abstract dataAvailableForMedications(): Promise>;\n\n /**\n * Returns whether there are any annotated diagnosticreports with this code in\n * the given time range.\n * @param code The resource code (for diagnostic reports) for which to get\n * observations.\n * @param dateRange The time interval observations should fall between.\n */\n diagnosticReportsPresentWithCodes(\n codeGroup: DiagnosticReportCodeGroup,\n dateRange: Interval): Promise {\n // Just ask for one result to reduce the call time.\n return this.getAnnotatedDiagnosticReports(codeGroup, dateRange, 1)\n .then(reports => reports.length > 0, rejection => {\n // If any AnnotatedDiagnosticReports for this code results in an\n // error, do not show any AnnotatedDiagnosticReports at all.\n throw rejection;\n });\n }\n\n /**\n * Gets observations from a specified date range with a specific LOINC code.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n * @param limitCount If provided, the maximum number of observations to\n * query for.\n */\n abstract getObservationsWithCode(\n code: LOINCCode,\n dateRange: Interval,\n ): Promise;\n\n /**\n * Gets observations from a specified date range with a specific code group.\n * @param codeGroup The LOINCCodeGroup code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n * @returns The observations if there's a valid code group or date range.\n */\n getObservationsForCodeGroup(codeGroup: LOINCCodeGroup, dateRange: Interval):\n Promise {\n if (!codeGroup || !dateRange) {\n return of([]).toPromise();\n }\n const observationPromises = new Array>();\n for (const c of codeGroup.resourceCodes) {\n if (c instanceof LOINCCode) {\n observationPromises.push(this.getObservationsWithCode(c, dateRange));\n }\n }\n return Promise.all(observationPromises);\n }\n\n /**\n * Returns whether there are any observations with this code in the given\n * time range.\n * @param code The RxNorm code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n abstract medicationsPresentWithCode(code: RxNormCode, dateRange: Interval):\n Promise;\n\n /**\n * Gets medication data from a specified date range with a specific Rx code\n * group.\n * @param codeGroup The RxNormCode code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n abstract getMedicationAdministrationsWithCodes(\n codes: RxNormCode[],\n dateRange: Interval): Promise;\n\n /**\n * Gets medication data from a specified date range with specific Rx codes,\n * since multiple medications are displayed on a single chart.\n * @param codes The RxNormCode codes for which to get observations.\n * @param dateRanges The time interval observations should fall between.\n */\n getMedicationAdministrationsWithCodeGroup(\n group: RxNormCodeGroup,\n dateRange: Interval): Promise {\n if (!group || !dateRange) {\n return of([]).toPromise();\n }\n return this.getMedicationAdministrationsWithCodes(\n (group.resourceCodes as RxNormCode[]), dateRange);\n }\n\n /**\n * Gets the order for specified order id.\n * @param id The id to pull the order from.\n */\n abstract getMedicationOrderWithId(id: string): Promise;\n\n /**\n * Gets the encounters for the patient for any encounter that falls in the\n * given date range.\n * @param dateRange Return all encounters that covered any time in this\n * date range.\n */\n abstract getEncountersForPatient(dateRange: Interval): Promise;\n\n /**\n * Saves the current image of the graphs rendered as a DocumentReference\n * (static save).\n * @param image The image to save in the Document.\n * @param date The date the note was written on.\n */\n abstract saveStaticNote(image: HTMLCanvasElement, date: string):\n Promise;\n\n /**\n * Gets the MicrobioReports for the patient for any report that falls in\n * the given date range.\n * @param codeGroup The CodeGroup to retrieve DiagnosticReports for.\n * @param dateRange Return all DiagnosticReports that covered any time in this\n * date range.\n */\n abstract getMicrobioReports(\n codeGroup: BCHMicrobioCodeGroup, dateRange: Interval,\n limitCount?: number): Promise;\n\n /**\n * Gets the DiagnosticReports for the patient for any report that falls in\n * the given date range.\n * @param codeGroup The CodeGroup to retrieve DiagnosticReports for.\n * @param dateRange Return all DiagnosticReports that covered any time in this\n * date range.\n */\n abstract getAnnotatedDiagnosticReports(\n codeGroup: DiagnosticReportCodeGroup, dateRange: Interval,\n limitCount?: number): Promise;\n\n /**\n * Helper function to getAnnotatedDiagnosticReports() that makes the http\n * calls to get the corresponding html attachments. Creates a new\n * AnnotatedDiagnosticReport that includes the html attachment.\n *\n * @param report DiagnosticReport that will be edited to include the\n * html attachment in string format\n */\n addAttachment(report: DiagnosticReport): Promise {\n if (report.presentedForm) {\n for (const presented of report.presentedForm) {\n // Currently Cerner only supports text/html files and not pdf\n if (presented.contentType === 'text/html') {\n return this.getAttachment(presented.url).then(html => {\n return new AnnotatedDiagnosticReport(report, html);\n });\n }\n }\n }\n // If there is no presentedForm section in the report or none of the\n // presentedForm contentTypes are 'text/html', return the annotated\n // diagnostic report without the attachment.\n return Promise.resolve(new AnnotatedDiagnosticReport(report));\n }\n\n /**\n * Helper function that makes the HTTP call to get the html attachment.\n * The responseType will always be text, and not the default json.\n * If any error exists, it will catch the http error and return the message\n *\n * We will overwrite the abstract function because http and mock have\n * different authentication processes.\n * @param url Fhir link to location of data\n */\n abstract getAttachment(url: string): Promise;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {HttpClient} from '@angular/common/http';\nimport {Injectable} from '@angular/core';\nimport {DateTime, Interval} from 'luxon';\nimport {FhirResourceType} from 'src/constants';\nimport {v4 as uuid} from 'uuid';\n\nimport {environment} from '../../environments/environment';\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {BCHMicrobioCodeGroup} from '../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCodeGroup} from '../conceptmappings/resource-codes/diagnostic-report-code';\nimport {LOINCCode} from '../conceptmappings/resource-codes/loinc-code';\nimport {ResourceCode} from '../conceptmappings/resource-codes/resource-code-group';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {AnnotatedDiagnosticReport} from '../fhir-resources/annotated/annotated-diagnostic-report';\nimport {AnnotatedMicrobioReport} from '../fhir-resources/annotated/annotated-microbio-report';\nimport {DiagnosticReport} from '../fhir-resources/diagnostic-report';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {MedicationAdministration} from '../fhir-resources/medication-administration';\nimport {MedicationOrder} from '../fhir-resources/medication-order';\nimport {MicrobioReport} from '../fhir-resources/microbio-report';\nimport {Observation, ObservationStatus} from '../fhir-resources/observation';\n\nimport {FhirService} from './fhir.service';\n\n@Injectable()\nexport class MockFhirService extends FhirService {\n private readonly assetPath = './assets/' + environment.mockDataFolder + '/';\n private readonly allFilePaths =\n environment.mockDataFiles.map(x => this.assetPath + x + '.json');\n\n private readonly loincMap = new Map();\n private readonly medicationAdministrationMapByCode =\n new Map();\n private readonly medicationAdministrationMapByOrderId =\n new Map();\n private readonly medicationOrderMap = new Map();\n private readonly diagnosticReportMap =\n new Map();\n private readonly encounters = new Array();\n private microbioJson: JSON;\n\n loadAllData: Promise = this.loadAllCodes.then(\n () => Promise.all(this.allFilePaths.map(filePath => {\n return this.http.get(filePath).toPromise().then(data => {\n if (filePath.includes('_MB_data')) {\n this.microbioJson = data;\n }\n try {\n let entry = data.entry;\n // Sometimes data comes to us in bundles, and then we want to\n // flatten it into a series of resources.\n if (data.length > 0) {\n entry = data.map(bundle => bundle.entry).flat();\n }\n for (const json of entry) {\n const mockRequestId = uuid();\n const resourceType = json.resource.resourceType;\n if (resourceType === FhirResourceType.Observation) {\n this.constructResourceMap(\n json, this.loincMap,\n (x: any) => new Observation(x, mockRequestId),\n (obs) => obs.codes);\n }\n\n if (resourceType === FhirResourceType.MedicationAdministration) {\n this.constructResourceMap(\n json, this.medicationAdministrationMapByCode,\n (d) => new MedicationAdministration(d, mockRequestId),\n (admin) => [admin.rxNormCode]);\n\n this.constructResourceMap(\n json, this.medicationAdministrationMapByOrderId,\n (d) => new MedicationAdministration(d, mockRequestId),\n (admin) => [admin.medicationOrderId]);\n }\n\n if (resourceType === FhirResourceType.MedicationOrder) {\n this.constructResourceMap(\n json, this.medicationOrderMap,\n (d) => new MedicationOrder(d, mockRequestId),\n (order) => [order.orderId]);\n }\n\n if (resourceType === FhirResourceType.Encounter) {\n const encounter = new Encounter(json.resource, mockRequestId);\n this.encounters.push(encounter);\n }\n\n // Not used for microbio data, but only for diagnosticReport data\n if (resourceType === FhirResourceType.DiagnosticReport) {\n this.constructResourceMap(\n json, this.diagnosticReportMap,\n (d) => new DiagnosticReport(d, mockRequestId),\n (report) => [report.code]);\n }\n }\n } catch {\n console.warn(\n 'Trouble reading file: ' + filePath +\n '. Continuing on since this is the mock server.');\n }\n });\n })));\n\n\n constructor(\n private http: HttpClient, resourceCodeCreator: ResourceCodeCreator) {\n super(resourceCodeCreator);\n }\n\n private constructResourceMap(\n json: any, mapToUpdate: Map, constructorFn: (any) => V,\n getCodesFn: (value: V) => K[]) {\n try {\n const obj = constructorFn(json.resource);\n const uniqueCodes = Array.from(new Set(getCodesFn(obj)));\n for (const code of uniqueCodes) {\n let existing = mapToUpdate.get(code);\n if (!existing) {\n existing = [];\n }\n existing.push(obj);\n mapToUpdate.set(code, existing);\n }\n } catch (err) {\n // tslint:disable-next-line:no-console\n console.debug(err);\n }\n }\n\n /**\n * Gets observations from a specified date range with a specific LOINC code.\n * @param code The LOINC code for which to get observations.\n * @param dateRange The time interval observations should fall between.\n * @param limitCount If set, the number of observations that should be\n * queried for\n */\n getObservationsWithCode(\n code: LOINCCode,\n dateRange: Interval,\n ): Promise {\n return this.loadAllData.then(\n map => this.getObservations(this.loincMap, code, dateRange));\n }\n\n private getObservations(\n map: Map, code: LOINCCode,\n dateRange: Interval) {\n return map.has(code) ?\n map.get(code)\n .filter(obs => dateRange.contains(obs.timestamp))\n .filter(obs => obs.status !== ObservationStatus.EnteredInError) :\n [];\n }\n\n observationsPresentWithCode(code: LOINCCode, dateRange: Interval):\n Promise {\n return this.loadAllData.then(\n () => this.getObservationsWithCode(code, dateRange)\n .then(results => results.length > 0));\n }\n\n /**\n * Gets medication data from a specified date range with a specific Rx code\n * @param code The RxNormCode codes for which to get observations.\n * @param dateRange The time interval observations should fall between.\n */\n getMedicationAdministrationsWithCodes(\n codes: RxNormCode[],\n dateRange: Interval): Promise {\n return this.loadAllData.then(\n () => {\n const allMedAdmins = new Array();\n this.medicationAdministrationMapByCode.forEach((medAdmins, code) => {\n if (codes.includes(code)) {\n allMedAdmins.push(...medAdmins.filter(\n medAdmin => dateRange.contains(medAdmin.timestamp)));\n }\n });\n return Promise.resolve(allMedAdmins);\n },\n rejection => {\n throw rejection;\n });\n }\n\n dataAvailableForMedications() {\n return this.loadAllData.then(() => {\n return new Set(this.medicationAdministrationMapByCode.keys());\n });\n }\n\n medicationsPresentWithCode(code: RxNormCode, dateRange: Interval):\n Promise {\n return this.loadAllData.then(\n () => this.getMedicationAdministrationsWithCodes([code], dateRange)\n .then(obs => obs.length > 0, rejection => {\n // If any MedicationAdministration for this code results\n // in an error, do not show any MedicationAdministrations\n // at all.\n throw rejection;\n }));\n }\n\n /**\n * Returns arbitrary orders for current mock medications.\n * @param id The id to pull the order from.\n */\n getMedicationOrderWithId(id: string): Promise {\n return this.loadAllData.then(\n x => this.medicationOrderMap.has(id) ?\n this.medicationOrderMap.get(id)[0] :\n undefined);\n }\n\n /**\n * Gets the encounters for the patient for any encounter that falls in the\n * given date range.\n * @param dateRange Return all encounters that covered any time in this\n * date range.\n */\n getEncountersForPatient(dateRange: Interval): Promise {\n return this.loadAllData.then(\n x => this.encounters.filter(\n encounter => dateRange.intersection(encounter.period) !== null &&\n encounter.period.start >= DateTime.utc().minus({years: 1})));\n }\n\n /**\n * Prints the current HTML of the graphs rendered to the console.\n * @param html The inner HTML to keep in the Document.\n * @param date The date the note was written for.\n */\n saveStaticNote(image: HTMLCanvasElement, date: string): Promise {\n console.log('Save to note button clicked for mock data for date: ' + date);\n console.log(image);\n return Promise.resolve(true);\n }\n\n /**\n * Gets the MicrobioReports for the patient for any report that falls in\n * the given date range, whose contained Observations are in the codeGroup\n * provided.\n * @param codeGroup The CodeGroup to retrieve MicrobioReports for.\n * @param dateRange Return all MicrobioReports that covered any time in\n * this date range.\n */\n getMicrobioReports(\n codeGroup: BCHMicrobioCodeGroup, dateRange: Interval,\n limitCount?: number): Promise {\n return this.loadAllData.then(x => {\n const microbioReports =\n MicrobioReport\n .parseAndFilterMicrobioData(this.microbioJson, codeGroup)\n .filter(\n report => dateRange.contains(\n new AnnotatedMicrobioReport(report).timestamp));\n return microbioReports.slice(0, limitCount ? limitCount : undefined);\n });\n }\n\n /**\n * Gets the AnnotatedDiagnosticReports for the patient for any report that\n * falls in the given date range, whose contained Observations are in the\n * codeGroup provided. Gets the html attachments linked in the json files as\n * well.\n *\n * We are returning AnnotatedDiagnosticReport rather than DiagnosticReport\n * because we need to access the html attachments.\n * @param codeGroup The CodeGroup to retrieve DiagnosticReports for.\n * @param dateRange Return all AnnotatedDiagnosticReports that covered any\n * time in this date range.\n */\n getAnnotatedDiagnosticReports(\n codeGroup: DiagnosticReportCodeGroup, dateRange: Interval,\n limitCount?: number): Promise {\n return this.loadAllData.then(x => {\n const annotatedReportsArr =\n new Array>();\n for (const code of codeGroup.resourceCodes) {\n if (this.diagnosticReportMap.has(code)) {\n const reports = this.diagnosticReportMap.get(code);\n for (const report of reports) {\n annotatedReportsArr.push(this.addAttachment(report));\n }\n }\n }\n return Promise.all(annotatedReportsArr).then(annotatedReports => {\n annotatedReports = annotatedReports.filter(\n report => dateRange.contains(report.timestamp));\n return annotatedReports.slice(0, limitCount ? limitCount : undefined);\n });\n });\n }\n\n /**\n * Helper function that makes the HTTP call to get the html attachment.\n * The responseType will always be text, and not the default json.\n * If any error exists, it will catch the http error and return the message\n * @param url Fhir link to location of data\n */\n getAttachment(url: string): Promise {\n return this.http.get(url, {responseType: 'text'})\n .toPromise()\n .then((res: any) => res)\n .catch((err => err.message));\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {InjectionToken} from '@angular/core';\nexport let SMART_ON_FHIR_CLIENT = new InjectionToken('SmartOnFhirClient');\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime} from 'luxon';\nimport {CustomizableGraphAnnotation} from '../graphtypes/customizable-graph/customizable-graph-annotation';\n\nimport {GraphData} from './graphdata';\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * CustomizableData holds a time-based series to which a user can add more\n * points.\n */\nexport class CustomizableData extends GraphData {\n /** The display bounds of the y-axis. */\n readonly yAxisDisplayBounds: [number, number];\n\n private constructor(\n series: LabeledSeries,\n /**\n * The annotations for this customizable graph. If populated, holds a\n * map from a number representation of a Date to\n * CustomizableGraphAnnotation for the corresponding point.\n */\n readonly annotations: Map,\n regions?: any[]) {\n super(\n [series], undefined, // tooltip map\n undefined, // tooltip key function\n regions);\n this.annotations = annotations;\n this.yAxisDisplayBounds = [0, 10];\n }\n\n static defaultEmptySeries() {\n return new CustomizableData(\n LabeledSeries.emptySeries(),\n new Map());\n }\n\n /**\n * Adds a point to the series in this CustomizableData object.\n * @param annotation: The annotation to add in to the graph.\n */\n addPointToSeries(annotation: CustomizableGraphAnnotation) {\n // This method assumes there is only 1 series.\n this.series[0].coordinates.push([annotation.timestamp, 0]);\n this.annotations.set(annotation.timestamp.toMillis(), annotation);\n }\n\n /**\n * Removes a point from the series in this CustomizableData object, as well as\n * the corresponding annotation.\n * @param date The date for this point to remove.\n */\n removePointFromSeries(date: DateTime) {\n const index = this.series[0].coordinates.findIndex(\n c => c[0].toMillis() === date.toMillis());\n this.series[0].coordinates.splice(index, 1);\n this.annotations.delete(date.toMillis());\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\n\nimport {AnnotatedDiagnosticReport} from '../../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReport} from '../../fhir-resources/diagnostic-report';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {DiagnosticTooltip} from '../graphtypes/tooltips/diagnostic-tooltips';\n\nimport {LabeledSeries} from './labeled-series';\nimport {StepGraphData} from './stepgraphdata';\n\n/**\n * DiagnosticGraphData holds configurations for a diagnosticReport graph. The\n * format of a diagnostic graph is simliar to a step graph in that each y-axis\n * position represents a report category, and points plotted along\n * that position represent results for that test.\n */\n\nexport class DiagnosticGraphData extends StepGraphData {\n private constructor(\n endpointSeries: LabeledSeries[],\n tooltipMap: Map) {\n super(endpointSeries, tooltipMap, undefined);\n }\n\n /**\n * Converts a list of DiagnosticReports to a StepGraphData object\n * @param diagnosticReports A list of DiagnosticReports to display.\n * @returns a new DiagnosticGraphData for this set.\n */\n static fromDiagnosticReports(\n annotatedDiagnosticReports: AnnotatedDiagnosticReport[],\n sanitizer: DomSanitizer): DiagnosticGraphData {\n const points: LabeledSeries[] = [];\n\n // The key of the map is the DateTime timestamp while the values\n // of the map is an array contains AnnotatedTooltip (the innerhtml\n // of the tooltip chart, optional html of the attachment, and optional id).\n const tooltipMap = new Map();\n\n // Iterate through diagnosticReports to generate tooltips and\n // values for the DiagnosticGraphData\n for (const annotatedReport of annotatedDiagnosticReports) {\n // Adding a new DiagnosticTooltip to the tooltipMap.\n // If there is already a tooltip at the timestamp, we do not\n // overwrite the existing tooltip but rather add to it.\n if (tooltipMap.has(annotatedReport.timestamp.toMillis().toString())) {\n const existingTT =\n tooltipMap.get(annotatedReport.timestamp.toMillis().toString());\n const newTT =\n new DiagnosticTooltip(false).getTooltip(annotatedReport, sanitizer);\n existingTT.push(newTT);\n } else {\n // If there is no existing tooltip, we create a new tooltip.\n tooltipMap.set(\n annotatedReport.timestamp.toMillis().toString(),\n [new DiagnosticTooltip().getTooltip(annotatedReport, sanitizer)]);\n }\n // Pushing the LabeledSeries generated from the Diagnostic\n // Report to generate a new DiagnosticGraphData\n for (const series of LabeledSeries.fromDiagnosticReport(\n annotatedReport, annotatedReport.timestamp)) {\n points.push(series);\n }\n }\n return new DiagnosticGraphData(points, tooltipMap);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\n\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\n\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * The base class for holding data pertaining to one graph.\n */\nexport class GraphData {\n // The number of decimal places to show for any value associated with this\n // GraphData. The default is 0, to minimize errors caused by unnecessary\n // trailing zeros.\n precision = 0;\n\n constructor(\n /** A list of the series to be displayed on the graph. */\n readonly series: LabeledSeries[] = [],\n\n /**\n * A map to provide tooltips.\n * This is a bit complicated. c3's API lets you specify a function call\n * that will provide the HTML content for any given point's tooltip.\n * As a parameter, it passes in one or more data points:\n * https://c3js.org/reference.html#tooltip-contents\n * so when the tooltip is rendered, all you have is the plotted\n * information. As far as I can tell, that data structure is undocumented.\n * Upon inspection, the data point includes which series it belongs to,\n * the x value, and the y value, so if you want to render a custom\n * tooltip, you have to be able to derive all the information you need\n * from those values.\n * tooltipMap, alongside tooltipKeyFn, helps with this process.\n * If you call tooltipKeyFn on the data object passed into the c3 contents\n * function, it should yield the key into tooltipMap that will let you\n * look up the appropriate tooltip for that data point. If tooltipKeyFn\n * is unset, then we fall back to the default lookup, which is by x-value.\n *\n * The value of the map is an AnnotatedTooltip[] that contains additional\n * values that need more processing before it can be displayed, an\n * optional id, and a string representing the innerhtml that we want to\n * display as the tooltip\n */\n readonly tooltipMap?: Map,\n /**\n * See documentation on tooltipMap for more detail. tooltipKeyFn\n * takes in a graph data point and returns the key into tooltipMap that\n * provides the tooltip for that data point.\n */\n readonly tooltipKeyFn?: (graphData: any) => string,\n /**\n * A list of x-axis regions to display on the graph.\n */\n readonly xRegions = new Array<[DateTime, DateTime]>()) {}\n\n /*\n * Returns whether or not there are any data points in the series that fall\n * inside the date range provided.\n * @param series The LabeledSeries to find data points in the date range.\n * @param dateRange The date range in which to see if there are any data\n * points.\n */\n dataPointsInRange(dateRange: Interval): boolean {\n const entireRange = Interval.fromDateTimes(\n dateRange.start.toLocal().startOf('day'),\n dateRange.end.toLocal().endOf('day'));\n for (const s of this.series) {\n if (s.hasPointInRange(entireRange)) {\n return true;\n }\n }\n return false;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Interval} from 'luxon';\n\nimport {AnnotatedDiagnosticReport} from '../../fhir-resources/annotated/annotated-diagnostic-report';\nimport {DiagnosticReportStatus} from '../../fhir-resources/diagnostic-report';\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {MedicationAdministration} from '../../fhir-resources/medication-administration';\nimport {AnnotatedMedicationOrder, MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {MicrobioReport} from '../../fhir-resources/microbio-report';\nimport {CHECK_RESULT_CODE, NORMAL} from '../../fhir-resources/observation-interpretation-valueset';\nimport {ObservationSet} from '../../fhir-resources/sets/observation-set';\n// tslint:disable-next-line:max-line-length\nimport {DisplayGrouping, negFinalMB, negOtherMB, negPrelimMB, posFinalMB, posOtherNB, posPrelimMB, radiology} from '../../conceptmappings/resource-codes/display-grouping';\nimport {LegendInfo} from '../graphtypes/legend-info';\n\n/**\n * Timeseries data, represented as a list of tuples,\n * with metadata including a human-readable label, a unit, and a typical range.\n * Used for most charts to display a changing value over time. Multiple\n * LabeledSeries may appear on the same graph.\n */\nexport class LabeledSeries {\n /**\n * The y units for this series.\n */\n unit: string;\n\n /**\n * The DisplayGrouping this LabeledSeries corresponds to.\n */\n concept: DisplayGrouping;\n\n /**\n * A map of DateTimes to corresponding tuples representing the low and high\n * bounds of what should be considered \"normal\" along the y-axis.\n */\n normalRanges = new Map();\n\n /**\n * This is the desired display range for the y-axis for this series. We\n * calculate it as as:\n * [minimum(yNormalBounds, yValues), maximum(yNormalBounds, yValues)]\n */\n readonly yDisplayBounds: [number, number];\n\n constructor(\n /** The descriptive label of the data series. */\n readonly label: string,\n /**\n * The coordinate set for the series. The y-coordinates may be strings\n * or numbers, depending on whether this is a categorical or numerical\n * graph.\n */\n readonly coordinates: Array<[DateTime, string|number, string?]>,\n /** The y-axis unit for this series. */\n unit?: string,\n /**\n * Holds information about how this series should be displayed.\n */\n readonly legendInfo?: LegendInfo,\n /**\n * The x-coordinate values in the labeled series that should be marked as\n * abnormal because of their interpretation results.\n */\n readonly abnormalCoordinates = new Set(),\n /**\n * A map of DateTimes to corresponding tuples representing the low and\n * high bounds of what should be considered \"normal\" along the y-axis.\n */\n normalRanges?: Map,\n /**\n * The DisplayGrouping associated with this LabeledSeries.\n */\n concept?: DisplayGrouping) {\n // Sort the coordinates by x-value.\n this.coordinates = coordinates.sort((a, b) => {\n return a[0].toMillis() - b[0].toMillis();\n });\n this.unit = unit;\n\n // If a specific legend wasn't passed through then we generate one for the\n // series.\n this.legendInfo = legendInfo || new LegendInfo(label);\n\n this.concept = concept;\n this.normalRanges = normalRanges;\n\n /**\n * Calculate the y axis display bounds by finding the outer boundaries of\n * the data and the normal range.\n */\n\n const yValues = this.coordinates.map(c => c[1]).filter(x => x !== null);\n\n if (yValues.map(val => typeof val === 'number').some(x => x === false)) {\n return;\n }\n this.yDisplayBounds =\n [Math.min.apply(Math, yValues), Math.max.apply(Math, yValues)];\n }\n\n /**\n * Generates an empty LabeledSeries.\n */\n static emptySeries() {\n return new LabeledSeries('', []);\n }\n\n\n /**\n * Generates a LabeledSeries from the given ObservationSet.\n * @param observationSet The ObservationSet to chart.\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n */\n static fromObservationSet(\n observationSet: ObservationSet, encounters: Encounter[]): LabeledSeries {\n let coordinates: Array<[DateTime, number]> = [];\n const observations = observationSet.resourceList;\n const abnormal = new Set();\n for (const obs of observations) {\n coordinates.push([\n obs.observation.timestamp,\n obs.observation.value ? obs.observation.value.value : null\n ]);\n\n const outsideNormalRange = obs.observation.normalRange &&\n (obs.observation.value.value < obs.observation.normalRange[0] ||\n obs.observation.value.value > obs.observation.normalRange[1]);\n\n if ((obs.observation.interpretation &&\n obs.observation.interpretation.code !== NORMAL) ||\n outsideNormalRange) {\n abnormal.add(obs.observation.timestamp.toISO());\n }\n }\n\n coordinates = this.addEncounterEndpoints(coordinates, encounters);\n return new LabeledSeries(\n observationSet.label, coordinates, observationSet.unit,\n undefined, // legendInfo,\n abnormal, observationSet.normalRanges);\n }\n\n /**\n * Generates a LabeledSeries from the given list of discrete resulted-\n * ObservationSets.\n * For Observations with discrete values, such as \"yellow\"\n * for the color of urine, we group all ObservationSets into one\n * LabeledSeries, at a specific yValue.\n * @param observationSets The discrete ObservationSets to chart.\n * @param yValue The numerical y-value to map to this ObservationSet with\n * discrete results.\n * @param label The label for this LabeledSeries.\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n */\n static fromObservationSetsDiscrete(\n observationSets: ObservationSet[], yValue: number, label,\n encounters: Encounter[]): LabeledSeries {\n let coordinates: Array<[DateTime, number | string]> = [];\n const abnormal = new Set();\n for (const obsSet of observationSets) {\n const observations = obsSet.resourceList;\n for (const obs of observations) {\n coordinates.push([obs.observation.timestamp, yValue]);\n\n if (obs.observation.interpretation &&\n obs.observation.interpretation.code !== NORMAL) {\n abnormal.add(obs.observation.timestamp.toISO());\n }\n const outsideNormalRange = obs.observation.normalRange &&\n (obs.observation.value.value < obs.observation.normalRange[0] ||\n obs.observation.value.value > obs.observation.normalRange[1]);\n\n if (obs.observation.value && obs.observation.value.value &&\n outsideNormalRange) {\n abnormal.add(obs.observation.timestamp.toISO());\n }\n }\n }\n coordinates = this.addEncounterEndpoints(coordinates, encounters);\n return new LabeledSeries(\n label, coordinates,\n undefined, // unit\n undefined, // legend info,\n abnormal // abnormal points\n );\n }\n\n /**\n * Generates a set of LabeledSeries from the given MedicationOrderSet. It will\n * return one series for all the orders together since the order set\n * represents all orders for the same medication.\n * @param medOrderSet The MedicationOrderSet to chart.\n * @param dateRange The date range displayed on the chart.\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n * @param categoricalYPosition If set, we use this y-position for all the\n * datapoints in both returned series. If unset, we use the dosage\n * quantity for each administration as the y-value.\n */\n static fromMedicationOrderSet(\n medOrderSet: MedicationOrderSet, dateRange: Interval,\n encounters: Encounter[], categoricalYPosition?: string): LabeledSeries {\n const data: LabeledSeries[] = [];\n for (const medOrder of medOrderSet.resourceList) {\n // The first series in fromMedicationOrder is all the administrations.\n // The second series (unused in this function) is the end points only.\n data.push(LabeledSeries.fromMedicationOrder(\n medOrder, dateRange, categoricalYPosition)[0]);\n }\n\n // Combine all the series into a single series so that it shows up with\n // the same color.\n let coords = [];\n for (const series of data) {\n for (const coord of series.coordinates) {\n coords.push(coord);\n }\n }\n\n coords = this.addEncounterEndpoints(coords, encounters);\n return new LabeledSeries(\n medOrderSet.label, coords, medOrderSet.unit,\n undefined, // legendInfo\n undefined, // abnormal points\n // Always keep normalRanges undefined for MedicationOrder-based\n // LabeledSeries, as we only show normal ranges for Observations with a\n // normal range given in the data.\n undefined, // normalRanges\n medOrderSet.rxNormCode ? medOrderSet.rxNormCode.displayGrouping :\n undefined);\n }\n\n /**\n * Generates a set of LabeledSeries from the given MedicationOrder. For each\n * order, there are two LabeledSeries -- one for the corresponding\n * MedicationAdministrations, and one for the endpoints displayed for the\n * order.\n * @param annotatedOrder The AnnotatedMedicationOrder to chart.\n * @param dateRange The date range displayed on the chart.\n * @param categoricalYPosition If set, we use this categorical y-position\n * for all the datapoints in both returned series. If unset, we use the\n * dosage quantity for each administration as the numerical y-value.\n */\n static fromMedicationOrder(\n annotatedOrder: AnnotatedMedicationOrder, dateRange: Interval,\n categoricalYPosition?: string): LabeledSeries[] {\n const coordinates = new Array<[DateTime, string | number, string?]>();\n const endpointCoordinates = new Array<[DateTime, string | number]>();\n const medAdminsForOrder = annotatedOrder.medicationAdministrationSet;\n\n const label = annotatedOrder.label + annotatedOrder.order.orderId;\n const legend = annotatedOrder.order.rxNormCode.displayGrouping;\n\n if (medAdminsForOrder) {\n for (const annotatedAdmin of medAdminsForOrder.resourceList) {\n coordinates.push([\n annotatedAdmin.medAdministration.timestamp,\n this.getYPositionForMed(\n annotatedAdmin.medAdministration, categoricalYPosition)\n ]);\n }\n // We add the beginning and end time stamp if the order is not fully\n // displayed-- so that no dashes are displayed when an order is being\n // carried over from before the time window displayed.\n // We only display an endpoint for a MedicationOrder if the\n // endpoint is visible -- that is, if the time of the first\n // Administration of the order is during or after the beginning of the\n // time range of the chart, and if the time of the last Administration\n // of the order is before the end of the chart's time range.\n const firstAdministrationIsAfterStartTime =\n annotatedOrder.firstAdministration.timestamp.toMillis() >=\n dateRange.start.toMillis();\n const lastAdministrationIsBeforeEndTime =\n annotatedOrder.lastAdministration.timestamp.toMillis() <=\n dateRange.end.toMillis();\n\n if (firstAdministrationIsAfterStartTime) {\n endpointCoordinates.push([\n annotatedOrder.firstAdministration.timestamp,\n this.getYPositionForMed(\n annotatedOrder.firstAdministration, categoricalYPosition)\n ]);\n } else if (\n categoricalYPosition &&\n (annotatedOrder.lastAdministration.timestamp.toMillis() >\n dateRange.start.toMillis())) {\n // Only add a point for continuity if we have a fixed y position.\n coordinates.push([dateRange.start, categoricalYPosition]);\n }\n if (lastAdministrationIsBeforeEndTime) {\n endpointCoordinates.push([\n annotatedOrder.lastAdministration.timestamp,\n this.getYPositionForMed(\n annotatedOrder.lastAdministration, categoricalYPosition)\n ]);\n } else if (\n categoricalYPosition &&\n annotatedOrder.firstAdministration.timestamp.toMillis() <\n dateRange.end.toMillis()) {\n // Only add a point for continuity if we have a fixed y position.\n coordinates.push([dateRange.end, categoricalYPosition]);\n }\n }\n\n return [\n new LabeledSeries(\n label, coordinates, medAdminsForOrder.unit, legend,\n undefined, // abnormal points\n // Always keep normalRanges undefined for MedicationOrder-based\n // LabeledSeries, as we only show normal ranges for Observations with\n // a normal range given in the data.\n undefined, // normalRanges\n annotatedOrder.order.rxNormCode.displayGrouping),\n new LabeledSeries(\n 'endpoint' + label, endpointCoordinates, medAdminsForOrder.unit,\n legend)\n ];\n }\n\n /**\n * Generates a LabeledSeries from the given initial date and y-value.\n * @param date The DateTime corresponding to the initial point to chart.\n * @param yValue The y-value for the initial point to chart.\n */\n static fromInitialPoint(date: DateTime, yValue: number) {\n return new LabeledSeries('', [[date, yValue]]);\n }\n\n /**\n * Generates LabeledSeries from the given MicrobioReport.\n * @param report The MicrobioReport to chart.\n * @param date the DateTime corresponding to the Observations in the\n * MicrobioReport.\n */\n static fromMicrobioReport(report: MicrobioReport, date: DateTime):\n LabeledSeries[] {\n const series = [];\n const interpretationMap = new Map>();\n // Sort results by interpretation, and make a LabeledSeries for each.\n for (const observation of report.results) {\n const categoricalYValue = observation.display;\n const interpretation = observation.interpretation.code;\n if (interpretationMap.get(interpretation)) {\n const existing = interpretationMap.get(interpretation);\n existing.push([date, categoricalYValue]);\n interpretationMap.set(interpretation, existing);\n } else {\n interpretationMap.set(interpretation, [[date, categoricalYValue]]);\n }\n }\n // Make a LabeledSeries for each interpretation.\n for (const interpretation of Array.from(interpretationMap.keys())) {\n const seriesLabel =\n report.id + '-' + interpretation + '-' + report.status;\n const isPositive = seriesLabel.includes(CHECK_RESULT_CODE);\n series.push(new LabeledSeries(\n // Encode the status and interpretation into the series name so that\n // we can use d3 later on to filter the data points and display them\n // with the correct styling.\n seriesLabel, interpretationMap.get(interpretation),\n undefined, // unit\n LabeledSeries.getLegendInfoFromResult(report.status, isPositive)));\n }\n return series;\n }\n\n /**\n * Returns the correct legend info for a microbio report.\n * @param status The MicrobioReport's status.\n * @param isPositive Whether the report appears to be positive.\n * @returns The correct legend info for the report.\n */\n private static getLegendInfoFromResult(\n status: DiagnosticReportStatus, isPositive: boolean): LegendInfo {\n if (isPositive) {\n if (status === DiagnosticReportStatus.Preliminary) {\n return posPrelimMB;\n } else if (status === DiagnosticReportStatus.Final) {\n return posFinalMB;\n }\n return posOtherNB;\n } else {\n if (status === DiagnosticReportStatus.Preliminary) {\n return negPrelimMB;\n } else if (status === DiagnosticReportStatus.Final) {\n return negFinalMB;\n }\n return negOtherMB;\n }\n }\n\n /**\n * Generates LabeledSeries from the given DiagnosticReport.\n * @param report The DiagnosticReport to chart.\n * @param date the DateTime corresponding to the Observations in the\n * DiagnosticReport.\n */\n static fromDiagnosticReport(\n annotatedReport: AnnotatedDiagnosticReport,\n date: DateTime): LabeledSeries[] {\n const report = annotatedReport.report;\n const seriesLabel = report.id + '-' +\n (annotatedReport.report ? annotatedReport.report.category :\n 'unnamedReport');\n let coordinates: Array<[DateTime, number | string]> = [];\n\n // We are setting the coordinates to the category of the document (RADRPT,\n // CT Report, etc.)\n coordinates = [[report.timestamp, report.category]];\n const series = [new LabeledSeries(\n seriesLabel, coordinates,\n undefined, // unit\n radiology)];\n return series;\n }\n\n private static getYPositionForMed(\n medAdmin: MedicationAdministration, categoricalYPosition: string): string\n |number {\n return categoricalYPosition !== undefined && categoricalYPosition !== null ?\n categoricalYPosition :\n medAdmin.dosage.quantity;\n }\n\n private static addEncounterEndpoints(\n coordinates: any[], encounters: Encounter[]): any[] {\n if (coordinates.length > 0) {\n // If any encounters are set for this MedicationOrderSet, add null values\n // to the endpoints of encounters to ensure line breakage between points\n // of different encounters.\n // We assume that encounter endpoints correspond to correct line breaks,\n // and do not cross-check encounter id's of MedicationOrders or\n // MedicationAdministrations.\n coordinates = coordinates.sort((a, b) => a[0] - b[0]);\n for (const encounter of encounters) {\n coordinates.unshift([encounter.period.start.toUTC(), null]);\n coordinates.push([encounter.period.end.toUTC(), null]);\n }\n }\n return coordinates;\n }\n\n hasPointInRange(dateRange: Interval) {\n for (const x of this.coordinates.map(c => c[0])) {\n if (dateRange.contains(x)) {\n return true;\n }\n }\n return false;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Interval} from 'luxon';\n\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {NORMAL} from '../../fhir-resources/observation-interpretation-valueset';\nimport {ObservationSet} from '../../fhir-resources/sets/observation-set';\nimport {ResourceCodeGroup} from '../../conceptmappings/resource-codes/resource-code-group';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {MedicationAdministrationTooltip} from '../graphtypes/tooltips/medication-tooltips';\n// tslint:disable-next-line:max-line-length\nimport {DiscreteObservationTooltip, GenericAbnormalTooltip, GenericAnnotatedObservationTooltip} from '../graphtypes/tooltips/observation-tooltips';\n\nimport {GraphData} from './graphdata';\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * LineGraphData holds configurations for a line graph. A line graph may display\n * one or more LabeledSeries.\n */\nexport class LineGraphData extends GraphData {\n /** The tick marks to display on the y axis. */\n readonly yTicks: number[];\n\n /**\n * Contains the ResourceCodeGroup for this set of data, which helps determine\n * whether to force display bounds, and the code group's display bounds.\n */\n readonly resourceGroup: ResourceCodeGroup;\n\n\n\n private constructor(\n /** The label for the graph. */\n readonly label: string,\n /** The LabeledSeries that are a part of this line graph. */\n series: LabeledSeries[],\n /** The minimum and maximum y-values for this data. */\n readonly yAxisDataBounds: [number, number],\n /** The unit for the y-axis of the graph. */\n readonly unit: string, tooltipMap?: Map,\n tooltipKeyFn?: (key: string) => string, regions?: any[],\n precision?: number, resourceCodeGroup?: ResourceCodeGroup) {\n super(series, tooltipMap, tooltipKeyFn, regions);\n this.precision = precision ? precision : 0;\n this.yTicks =\n LineGraphData.getYTicks(yAxisDataBounds[0], yAxisDataBounds[1]);\n this.resourceGroup = resourceCodeGroup;\n }\n\n static emptyData() {\n return new LineGraphData('', [], [0, 0], '');\n }\n\n /**\n * Converts a list of ObservationSets to a LineGraphData object.\n * @param label The label for this set of observations.\n * @param observationGroup A list of ObservationSets to display.\n * @param resourceCodeGroup The ResourceCodeGroup these ObservationSets belong\n * to\n * @param sanitizer A DOM sanitizer for use in tooltip construction\n * @param encounters A list of Encounters to use while determining line breaks\n * in series.\n * @returns a new LineGraphData for this observation set.\n * @throws Error if the observations in observationGroup have different units.\n */\n static fromObservationSetList(\n label: string, observationGroup: ObservationSet[],\n resourceCodeGroup: ResourceCodeGroup, sanitizer: DomSanitizer,\n encounters: Encounter[]): LineGraphData {\n let minY: number = Number.MAX_VALUE;\n let maxY: number = Number.MIN_VALUE;\n\n const allSeries = [];\n const obsGroupToSeries = new Map();\n for (const obsSet of observationGroup) {\n const lblSeries = LabeledSeries.fromObservationSet(obsSet, encounters);\n obsGroupToSeries.set(obsSet, lblSeries);\n allSeries.push(lblSeries);\n /* Find the minimum and maximum y values for all the series. */\n if (lblSeries.yDisplayBounds) {\n minY = Math.min(minY, lblSeries.yDisplayBounds[0]);\n maxY = Math.max(maxY, lblSeries.yDisplayBounds[1]);\n }\n }\n\n let tooltipMap = LineGraphData.makeTooltipMap(obsGroupToSeries, sanitizer);\n\n tooltipMap = LineGraphData.addAbnormalValueTooltips(\n tooltipMap, sanitizer, allSeries);\n\n const allUnits =\n new Set(observationGroup.map(x => x.unit).filter(x => x !== undefined));\n\n const data = new LineGraphData(\n label, allSeries, [minY, maxY], allUnits.values().next().value,\n tooltipMap && tooltipMap.size > 0 ? tooltipMap : undefined,\n undefined, // tooltipMap\n undefined, // regions\n resourceCodeGroup.precision, resourceCodeGroup);\n return data;\n }\n\n /**\n * Manually find y axis tick values based on the min and max display bounds.\n */\n static getYTicks(min: number, max: number, tickCount = 4): number[] {\n // Evenly space out 5 numbers between the min and max (display bounds).\n const difference = max - min;\n const spacing = difference / tickCount;\n const values = [];\n // If there is no difference between the min and max, simply return the\n // min.\n if (spacing === 0) {\n return [min];\n }\n for (let curr = min; curr <= max; curr += spacing) {\n values.push(curr);\n }\n return values;\n }\n\n\n private static makeTooltipMap(\n obsGroupToSeries: Map,\n sanitizer: DomSanitizer,\n ): Map {\n const tooltipMap = new Map();\n\n for (const entry of Array.from(obsGroupToSeries.entries())) {\n const obsGroup: ObservationSet = entry[0];\n const series: LabeledSeries = entry[1];\n for (const obs of obsGroup.resourceList) {\n const isAbnormal =\n series.abnormalCoordinates.has(obs.observation.timestamp.toISO());\n const timestamp = obs.observation.timestamp.toMillis().toString();\n // The key for this tooltip is the administration's timestamp.\n // There may be multiple data points associated with the timestamp\n // so we stack the administrations on top of one another in that case.\n if (tooltipMap.get(timestamp)) {\n // Blood pressure is read into the ObservationSet differently,\n // causing an edge case in the presentation of the values in the\n // tooltips. We only want to display 'Blood pressure' once\n if (obs.observation.codes[0].label === 'Blood pressure') {\n // We are combining the array into one AnnotatedTooltip in\n // order to check to see if \"Blood pressure\" has already been added\n // to any of the previous tooltips\n const annotatedTT = AnnotatedTooltip.combineAnnotatedTooltipArr(\n tooltipMap.get(timestamp));\n if (annotatedTT.tooltipChart.includes('Blood pressure')) {\n continue;\n }\n }\n tooltipMap.get(timestamp).push(\n new GenericAnnotatedObservationTooltip(\n false, series.legendInfo.fill)\n .getTooltip(obs, sanitizer, isAbnormal));\n } else {\n tooltipMap.set(\n timestamp, [new GenericAnnotatedObservationTooltip(\n true, series.legendInfo.fill)\n .getTooltip(obs, sanitizer, isAbnormal)]);\n }\n }\n }\n return tooltipMap;\n }\n\n /**\n * Constructs a map of timestamps to GenericAbnormalTooltips for any point\n * with an \"abnormal\" value. Currently, we only use the normal range as\n * reference.\n * @param series The series to construct the tooltip map for.\n * @param tooltipMap The existing tooltips for the series.\n * @param obsLabelToColor A map of Observation label to corresponding color.\n * @param sanitizer A DOM sanitizer for use in tooltip construction\n * @returns a map of timstamp strings to tooltips, with GenericObservation\n * tooltips replaced with GenericAbnormal tooltip if the value is\n * abnormal.\n */\n private static addAbnormalValueTooltips(\n tooltipMap: Map,\n sanitizer: DomSanitizer,\n labeledSeries: LabeledSeries[],\n ): Map {\n const alreadyMarked = new Set();\n for (const series of labeledSeries) {\n // Add a tooltip for any value with an abnormal value.\n for (const coords of series.coordinates) {\n const timestamp = coords[0].toMillis().toString();\n if (series.abnormalCoordinates.has(coords[0].toISO())) {\n const params = {};\n params['timestamp'] = coords[0].toMillis();\n params['value'] = coords[1];\n params['label'] = series.label;\n params['unit'] = series.unit;\n // The key for this tooltip is the timestamp.\n // There may be multiple data points associated with the\n // timestamp so we stack the administrations on top of one\n // another in that case.\n if (tooltipMap.get(timestamp) && !alreadyMarked.has(timestamp)) {\n tooltipMap.get(timestamp).push(\n new GenericAbnormalTooltip(false, series.legendInfo.fill)\n .getTooltip(params, sanitizer));\n alreadyMarked.add(timestamp);\n } else if (!tooltipMap.get(timestamp)) {\n tooltipMap.set(timestamp, [new GenericAbnormalTooltip(\n true, series.legendInfo.fill)\n .getTooltip(params, sanitizer)]);\n }\n }\n }\n return tooltipMap;\n }\n }\n\n /**\n * Converts a list of MedicationOrderSets to a LineGraphData object.\n * @param medicationOrderListGroup A list of MedicationOrderSets to\n * display.\n * @param encounters A list of Encounters to use while determining line\n * breaks in series.\n * @returns a new LineGraphData for this observation set.\n * @throws Error if the medication administrations in medicationOrderSet\n * have different units.\n */\n static fromMedicationOrderSet(\n medicationOrderSet: MedicationOrderSet, dateRange: Interval,\n sanitizer: DomSanitizer, encounters: Encounter[]): LineGraphData {\n const tooltipMap = new Map();\n const precision = 0;\n for (const order of medicationOrderSet.resourceList) {\n for (const admin of order.medicationAdministrationSet.resourceList) {\n const timestamp =\n admin.medAdministration.timestamp.toMillis().toString();\n // The key for this tooltip is the administration's timestamp.\n // There may be multiple data points associated with the timestamp\n // so we stack the administrations on top of one another in that\n // case.\n const newTT = new MedicationAdministrationTooltip().getTooltip(\n [admin], sanitizer);\n if (tooltipMap.get(timestamp)) {\n tooltipMap.get(timestamp).push(newTT);\n } else {\n tooltipMap.set(timestamp, [newTT]);\n }\n }\n }\n\n return new LineGraphData(\n medicationOrderSet.label,\n [LabeledSeries.fromMedicationOrderSet(\n medicationOrderSet, dateRange, encounters)],\n [medicationOrderSet.minDose, medicationOrderSet.maxDose],\n medicationOrderSet.unit, tooltipMap, undefined, undefined, precision);\n }\n\n /**\n * Converts a list of ObservationSets with discrete y-values (results) to\n * a LineGraphData object. If we are graphing Observations with discrete\n * values, such as \"yellow\" for the color of urine, we group all\n * ObservationSets into one LabeledSeries, and display textual information\n * in the tooltip.\n * @param label The label for this set of observations.\n * @param observationGroup A list of ObservationSets to display.\n * @param encounters A list of Encounters to use while determining line\n * breaks in series.\n * @returns a new LineGraphData for this observation set.\n * @throws Error if the observations in observationGroup have different\n * units.\n */\n static fromObservationSetListDiscrete(\n label: string, observationGroup: ObservationSet[],\n sanitizer: DomSanitizer, encounters: Encounter[]): LineGraphData {\n // For ObservationSets with discrete categories, we display a\n // scatterplot with one series, with most information in the tooltip.\n const yValue = 10;\n const lblSeries = LabeledSeries.fromObservationSetsDiscrete(\n observationGroup, yValue, label, encounters);\n\n let tooltipMap = new Map();\n for (const observationSet of observationGroup) {\n for (const obs of observationSet.resourceList) {\n const isAbnormal = (obs.observation.interpretation &&\n obs.observation.interpretation.code !== NORMAL) ?\n true :\n false;\n const tsString = obs.observation.timestamp.toMillis().toString();\n // Only add the timestamp to the tooltip for the first entry.\n let newTT: AnnotatedTooltip;\n if (obs.observation.value) {\n newTT = new GenericAnnotatedObservationTooltip(\n !tooltipMap.has(tsString), lblSeries.legendInfo.fill)\n .getTooltip(obs, sanitizer, isAbnormal);\n } else {\n newTT = new DiscreteObservationTooltip(!tooltipMap.has(tsString))\n .getTooltip([obs.observation], sanitizer);\n }\n\n // The key for this tooltip is the observation's timestamp.\n // There may be multiple data points associated with the timestamp\n // so we stack the tooltips on top of one another in that case.\n if (tooltipMap.has(tsString)) {\n tooltipMap.get(tsString).push(newTT);\n } else {\n tooltipMap.set(tsString, [newTT]);\n }\n }\n }\n tooltipMap = LineGraphData.addAbnormalValueTooltips(\n tooltipMap, sanitizer, [lblSeries]);\n\n return new LineGraphData(\n label, [lblSeries], [0, yValue * 2], undefined, // Units\n tooltipMap);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {CHECK_RESULT_CODE} from 'src/app/fhir-resources/observation-interpretation-valueset';\n\nimport {AnnotatedMicrobioReport} from '../../fhir-resources/annotated/annotated-microbio-report';\nimport {MicrobioReport} from '../../fhir-resources/microbio-report';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {MicrobioTooltip} from '../graphtypes/tooltips/microbio-tooltips';\n\nimport {LabeledSeries} from './labeled-series';\nimport {StepGraphData} from './stepgraphdata';\n\n/**\n * MicrobioGraphData holds configurations for a microbiology graph. The format\n * of a microbiology graph is simliar to a step graph in that each y-axis\n * position represents a single microbiology test, and points plotted along\n * that position represent results for that test.\n */\n\nexport class MicrobioGraphData extends StepGraphData {\n private constructor(\n endpointSeries: LabeledSeries[],\n tooltipMap: Map) {\n super(endpointSeries, tooltipMap, undefined);\n }\n\n /**\n * Converts a list of MicrobioReports to a StepGraphData object.\n * All MicrobioReports in the list should belong to the same culture type.\n * @param microbioReports A list of MicrobioReports to display.\n * @returns a new StepGraphData for this set.\n */\n static fromMicrobioReports(\n microbioReports: MicrobioReport[],\n sanitizer: DomSanitizer): MicrobioGraphData {\n const points: LabeledSeries[] = [];\n\n const tooltipMap = new Map();\n for (const report of microbioReports) {\n // Get the timestamp from the collection time of the specimen.\n const specimen = report.specimen;\n if (specimen) {\n const annotatedReport = new AnnotatedMicrobioReport(report);\n for (const series of LabeledSeries.fromMicrobioReport(\n report, annotatedReport.timestamp)) {\n points.push(series);\n const isAbnormal = series.label.includes(CHECK_RESULT_CODE);\n const color = series.legendInfo.fill;\n // For this tooltip, the keys are timestamps.\n if (tooltipMap.has(annotatedReport.timestamp.toMillis().toString())) {\n tooltipMap.get(annotatedReport.timestamp.toMillis().toString())\n .push(new MicrobioTooltip(false, color)\n .getTooltip(annotatedReport, sanitizer, isAbnormal));\n } else {\n tooltipMap.set(\n annotatedReport.timestamp.toMillis().toString(),\n [new MicrobioTooltip(true, color)\n .getTooltip(annotatedReport, sanitizer, isAbnormal)]);\n }\n }\n }\n }\n\n return new MicrobioGraphData(points, tooltipMap);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {DateTime, Interval} from 'luxon';\n\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {AnnotatedTooltip} from '../graphtypes/tooltips/annotated-tooltip';\nimport {MedicationTooltip} from '../graphtypes/tooltips/medication-tooltips';\n\nimport {GraphData} from './graphdata';\nimport {LabeledSeries} from './labeled-series';\n\n/**\n * StepGraphData holds configurations for a step graph. A step graph displays\n * one or more LabeledSeries.\n */\n\nexport class StepGraphData extends GraphData {\n constructor(\n /** A list of the LabeledSeries data to plot. */\n dataSeries: LabeledSeries[],\n /** A list of the LabeledSeries representing end points. */\n // readonly endpointSeries: LabeledSeries[],\n /** A map of tooltips for the data points. */\n tooltipMap: Map,\n /**\n * The function to call to get the key for the tooltip map for a point.\n */\n keyFn: (data: string) => string) {\n super(dataSeries, tooltipMap, keyFn);\n }\n\n /**\n * Converts a list of MedicationOrderSets to a StepGraphData object.\n * @param medicationOrderListGroup A list of MedicationOrderSets to display.\n * @returns a new StepGraphData for this observation set.\n * @throws Error if the observations in observationGroup have different units.\n */\n static fromMedicationOrderSetList(\n medicationOrderListGroup: MedicationOrderSet[], dateRange: Interval,\n sanitizer: DomSanitizer): StepGraphData {\n const data: LabeledSeries[] = [];\n const endpoints: LabeledSeries[] = [];\n\n medicationOrderListGroup = medicationOrderListGroup.sort((a, b) => {\n return a.resourceList[a.resourceList.length - 1]\n .lastAdministration.timestamp.toMillis() -\n b.resourceList[b.resourceList.length - 1]\n .lastAdministration.timestamp.toMillis();\n });\n\n const tooltipMap = new Map();\n for (const medOrderSet of medicationOrderListGroup) {\n // Each MedicationOrderSet represents multiple MedicationOrders\n // for the same medicine.\n for (const medOrder of medOrderSet.resourceList) {\n const labeledSeries = LabeledSeries.fromMedicationOrder(\n medOrder, dateRange, medOrder.medicationAdministrationSet.label);\n const administrationSeries = labeledSeries[0];\n const endpointSeries = labeledSeries[1];\n data.push(administrationSeries);\n endpoints.push(endpointSeries);\n\n // For this custom tooltip, the key is the series ID, and the value is\n // the medication tooltip that shows the first and last doses for the\n // medication.\n tooltipMap.set(\n medOrderSet.rxNormCode.label.toLowerCase() +\n medOrder.firstAdministration.timestamp,\n [new MedicationTooltip().getTooltip(medOrder, sanitizer)]);\n tooltipMap.set(\n medOrderSet.rxNormCode.label.toLowerCase() +\n medOrder.lastAdministration.timestamp,\n [new MedicationTooltip().getTooltip(medOrder, sanitizer)]);\n }\n }\n // Do not display the units for Medication administration values on the card\n // for MedicationSummary.\n for (const series of data) {\n series.unit = undefined;\n }\n for (const series of endpoints) {\n series.unit = undefined;\n }\n return new StepGraphData(\n endpoints, // do not render medication administrations, only endpoints\n tooltipMap,\n // Our tooltip key here is the drug name plus the timestamp.\n (tooltipContext: any) => {\n const xValue = tooltipContext.dataPoints[0].label;\n const yValue = tooltipContext.dataPoints[0].value;\n return yValue.toLowerCase() +\n DateTime.fromISO(xValue).toMillis().toString();\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DisplayGrouping} from '../../conceptmappings/resource-codes/display-grouping';\n\nimport {Axis} from './axis';\n\n/**\n * An AxisGroup is a set of Axes that should be rendered on a single card\n * together.\n *\n * Upon construction, the AxisGroup kicks off a FHIR call to determine whether\n * there is data available for the AxisGroup within the time span of the\n * application. When the promise returns, its result is stored in the\n * dataAvailable class variable.\n *\n * None of the information in AxisGroup changes over the application's\n * lifecycle.\n */\nexport class AxisGroup {\n /**\n * Whether there is data available in the app timescope for this axis group.\n * Marked as public because Angular templates need to get to it, and marked\n * as mutable since it's changed by a promise result, but its value is only\n * set once.\n */\n dataAvailable: boolean = undefined;\n\n /**\n * Constructs an AxisGroup.\n *\n * If label is unset in the constructor, then every axis in axes must have\n * the same label for the constructor to succeed. Similarly, if displayGroup\n * is unset, every axis must have the same resourceGroup.displayGrouping.\n */\n constructor(\n /**\n * The set of axes to be displayed in the same grouping.\n */\n readonly axes: Axis[],\n /**\n * The label for this axis group. If it isn't set here, we'll set it\n * using the label of the contained axes.\n */\n readonly label?: string,\n /**\n * The display grouping for this axis group. If it isn't set here, we'll\n * set it using the display grouping of the contained axes.\n */\n readonly displayGroup?: DisplayGrouping) {\n if (!label) {\n const labelSet = new Set(axes.map(axis => axis.label));\n if (labelSet.size !== 1) {\n throw Error(\n 'The axis group has multiple labels, so we can\\'t pick just one: ' +\n Array.from(labelSet.entries()));\n }\n this.label = axes[0].label;\n }\n\n if (!displayGroup) {\n const allDisplayGroups =\n new Set(axes.map(axis => axis.resourceGroup.displayGrouping.label));\n if (allDisplayGroups.size !== 1) {\n throw Error(\n 'All axes on the same card need to have the same display grouping. Groups:' +\n Array.from(new Set(\n axes.map(axis => axis.resourceGroup.displayGrouping.label))));\n }\n this.displayGroup = axes[0].resourceGroup.displayGrouping;\n }\n }\n\n /**\n * Returns whether there is any data available for any axes in this group\n * within the time scope of the app.\n */\n dataAvailableInAppTimeScope(): Promise {\n if (this.dataAvailable !== undefined) {\n return Promise.resolve(this.dataAvailable);\n }\n return Promise\n .all(this.axes.map(axis => axis.axisDataAvailableInAppTimeScope()))\n .then(rsc => {\n this.dataAvailable = rsc.some(r => r === true);\n return this.dataAvailable;\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Interval} from 'luxon';\n\nimport {BCHMicrobioCode, BCHMicrobioCodeGroup} from '../../conceptmappings/resource-codes/bch-microbio-code';\nimport {DiagnosticReportCode, DiagnosticReportCodeGroup} from '../../conceptmappings/resource-codes/diagnostic-report-code';\nimport {DisplayGrouping} from '../../conceptmappings/resource-codes/display-grouping';\nimport {LOINCCode, LOINCCodeGroup} from '../../conceptmappings/resource-codes/loinc-code';\nimport {ResourceCodeGroup} from '../../conceptmappings/resource-codes/resource-code-group';\nimport {RxNormCode} from '../../conceptmappings/resource-codes/rx-norm';\nimport {RxNormCodeGroup} from '../../conceptmappings/resource-codes/rx-norm-group';\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {MedicationOrderSet} from '../../fhir-resources/medication-order';\nimport {FhirService} from '../../fhir-server/fhir.service';\nimport {DiagnosticGraphData} from '../graphdatatypes/diagnosticgraphdata';\nimport {GraphData} from '../graphdatatypes/graphdata';\nimport {LineGraphData} from '../graphdatatypes/linegraphdata';\nimport {MicrobioGraphData} from '../graphdatatypes/microbiographdata';\nimport {StepGraphData} from '../graphdatatypes/stepgraphdata';\n\nimport {ChartType} from './graph/graph.component';\n\n/**\n * An axis represents one graph to be rendered. It\n * holds values for the type of graph (step, scatter, line, etc) as well as the\n * actual graph data.\n *\n * One axis might have multiple ResourceCodes associated with it, but all of\n * the same type.\n *\n * This class makes the FHIR calls to grab the associated data for the chart.\n */\nexport class Axis {\n /**\n * The chart type for this graph.\n */\n readonly chartType: ChartType;\n\n /**\n * The date range the data is currently loaded for.\n */\n dateRange: Interval;\n\n /**\n * Holds the GraphData already resolved for the class's current date range,\n * unless it hasn't been resolved yet. Then this variable will be undefined,\n * and you need to call updateDateRange to get the data loaded in.\n */\n alreadyResolvedData: GraphData;\n\n /**\n * The associated DisplayGrouping for this graph.\n */\n displayConcept: DisplayGrouping;\n\n /*\n * The label for this axis.\n */\n label: string;\n\n /*\n * Whether to show tick marks for this axis (only changed when results are all\n * qualitative).\n */\n showTicks = true;\n\n /** An error message if there's an error in data retrieval. */\n errorMessage: string;\n\n // The encounters for the date range.\n private encounters: Encounter[] = [];\n\n // Holds the grouping of the resource codes for this axis.\n private allLoinc: boolean;\n private allRx: boolean;\n private allBCHMicrobio: boolean;\n private allDiagnosticReport: boolean;\n\n /** Whether there is data available for this axis in the app time scope. */\n axisDataAvailable = true;\n\n /**\n * The constructor for this axis.\n * @param fhirService The FhirService used to make the FHIR calls.\n * @param resourceGroup The ResourceGroup to request data for.\n * @param dateRange: The date range to display on the axis.\n * @param label?: The optional y-axis label for this axis.\n */\n constructor(\n private fhirService: FhirService, private sanitizer: DomSanitizer,\n /**\n * The ResourceCodeGroup for this axis.\n */\n readonly resourceGroup: ResourceCodeGroup,\n /*\n * The label for this axis.\n */\n label?: string) {\n this.chartType = resourceGroup.chartType;\n this.displayConcept = resourceGroup.displayGrouping;\n this.label = label;\n\n const resourceCodeList = this.resourceGroup.resourceCodes;\n // Check that all elements of the resourceCodeList are of the same type.\n this.allLoinc = resourceCodeList.every(code => code instanceof LOINCCode);\n this.allRx = resourceCodeList.every(code => code instanceof RxNormCode);\n this.allBCHMicrobio =\n resourceCodeList.every(code => code instanceof BCHMicrobioCode);\n this.allDiagnosticReport =\n resourceCodeList.every(code => code instanceof DiagnosticReportCode);\n if (!this.allLoinc && !this.allRx && !this.allBCHMicrobio &&\n !this.allDiagnosticReport) {\n throw Error('All resource codes must be of the same type.');\n }\n }\n\n /**\n * Changes this axis' date range and loads in the new graph data accordingly.\n */\n updateDateRange(dateRange: Interval): Promise {\n if (dateRange === this.dateRange) {\n return Promise.resolve(this.alreadyResolvedData);\n }\n // Invalidate the already-resolved data so that the graph data promise\n // has to be re-evaluated.\n this.dateRange = dateRange;\n this.alreadyResolvedData = undefined;\n this.errorMessage = undefined;\n return this.getDataFromFhir(dateRange).then(\n data => {\n this.alreadyResolvedData = data;\n return data;\n },\n rejection => {\n if (rejection instanceof Error) {\n this.errorMessage = rejection.message;\n } else {\n this.errorMessage = JSON.stringify(rejection, null, 4);\n }\n return LineGraphData.emptyData();\n });\n }\n\n /**\n * Returns whether there is data available for this axis within the\n * application's time scope.\n */\n axisDataAvailableInAppTimeScope(): Promise {\n return this.resourceGroup.dataAvailableInAppTimeScope().then(res => {\n this.axisDataAvailable = res;\n return this.axisDataAvailable;\n });\n }\n\n /**\n * Gets the appropriate GraphData by classifying the resource codes and\n * making the appropriate FHIR calls for data and transformations. If\n * the data is already set in this class, it just returns that data.\n *\n * @returns A GraphData promise that will resolve to the GraphData for\n * this axis's resourceGroup.\n */\n private getDataFromFhir(dateRange: Interval): Promise {\n if (this.alreadyResolvedData) {\n return Promise.resolve(this.alreadyResolvedData);\n }\n\n // Set the encounters for this date range. If the promise fails, the list of\n // encounters is empty.\n this.fhirService.getEncountersForPatient(dateRange).then(e => {\n if (!e) {\n e = [];\n }\n e = e.sort(\n (a, b) => a.period.start.toMillis() - b.period.start.toMillis());\n this.encounters = e;\n }, reject => this.encounters = []);\n\n if (this.allRx) {\n // Prescriptions can be plotted as a step chart or as a line chart.\n if (this.chartType === ChartType.STEP) {\n return this.getStepGraphDataForMedicationSummary(\n this.resourceGroup as RxNormCodeGroup, dateRange);\n } else {\n return this.getLineGraphDataForMedicationDetail(\n this.resourceGroup as RxNormCodeGroup, dateRange);\n }\n }\n\n if (this.allBCHMicrobio) {\n // Microbiology always shows up as a step chart.\n return this.getStepGraphDataForMB(\n this.resourceGroup as BCHMicrobioCodeGroup, dateRange);\n }\n\n if (this.allDiagnosticReport) {\n return this.getStepGraphDataForDiagnosticReport(\n this.resourceGroup as DiagnosticReportCodeGroup, dateRange);\n } else {\n // In this case it is all LOINC codes.\n // We use LineGraphData for both ChartType.Scatter and\n // ChartType.Line, for plotting LOINC Codes.\n return (this.resourceGroup as LOINCCodeGroup)\n .getResourceSet(dateRange)\n .then(obsSetList => {\n if (obsSetList) {\n const allUnits = new Set(\n obsSetList.map(x => x.unit).filter(x => x !== undefined));\n // If the observation set contains any qualitative\n // values, even if it's mixed in with quantitative values,\n // we display the discrete linegraph. Similarly, if the\n // observations have different units we display it as a discrete\n // line graph.\n if (obsSetList.some(obsSet => obsSet.anyQualitative) ||\n allUnits.size > 1) {\n this.showTicks = false;\n return LineGraphData.fromObservationSetListDiscrete(\n this.displayConcept.label, obsSetList, this.sanitizer,\n this.encounters);\n }\n return LineGraphData.fromObservationSetList(\n this.displayConcept.label, obsSetList, this.resourceGroup,\n this.sanitizer, this.encounters);\n }\n return LineGraphData.emptyData();\n });\n }\n }\n\n /**\n * Get the data needed for the medication summary.\n * We first get the MedicationAdministrations corresponding to the RxNorms to\n * display on the page, and group them by order id (representing a\n * prescription). We then get the MedicationOrder for each order id, and group\n * those into MedicationOrderSets, where each MedicationOrderSet represents a\n * set of MedicationOrders for a particular medication.\n * @param rxNorms The RxNorms to be displayed in the StepGraphCard.\n */\n getStepGraphDataForMedicationSummary(\n rxNorms: RxNormCodeGroup, dateRange: Interval): Promise {\n return rxNorms.getResourceSet(dateRange).then(medOrderSets => {\n return StepGraphData.fromMedicationOrderSetList(\n medOrderSets.map(x => x.orders), dateRange, this.sanitizer);\n });\n }\n\n getStepGraphDataForMB(bchCodes: BCHMicrobioCodeGroup, dateRange: Interval):\n Promise {\n return bchCodes.getResourceSet(dateRange).then(microbioReports => {\n return MicrobioGraphData.fromMicrobioReports(\n microbioReports, this.sanitizer);\n });\n }\n\n getStepGraphDataForDiagnosticReport(\n diagCodes: DiagnosticReportCodeGroup,\n dateRange: Interval): Promise {\n return diagCodes.getResourceSet(dateRange).then(diagReports => {\n return DiagnosticGraphData.fromDiagnosticReports(\n diagReports, this.sanitizer);\n });\n }\n\n /**\n * Issues a FHIR request to get all the meds data for a list of\n * RxNorm codes (medications).\n */\n getLineGraphDataForMedicationDetail(\n rxNorms: RxNormCodeGroup, dateRange: Interval): Promise {\n return rxNorms.getResourceSet(dateRange)\n .then(rxNs => {\n return [].concat(...rxNs.map(rx => rx.orders.resourceList));\n })\n .then(orders => {\n return LineGraphData.fromMedicationOrderSet(\n new MedicationOrderSet(orders), dateRange, this.sanitizer,\n this.encounters);\n });\n }\n\n /**\n * Gets the x regions from the data for this axis.\n */\n getXRegions(): Promise {\n return this.getDataFromFhir(this.dateRange).then(data => {\n return data.xRegions ? data.xRegions : [];\n });\n }\n\n /**\n * Returns whether there's resolved data for this axis.\n */\n dataResolved(): boolean {\n return this.alreadyResolvedData && this.axisDataAvailable ? true : false;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport * as Color from 'color';\nimport {DateTime} from 'luxon';\n\n/*\n * This class makes an annotation for a particular timestamp with custom notes.\n */\nexport class CustomizableGraphAnnotation {\n // Whether or not the full annotation is shown. If false, only the title of\n // the annotation will show.\n private showDetails: boolean;\n // The width of the annotation.\n readonly annotationWidth = 100;\n // The default height of the annotation.\n readonly annotationHeight = 25;\n // The default y position of the annotation.\n readonly annotationDefaultY = 20;\n\n timestamp: DateTime;\n deleteIcon: HTMLElement;\n editIcon: HTMLElement;\n expandIcon: HTMLElement;\n\n constructor(\n timestamp: DateTime,\n /** The title that will show up in the annotation. */\n readonly title = '',\n /** The description that will show up in the annotation. */\n readonly description = '',\n /** The color for this annotation and associated point. */\n readonly color: Color = Color.rgb('black'),\n /** The timestamp for the annotation */\n ) {\n this.timestamp = timestamp;\n }\n\n addAnnotation(chartDivId: string, differenceInHeight: number): HTMLElement {\n const self = this;\n this.showDetails = false;\n const millis = this.timestamp.toMillis();\n\n const tooltipContainer = document.createElement('div');\n tooltipContainer.setAttribute(\n 'class', 'tooltip-custom-' + chartDivId + millis);\n tooltipContainer.style.left = '0px';\n tooltipContainer.style.borderColor = 'grey';\n tooltipContainer.style.backgroundColor = this.color.toString();\n tooltipContainer.style.bottom =\n (this.annotationDefaultY + differenceInHeight) + 'px';\n\n const tooltipTitleContainer = document.createElement('div');\n tooltipContainer.appendChild(tooltipTitleContainer);\n\n this.expandIcon =\n this.makeIcon('expand-' + chartDivId + millis, 'expand_more');\n this.expandIcon.style.cursor = 'pointer';\n tooltipTitleContainer.appendChild(this.expandIcon);\n\n const tooltipTitle = document.createElement('h6');\n tooltipTitle.setAttribute(\n 'class', 'tooltip-title-custom-' + chartDivId + millis);\n tooltipTitle.innerText = this.title;\n tooltipTitleContainer.appendChild(tooltipTitle);\n\n\n this.deleteIcon = this.makeIcon('delete-' + chartDivId + millis, 'clear');\n this.deleteIcon.style.cursor = 'pointer';\n tooltipTitleContainer.appendChild(this.deleteIcon);\n\n const tooltipDetails = document.createElement('div');\n tooltipDetails.setAttribute(\n 'class', 'tooltip-details-custom-' + chartDivId + millis);\n tooltipContainer.appendChild(tooltipDetails);\n\n const tooltipDetailsText = document.createElement('div');\n tooltipDetailsText.innerText = this.description;\n tooltipDetailsText.setAttribute(\n 'class', 'tooltip-details-text-' + chartDivId + millis);\n tooltipDetails.appendChild(tooltipDetailsText);\n\n this.editIcon = this.makeIcon('edit-' + chartDivId + millis, 'edit');\n this.editIcon.style.cursor = 'pointer';\n tooltipDetails.appendChild(this.editIcon);\n\n /**\n * Add action handlers.\n */\n tooltipTitle.onclick = ((e: MouseEvent) => {\n // Toggle whether or not the details are shown.\n self.showDetails = !self.showDetails;\n self.showDetailsToggle(\n millis, self.showDetails, tooltipContainer, chartDivId);\n });\n\n this.expandIcon.onclick = ((e: MouseEvent) => {\n // Toggle whether or not the details are shown.\n self.showDetails = !self.showDetails;\n self.showDetailsToggle(\n millis, self.showDetails, tooltipContainer, chartDivId);\n });\n\n\n tooltipContainer.onmouseover = (e: MouseEvent) => {\n this.expandIcon.style.visibility = 'visible';\n this.deleteIcon.classList.add('showIcon');\n this.editIcon.classList.add('showIcon');\n };\n\n tooltipContainer.onmouseout = (e: MouseEvent) => {\n this.expandIcon.style.visibility = 'hidden';\n this.deleteIcon.classList.remove('showIcon');\n this.editIcon.classList.remove('showIcon');\n };\n return tooltipContainer;\n }\n\n removeAnnotation(chartDivId: string) {\n const annotation = document.getElementsByClassName(\n 'tooltip-whole-' + chartDivId + this.timestamp.toMillis())[0];\n const parent = annotation.parentNode;\n if (parent) {\n parent.removeChild(annotation);\n }\n }\n\n private makeIcon(id: string, iconName: string): HTMLElement {\n const icon = document.createElement('i');\n icon.setAttribute('class', 'material-icons');\n icon.setAttribute('id', id);\n icon.style.fontSize = '18px';\n icon.innerHTML = iconName;\n return icon;\n }\n // Toggles whether or not the full annotation is shown.\n private showDetailsToggle(\n millis: number, toggle: boolean, element: any, chartDivId: string) {\n const detailsElement =\n document.getElementsByClassName(\n 'tooltip-details-custom-' + chartDivId + millis)[0] as HTMLElement;\n const expandElement =\n document.getElementById('expand-' + chartDivId + millis);\n if (toggle) {\n detailsElement.style.display = 'inline-block';\n expandElement.innerHTML = 'expand_less';\n } else {\n detailsElement.style.display = 'none';\n expandElement.innerHTML = 'expand_more';\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, forwardRef, Inject, Input, OnChanges, OnDestroy, Output, SimpleChanges} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {DateTime, Interval} from 'luxon';\nimport {CustomizableData} from 'src/app/graphs/graphdatatypes/customizabledata';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\nimport {recordGoogleAnalyticsEvent} from 'src/constants';\n\n// tslint:disable-next-line:max-line-length\nimport {CustomizableTimelineDialogComponent} from '../../../cardtypes/customizable-timeline/customizable-timeline-dialog/customizable-timeline-dialog.component';\nimport {GraphComponent} from '../graph/graph.component';\n\nimport {CustomizableGraphAnnotation} from './customizable-graph-annotation';\n\n@Component({\n selector: 'app-customizable-graph',\n templateUrl: '../graph/graph.component.html',\n styleUrls: [\n '../../../cardtypes/customizable-timeline/customizable-timeline.component.css'\n ],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => CustomizableGraphComponent)\n }]\n})\nexport class CustomizableGraphComponent extends\n GraphComponent implements OnChanges, OnDestroy {\n /**\n * An event indicating that the points on the CustomizableGraph have changed.\n */\n @Output() pointsChanged = new EventEmitter();\n /**\n * Holds whether this graph is in edit mode.\n */\n @Input() inEditMode: boolean;\n\n /**\n * The reference for the Dialog opened.\n */\n private dialogRef: any;\n\n\n constructor(\n readonly sanitizer: DomSanitizer, public dialog: MatDialog,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n this.chartTypeString = 'scatter';\n }\n\n ngOnDestroy() {\n if (this.dialogRef && this.dialogRef.unsubscribe) {\n // Destroy the dialog ref to prevent memory leaks.\n this.dialogRef.unsubscribe();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n super.ngOnChanges(changes);\n if (changes.dateRange) {\n // CustomizableGraph needs to update annotations in the case that the date\n // range is changed.\n this.dateRangeChanged();\n }\n }\n adjustGeneratedChartConfiguration() {\n const self = this;\n this.chartOptions.scales.yAxes[0].display = false;\n this.chartOptions.scales.yAxes[0].ticks.beginAtZero = true;\n this.chartOptions.tooltips = {enabled: false};\n this.chartOptions.hover = {mode: null};\n this.chartOptions.onClick = function(event) {\n if (!self.inEditMode) {\n return;\n }\n const xValueMoment =\n this.scales[GraphComponent.X_AXIS_ID].getValueForPixel(event.offsetX);\n const dateClicked = DateTime.fromJSDate(xValueMoment.toDate());\n const currentInterval = Interval.fromDateTimes(\n self.dateRange.start.toLocal().startOf('day'),\n self.dateRange.end.toLocal().endOf('day'));\n if (currentInterval.contains(dateClicked)) {\n self.openDialog(dateClicked);\n }\n };\n this.chartOptions.onHover = function(event) {\n if (!self.inEditMode) {\n return;\n }\n const chart: any = this;\n const yScale = chart.scales[GraphComponent.Y_AXIS_ID];\n const xScale = chart.scales[GraphComponent.X_AXIS_ID];\n const currentDate =\n DateTime.fromJSDate(xScale.getValueForPixel(event.offsetX).toDate());\n const currentDateString = currentDate.toLocaleString() + ' ' +\n currentDate.toLocal().toLocaleString(DateTime.TIME_24_SIMPLE);\n\n const currentInterval = Interval.fromDateTimes(\n self.dateRange.start.toLocal().startOf('day'),\n self.dateRange.end.toLocal().endOf('day'));\n\n // Remove all other ctx lines drawn, to only show one hover line.\n chart.clear();\n chart.draw();\n\n // Only display the hover line if the date it represents is within the\n // current date range. This is because the chart is slightly larger than\n // the area contained within the axes, and a line could potentially be\n // shown before the x-axis starts, or after it ends.\n if (currentInterval.contains(currentDate)) {\n chart.ctx.beginPath();\n chart.ctx.moveTo(event.offsetX, 0);\n chart.ctx.strokeStyle = '#A0A0A0';\n chart.ctx.lineTo(event.offsetX, yScale.bottom);\n chart.ctx.stroke();\n chart.ctx.fillText(currentDateString, event.offsetX, yScale.bottom / 2);\n }\n };\n this.chartOptions.animation = {\n onComplete: function(chart) {\n self.removeAnnotations();\n self.addAnnotations();\n }\n };\n }\n\n dateRangeChanged() {\n this.reloadChart();\n this.adjustGeneratedChartConfiguration();\n }\n\n addAnnotations() {\n for (const dataPt of this.chartData[0].data) {\n const canvas = document.getElementById(this.chartDivId);\n const millis = DateTime.fromISO(dataPt['x']).toMillis();\n const annotation = this.data.annotations.get(millis);\n const color = annotation.color ? annotation.color : '#000000';\n // We need to cast this.chart.chart as any so we can access the 'scales'\n // property.\n const xOffset = (this.chart.chart as any)\n .scales[GraphComponent.X_AXIS_ID]\n .getPixelForValue(annotation.timestamp.toJSDate());\n const yOffset = (this.chart.chart as any)\n .scales[GraphComponent.Y_AXIS_ID]\n .margins['bottom'];\n const yAxisHeight =\n (this.chart.chart as any).scales[GraphComponent.Y_AXIS_ID].height;\n const heightToUse =\n this.findBestYCoordinate(xOffset, yAxisHeight, yOffset);\n const difference = heightToUse - yOffset;\n\n // Only display the flag if the date it represents is within the\n // current date range. This is so that the flag is not added to a location\n // on the DOM that is not within the chart.\n if (this.entireInterval.contains(DateTime.fromMillis(millis).toLocal())) {\n const tooltip = this.findOrCreateTooltipElement(\n canvas, 'annotation-' + this.chartDivId + millis);\n tooltip.setAttribute(\n 'class', 'tooltip-whole-' + this.chartDivId + millis);\n tooltip.style.borderLeftColor = color;\n tooltip.style.bottom = yOffset + 'px';\n tooltip.style.left = xOffset + 'px';\n tooltip.style.height = heightToUse + 'px';\n while (tooltip.firstChild) {\n tooltip.removeChild(tooltip.firstChild);\n }\n tooltip.onclick = (e: MouseEvent) => {\n const parent = tooltip.parentNode;\n try {\n parent.appendChild(tooltip);\n } catch (e) {\n console.log(e);\n }\n };\n\n tooltip.appendChild(\n annotation.addAnnotation(this.chartDivId, difference));\n this.addDeleteEvent(annotation);\n this.addEditListener(annotation);\n }\n }\n }\n\n private removeAnnotations() {\n const selector = 'tooltip-whole-' + this.chartDivId;\n for (const annotation of Array.from(\n document.querySelectorAll('[class*=' + selector + ']'))) {\n const parent = annotation.parentNode;\n if (parent) {\n parent.removeChild(annotation);\n }\n }\n }\n\n private findBestYCoordinate(\n xOffset: number, yAxisHeight: number, yOffset: number): number {\n const annotationWidth = 100;\n const verticalOverlap = 10;\n const horizontalOverlap = 20;\n const selector = 'tooltip-whole-' + this.chartDivId;\n const allFlags =\n Array.from(document.querySelectorAll('[class*=' + selector + ']'));\n const positions = allFlags.map(flag => {\n const htmlFlag = flag as HTMLElement;\n return {\n left: Number(htmlFlag.style.left.replace('px', '')),\n height: Number(htmlFlag.style.height.replace('px', '')),\n };\n });\n const overlappingYs = [];\n // Check if there are any annotations with horizontal overlap.\n for (const position of positions) {\n const leftPosition = position.left + annotationWidth;\n if (xOffset <= leftPosition &&\n (xOffset + annotationWidth >= position.left)) {\n overlappingYs.push(position.height);\n }\n }\n\n // Figure out the new y-coordinate for the annotation.\n let heightToUse = yOffset;\n // Sort all heights in increasing order.\n overlappingYs.sort(function(a, b) {\n return a - b;\n });\n // By default, try putting the new box above all other annotations with\n // horizontal overlap.\n if (overlappingYs.length > 0) {\n const currentMaxHeight = overlappingYs[overlappingYs.length - 1];\n // Only add height if the annotation does not go past the y axis height.\n if (currentMaxHeight + verticalOverlap <= yAxisHeight) {\n heightToUse = currentMaxHeight + verticalOverlap;\n } else {\n heightToUse = currentMaxHeight;\n }\n }\n // Check if there is any position with space available between existing\n // annotations.\n for (let i = 0; i < overlappingYs.length; i++) {\n // Check if there is enough space.\n if (overlappingYs[i + 1] - (overlappingYs[i] + annotationWidth) >=\n horizontalOverlap) {\n heightToUse = overlappingYs[i];\n }\n }\n return heightToUse;\n }\n\n // If the selected date already has an annotation, modify the time\n // by + 1 millisecond.\n private updateTime(millis: number) {\n if (this.data.annotations.has(millis)) {\n return this.updateTime(millis + 1);\n }\n return millis;\n }\n\n /**\n * Allow for the addition of a point to the CustomizableGraph, via a\n * CustomizableTimelineDialog.\n * (Visible only for testing.)\n */\n addPoint(timestamp: DateTime) {\n if (this.inEditMode) {\n this.dialogRef = this.openDialog(timestamp);\n }\n }\n\n private openDialog(\n timestamp: DateTime, editedAnnotation?: CustomizableGraphAnnotation) {\n // Make the dialog show up near where the user clicked.\n const data = editedAnnotation ? {\n title: editedAnnotation.title,\n date: new Date(editedAnnotation.timestamp.toMillis()),\n description: editedAnnotation.description,\n color: editedAnnotation.color,\n dateRange: this.dateRange,\n } :\n {\n date: timestamp,\n dateRange: this.dateRange,\n };\n\n this.dialogRef =\n this.dialog.open(CustomizableTimelineDialogComponent, {data: data});\n this.dialogRef.afterClosed().subscribe(r => {\n if (r) {\n if (editedAnnotation) {\n this.data.removePointFromSeries(\n DateTime.fromMillis(editedAnnotation.timestamp.toMillis()));\n editedAnnotation.removeAnnotation(this.chartDivId);\n }\n\n const result: CustomizableGraphAnnotation =\n r as CustomizableGraphAnnotation;\n // By default, the user selected date is the original date\n // corresponding to where the user chose to add the point.\n let userSelectedDate = result.timestamp;\n userSelectedDate =\n DateTime.fromMillis(this.updateTime(userSelectedDate.toMillis()));\n result.timestamp = userSelectedDate;\n this.data.addPointToSeries(result);\n this.pointsChanged.emit(this.data);\n this.generateChart();\n\n recordGoogleAnalyticsEvent(\n 'addEventCustomTimeline', 'customTimeline',\n new Date().toDateString());\n }\n });\n }\n\n /**\n * Add a listener for a click event on the delete button of the annotation at\n * the given time.\n * @param annotation The annotation for this point to remove.\n */\n private addDeleteEvent(annotation: CustomizableGraphAnnotation) {\n annotation.deleteIcon.onclick = ((e: MouseEvent) => {\n this.data.removePointFromSeries(annotation.timestamp);\n annotation.removeAnnotation(this.chartDivId);\n this.pointsChanged.emit(this.data);\n this.generateChart();\n });\n }\n\n /**\n * Add a listener for a click event on the edit button of the annotation at\n * the given time.\n * Visible only for testing.\n * @param annotation The annotation for the point to edit.\n */\n addEditListener(annotation: CustomizableGraphAnnotation) {\n annotation.editIcon.onclick = ((e: MouseEvent) => {\n this.dialogRef = this.openDialog(annotation.timestamp, annotation);\n\n recordGoogleAnalyticsEvent(\n 'editEventCustomTimeline', 'customTimeline',\n new Date().toDateString());\n });\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject, SecurityContext} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {LabeledSeries} from 'src/app/graphs/graphdatatypes/labeled-series';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {DiagnosticGraphDialogComponent} from '../diagnostic-graph/diagnostic-graph.dialog.component';\nimport {GraphComponent} from '../graph/graph.component';\nimport {StepGraphComponent} from '../stepgraph/stepgraph.component';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\n\n@Component({\n selector: 'app-diagnostic-graph',\n templateUrl: '../graph/graph.component.html',\n styleUrls: ['../graph.css'],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => DiagnosticGraphComponent)\n }]\n})\nexport class DiagnosticGraphComponent extends StepGraphComponent {\n private diagnosticGraphDialog: MatDialog;\n\n constructor(\n sanitizer: DomSanitizer, diagnosticGraphDialog: MatDialog,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n this.clickableTooltip = true;\n this.diagnosticGraphDialog = diagnosticGraphDialog;\n }\n\n /**\n * Called to open the diagnosticGraph Dialog.\n * @param htmlAttachment string that reflects the html to be presented on the\n * dialog\n */\n openDiagnosticGraphDialog(htmlAttachment: string) {\n const sanitizedHTMLAttachment =\n this.sanitizer.sanitize(SecurityContext.HTML, htmlAttachment);\n const dialogRef = this.diagnosticGraphDialog.open(\n DiagnosticGraphDialogComponent,\n {data: {htmlAttachment: sanitizedHTMLAttachment}});\n }\n\n /**\n * This is public because we want to be able to test it.\n *\n * Creates the binding between the buttons in the tooltip and the function\n * that we wish to call through onClick. We need to overwrite the super class\n * with specific information relevant to the Diagnostic Graph.\n *\n * We need to bind the onClick here as opposed to when the button was\n * originally created due to scoping and binding issues with the tooltip- the\n * button was not previously created.\n *\n * @param tooltipArray AnnotatedTooltip[] containing the attachment we wish\n * to display in the matDialog.\n */\n addAdditionalElementTooltip(tooltipArray: AnnotatedTooltip[]) {\n for (const annotatedTT of tooltipArray) {\n const uniqueID = annotatedTT.id;\n if (uniqueID === undefined) {\n throw Error('AnnotatedTooltip has undefined id');\n }\n // Extracts the button in the tooltip.\n const button = document.getElementById(uniqueID);\n if (button === null) {\n throw Error(\n `The AnnotatedTooltip does not correspond to ` +\n `any buttons on the tooltip. ID: ${uniqueID}`);\n }\n const htmlAttachment = annotatedTT.additionalAttachment;\n button.onclick =\n this.openDiagnosticGraphDialog.bind(this, htmlAttachment[0]);\n }\n }\n\n /***************************\n * Legend interactions\n * Because of the unique nature of the series in the DiagnosticGraph, we do\n * not allow legend interactions for diagnostic graphs. This prevents errors\n * that occur when the user hovers over a legend element that might correspond\n * to many series on the chart.\n */\n\n /**\n * @override\n */\n resetChart() {}\n\n /**\n * @override\n */\n focusOnSeries(labeledSeries: LabeledSeries[]) {}\n}\n","module.exports = \"
\\n \\n \\n
\\n

Diagnostic Report Attachment

\\n
\\n
\\n
\"","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject} from '@angular/core';\nimport {MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';\n\n@Component({\n selector: 'app-diagnostic-graph-dialog',\n templateUrl: './diagnostic-graph.dialog.component.html'\n})\n\n/**\n * Dialog pop-up to display html attachment from the tooltip.\n*/\nexport class DiagnosticGraphDialogComponent {\n readonly htmlAttachment: string;\n\n /**\n * @param data Information to be displayed on the diagnosticGraph Dialog\n * @param dialogRef Reference to the dialog; used to open and close\n */\n constructor(@Inject(MAT_DIALOG_DATA) readonly data: any,\n public dialogRef: MatDialogRef) {\n // data.htmlAttachment has already been sanitized\n if (data) {\n this.htmlAttachment = data.htmlAttachment;\n }\n }\n\n /**\n * When the close icon is pressed, the dialog closes\n */\n onExit() {\n this.dialogRef.close();\n }\n}\n","module.exports = \"::ng-deep canvas {\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n -ms-user-select: none;\\n cursor: pointer;\\n}\\n::ng-deep .chartjs-tooltip {\\n opacity: 1;\\n position: absolute;\\n /* Disables interactions with the tooltip. Used here to remove\\n odd behavior where the tooltip does not immediately show up\\n despite hovering over the point */\\n pointer-events: none;\\n /* Show the tooltip above everything else. */\\n z-index: 1000;\\n}\\n::ng-deep .chartjs-tooltip-key {\\n display: inline-block;\\n width: 10px;\\n height: 10px;\\n margin-right: 10px;\\n}\\n/* All the below styles apply to elements within the graphs. Because these\\nare nested inside the components, we have to prefix the\\nstyle names with ::ng-deep. */\\n::ng-deep .tooltip {\\n font-size: 13px;\\n border-collapse: collapse;\\n border-spacing: 0;\\n background-color: #fff;\\n empty-cells: show;\\n box-shadow: 7px 7px 12px -9px #777777;\\n opacity: 0.9;\\n}\\n::ng-deep table {\\n background: #fff;\\n border: solid 1px #ddd;\\n}\\n::ng-deep .tooltip tr {\\n border: 1px solid #CCC;\\n}\\n::ng-deep .tooltip > tbody > tr > th {\\n width: 100%;\\n word-wrap: break-word;\\n background-color: #aaa;\\n font-size: 14px;\\n padding: 2px 5px;\\n text-align: left;\\n color: #FFF;\\n}\\n::ng-deep .tooltip td {\\n width: 125px;\\n font-size: 13px;\\n padding: 3px 6px;\\n background-color: #fff;\\n border-left: 1px dotted #999;\\n}\\n::ng-deep .order-region {\\n fill: rgb(179, 157, 219); /* Secondary color */\\n stroke: rgb(179, 157, 219); /* Secondary color */\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZ3JhcGhzL2dyYXBodHlwZXMvZ3JhcGguY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0Usc0JBQXNCO0VBQ3RCLHlCQUF5QjtFQUN6QixxQkFBcUI7RUFDckIsZUFBZTtBQUNqQjtBQUNBO0VBQ0UsVUFBVTtFQUNWLGtCQUFrQjtFQUNsQjs7bUNBRWlDO0VBQ2pDLG9CQUFvQjtFQUNwQiw0Q0FBNEM7RUFDNUMsYUFBYTtBQUNmO0FBRUE7RUFDRSxxQkFBcUI7RUFDckIsV0FBVztFQUNYLFlBQVk7RUFDWixrQkFBa0I7QUFDcEI7QUFFQTs7OEJBRThCO0FBRTlCO0VBQ0UsZUFBZTtFQUNmLHlCQUF5QjtFQUN6QixpQkFBaUI7RUFDakIsc0JBQXNCO0VBQ3RCLGlCQUFpQjtFQUdqQixxQ0FBcUM7RUFDckMsWUFBWTtBQUNkO0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsc0JBQXNCO0FBQ3hCO0FBRUE7RUFDRSxzQkFBc0I7QUFDeEI7QUFFQTtFQUNFLFdBQVc7RUFDWCxxQkFBcUI7RUFDckIsc0JBQXNCO0VBQ3RCLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsZ0JBQWdCO0VBQ2hCLFdBQVc7QUFDYjtBQUVBO0VBQ0UsWUFBWTtFQUNaLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsc0JBQXNCO0VBQ3RCLDRCQUE0QjtBQUM5QjtBQUVBO0VBQ0Usd0JBQXdCLEVBQUUsb0JBQW9CO0VBQzlDLDJCQUEyQixFQUFFLG9CQUFvQjtBQUNuRCIsImZpbGUiOiJzcmMvYXBwL2dyYXBocy9ncmFwaHR5cGVzL2dyYXBoLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjo6bmctZGVlcCBjYW52YXMge1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbjo6bmctZGVlcCAuY2hhcnRqcy10b29sdGlwIHtcbiAgb3BhY2l0eTogMTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICAvKiBEaXNhYmxlcyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgdG9vbHRpcC4gVXNlZCBoZXJlIHRvIHJlbW92ZVxuICBvZGQgYmVoYXZpb3Igd2hlcmUgdGhlIHRvb2x0aXAgZG9lcyBub3QgaW1tZWRpYXRlbHkgc2hvdyB1cFxuICBkZXNwaXRlIGhvdmVyaW5nIG92ZXIgdGhlIHBvaW50ICovXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAvKiBTaG93IHRoZSB0b29sdGlwIGFib3ZlIGV2ZXJ5dGhpbmcgZWxzZS4gKi9cbiAgei1pbmRleDogMTAwMDtcbn1cblxuOjpuZy1kZWVwIC5jaGFydGpzLXRvb2x0aXAta2V5IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbi8qIEFsbCB0aGUgYmVsb3cgc3R5bGVzIGFwcGx5IHRvIGVsZW1lbnRzIHdpdGhpbiB0aGUgZ3JhcGhzLiBCZWNhdXNlIHRoZXNlXG5hcmUgbmVzdGVkIGluc2lkZSB0aGUgY29tcG9uZW50cywgd2UgaGF2ZSB0byBwcmVmaXggdGhlXG5zdHlsZSBuYW1lcyB3aXRoIDo6bmctZGVlcC4gICovXG5cbjo6bmctZGVlcCAudG9vbHRpcCB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGVtcHR5LWNlbGxzOiBzaG93O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDdweCA3cHggMTJweCAtOXB4ICM3Nzc3Nzc7XG4gIC1tb3otYm94LXNoYWRvdzogN3B4IDdweCAxMnB4IC05cHggIzc3Nzc3NztcbiAgYm94LXNoYWRvdzogN3B4IDdweCAxMnB4IC05cHggIzc3Nzc3NztcbiAgb3BhY2l0eTogMC45O1xufVxuXG46Om5nLWRlZXAgdGFibGUge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXI6IHNvbGlkIDFweCAjZGRkO1xufVxuXG46Om5nLWRlZXAgLnRvb2x0aXAgdHIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjQ0NDO1xufVxuXG46Om5nLWRlZXAgLnRvb2x0aXAgPiB0Ym9keSA+IHRyID4gdGgge1xuICB3aWR0aDogMTAwJTtcbiAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhO1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDJweCA1cHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiAjRkZGO1xufVxuXG46Om5nLWRlZXAgLnRvb2x0aXAgdGQge1xuICB3aWR0aDogMTI1cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogM3B4IDZweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm9yZGVyLWxlZnQ6IDFweCBkb3R0ZWQgIzk5OTtcbn1cblxuOjpuZy1kZWVwIC5vcmRlci1yZWdpb24ge1xuICBmaWxsOiByZ2IoMTc5LCAxNTcsIDIxOSk7IC8qIFNlY29uZGFyeSBjb2xvciAqL1xuICBzdHJva2U6ICByZ2IoMTc5LCAxNTcsIDIxOSk7IC8qIFNlY29uZGFyeSBjb2xvciAqL1xufVxuIl19 */\"","module.exports = \"\\n
\\n
\\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Inject, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Chart, ChartDataSets, ChartOptions, ChartXAxe, ChartYAxe} from 'chart.js';\nimport * as pluginAnnotations from 'chartjs-plugin-annotation';\nimport {DateTime, Interval} from 'luxon';\nimport {BaseChartDirective} from 'ng2-charts';\nimport {GraphData} from 'src/app/graphs/graphdatatypes/graphdata';\nimport {LabeledSeries} from 'src/app/graphs/graphdatatypes/labeled-series';\nimport {LineGraphData} from 'src/app/graphs/graphdatatypes/linegraphdata';\nimport {formatNumberWithPrecision} from 'src/app/utils/number_utils';\nimport {v4 as uuid} from 'uuid';\n\nimport {UI_CONSTANTS, UI_CONSTANTS_TOKEN} from '../../../../constants';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\nimport {StandardTooltip} from '../tooltips/tooltip';\n\nexport enum ChartType {\n SCATTER,\n LINE,\n STEP,\n MICROBIO,\n DIAGNOSTIC\n}\n\n/**\n * Displays a graph. T is the data type the graph is equipped to display.\n */\nexport abstract class GraphComponent implements OnInit,\n OnChanges {\n /** Dummy data series label. */\n private static readonly DEFAULT_BLANK_DATA_LABEL = 'blankdatalabel';\n\n /**\n * The amount of padding to add to the left of the graph. This goes hand in\n * hand with how we choose to wrap the labels in the rendered chart, so if\n * Y_AXIS_TICK_MAX changes, this probably needs to change, too.\n * Additionally, significant changes in this value might break the e2e test\n * for customizable timeline since it could cause the click registered to\n * be outside of the graph area.\n */\n private static readonly Y_AXIS_LEFT_PADDING = 155;\n\n /** Line weights for emphasized and non-emphasized line graphs. */\n private static readonly THICK_LINE = 3;\n private static readonly THIN_LINE = 1;\n\n /** Constants for x and y axis names. */\n static readonly Y_AXIS_ID = 'y-axis-0';\n static readonly X_AXIS_ID = 'x-axis-0';\n\n /**\n * The minimum height for a graph.\n *\n * Significant changes in this value might break the e2e test\n * for customizable timeline since it could cause the click registered to\n * be outside of the graph area.\n */\n static readonly MIN_AXIS_HEIGHT = 90;\n\n /**\n * The entire interval represented by the current date range. This Interval\n * goes from the beginning of the first day of the date range, to the end of\n * the last day of the date range.\n */\n protected entireInterval: Interval;\n\n /** Whether data is available for this graph for the current date range. */\n private dataPointsInDateRange = false;\n\n /*****************************************\n * Bound input variables\n */\n\n /** The x-axis eventlines to display on the chart. */\n @Input() eventlines: Array<{[key: string]: number | string}>;\n /** The x-axis to use for the chart. */\n @Input() dateRange: Interval;\n /** The y-axis label to display. */\n @Input() axisLabel: string;\n /** The graph data to show. */\n @Input() data: T;\n /** The x regions to mark on this graph. */\n @Input() xRegions: Array<[DateTime, DateTime]>;\n\n /*****************************************\n * Variables the chart.js directive binds to.\n */\n\n @ViewChild(BaseChartDirective) chart: BaseChartDirective;\n /** Plugins for chart.js. */\n chartPlugins = [pluginAnnotations];\n\n // The bindings are unhappy when you provide an empty data array, so we\n // give it a fake series to render.\n /**\n * The chart data sets to render.\n */\n chartData: ChartDataSets[] = [\n {data: [], label: GraphComponent.DEFAULT_BLANK_DATA_LABEL},\n ];\n\n /**\n * Chart options to be rendered.\n */\n readonly chartOptions: (ChartOptions&{annotation: any}) = {\n // Draw straight lines between points instead of curves.\n elements: {line: {tension: 0}},\n layout: {padding: {top: 5}},\n // We make our own legend so we don't show the built-in one.\n legend: {display: false},\n scales: {xAxes: [this.generateXAxis()], yAxes: [this.generateYAxis()]},\n // Needed to grow the graph to fit the space.\n responsive: true,\n maintainAspectRatio: false,\n // Set up the custom callback for the tooltips.\n tooltips: {\n enabled: false,\n position: 'nearest',\n /**\n * Sets the tooltip for the graph.\n * If the class has a tooltipMap set, then we look up the tooltip from\n * that map. If there's no tooltipMap, then we return a simple formatted\n * tooltip of just the string representing the data plus the appropriate\n * units for a linegraph, or just the unedited value if it's a different\n * kind of graph.\n */\n custom:\n (tooltipContext) => {\n // Get, or construct, a tooltip element to put all the tooltip HTML\n // into.\n const canvas = document.getElementById(this.chartDivId);\n const tooltipEl = this.findOrCreateTooltipElement(\n canvas, 'chartjs-tooltip' + this.chartDivId);\n\n if (this.clickableTooltip) {\n // We have this as a separate case rather than allowing all\n // tooltips to be interactable to ensure that the tooltip\n // functionality remains normal for the other graphs\n\n // Allows the tooltip to be clickable.\n tooltipEl.style.pointerEvents = 'auto';\n // When the mouse is no longer on the tooltip, the tooltip is\n // hidden.\n tooltipEl.addEventListener('mouseleave', function() {\n tooltipEl.style.opacity = '0';\n });\n\n } else {\n // Hide the element if there is no tooltip-- this function gets\n // called back whether you're hovering over an element or not.\n if (tooltipContext.opacity === 0) {\n tooltipEl.style.opacity = '0';\n return;\n }\n }\n if (tooltipContext.body) {\n const tooltipArray = this.getTooltipValue(tooltipContext);\n const tooltipValue =\n AnnotatedTooltip.combineAnnotatedTooltipArr(tooltipArray);\n tooltipEl.innerHTML = tooltipValue.tooltipChart;\n if (tooltipValue.additionalAttachment) {\n this.addAdditionalElementTooltip(tooltipArray);\n }\n }\n // Display the tooltip lined up with the data point.\n const positionY = canvas.offsetTop;\n const positionX = canvas.offsetLeft;\n tooltipEl.style.opacity = '1';\n tooltipEl.style.left = positionX + tooltipContext.caretX + 'px';\n tooltipEl.style.top = positionY + tooltipContext.caretY + 'px';\n }\n },\n annotation: {\n // Array of annotation configuration objects to be filled in.\n annotations: []\n },\n // Disable any visual changes on hovering.\n hover: {mode: null},\n /** The settings below are just for better performance. */\n animation: {duration: 0},\n responsiveAnimationDuration: 0\n };\n\n /** A unique identifier for the element to bind the graph to. */\n chartDivId: string;\n\n /**\n * The default chart type for this chart. The Angular directive binds\n * to this string to tell chart.js which chart type to use.\n */\n chartTypeString = 'line';\n\n /**\n * Boolean representing if the tooltip needs to be interactable, allowing\n * for clicks into the tooltip links\n */\n clickableTooltip = false;\n\n constructor(\n readonly sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n // Generate a unique ID for this chart.\n const chartId = uuid();\n // Replace the dashes in the UUID to meet HTML requirements.\n const re = /\\-/gi;\n this.chartDivId = 'chart' + chartId.replace(re, '');\n }\n\n ngOnInit() {\n this.generateChart();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.eventlines) {\n this.updateEventlines(changes.eventlines.currentValue);\n }\n if (changes.dateRange) {\n this.chartOptions.scales.xAxes = [this.generateXAxis()];\n this.entireInterval = Interval.fromDateTimes(\n this.dateRange.start.toLocal().startOf('day'),\n this.dateRange.end.toLocal().endOf('day'));\n }\n if (changes.xRegions) {\n this.showXRegions();\n }\n }\n\n /**\n * When the component gets initialized and upon updates, this series of calls\n * modifies the data-bound variables so that the correct chart gets rendered.\n *\n * 1) prepareForChartConfiguration: an overrideable function in which\n * subclasses can get things ready for the chart to load in data\n * 2) generateBasicChart: load in the chart data and do formatting that all\n * subclasses share in common\n * 3) adjustGeneratedChartConfiguration: make any tweaks to the chart\n * that couldn't be made until the data got loaded in\n */\n\n generateChart(focusOnSeries?: LabeledSeries[]) {\n if (this.data && this.dateRange) {\n this.chartData =\n [{data: [], label: GraphComponent.DEFAULT_BLANK_DATA_LABEL}];\n this.entireInterval = Interval.fromDateTimes(\n this.dateRange.start.toLocal().startOf('day'),\n this.dateRange.end.toLocal().endOf('day'));\n this.dataPointsInDateRange = this.data.dataPointsInRange(this.dateRange);\n this.prepareForChartConfiguration();\n this.generateBasicChart(focusOnSeries);\n this.adjustGeneratedChartConfiguration();\n }\n }\n\n updateEventlines(eventlines: Array<{[key: string]: number | string}>) {\n const currentInterval = Interval.fromDateTimes(\n this.dateRange.start.toLocal().startOf('day'),\n this.dateRange.end.toLocal().endOf('day'));\n this.chartOptions.annotation.annotations =\n this.chartOptions.annotation.annotations.filter(\n a => !(a.id && a.id.includes('eventline')));\n if (this.chart) {\n for (const eventline of eventlines) {\n const currentDate = DateTime.fromMillis(Number(eventline.value));\n if (currentInterval.contains(currentDate)) {\n const line = {\n type: 'line',\n mode: 'vertical',\n id: 'eventline' + eventline.value,\n scaleID: GraphComponent.X_AXIS_ID,\n value: currentDate.toJSDate(),\n borderColor: eventline.color,\n borderWidth: 2,\n };\n this.chartOptions.annotation.annotations.push(line);\n }\n }\n this.reloadChart();\n }\n }\n\n reloadChart() {\n if (this.chart !== undefined && this.chart.chart !== undefined) {\n this.chart.chart.destroy();\n\n this.chart.datasets = this.chartData;\n this.chart.options = this.chartOptions;\n this.chart.ngOnInit();\n }\n }\n\n /**\n * Lines up any extra things needed to generate the\n * chart. Override this function when you need to make changes before the data\n * is loaded into the chart or when you need to load more data into the chart.\n */\n prepareForChartConfiguration() {}\n\n /**\n * Tweaks the generated chart. Override this function when you need to make\n * changes based on the data loaded into the chart.\n */\n adjustGeneratedChartConfiguration() {}\n\n /**\n * Sets up a generalized c3.ChartConfig for the data passed in. See\n * the type definition at:\n * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/c3/index.d.ts\n */\n private generateBasicChart(focusOnSeries?: LabeledSeries[]) {\n // Transform the data into a format that chart.js can render it.\n Chart.defaults.global.defaultFontFamily = 'Work Sans';\n const data = [];\n for (const series of this.data.series) {\n let lineWidth: number = GraphComponent.THIN_LINE;\n let adjustedPointRadius = 3;\n if (focusOnSeries !== undefined && focusOnSeries.includes(series)) {\n lineWidth = GraphComponent.THICK_LINE;\n adjustedPointRadius = 4;\n }\n if (series.coordinates.length > 0) {\n data.push({\n data: series.coordinates.map(pt => {\n return {x: pt[0].toISO(), y: pt[1]};\n }),\n label: series.label,\n // Do not fill the area under the line.\n fill: false,\n borderWidth: lineWidth,\n pointBorderWidth: 2,\n pointRadius: adjustedPointRadius,\n backgroundColor: series.legendInfo.fill,\n borderColor: series.legendInfo.fill,\n pointBackgroundColor: series.legendInfo.fill,\n pointBorderColor: series.legendInfo.outline,\n });\n }\n }\n\n // The subclasses may have already put series in lineChartData, and\n // we don't want to remove them, so we just append them to the\n // series. On the other hand, if there's a blank series in\n // lineChartData, we want to get rid of it before putting everything\n // else in.\n if (data.length > 0 && this.onlyDefaultDataPresent()) {\n this.chartData = data;\n } else {\n this.chartData = this.chartData.concat(data);\n }\n\n // Set the axis label if it's provided.\n this.chartOptions.scales.yAxes[0].scaleLabel.labelString = this.axisLabel ?\n this.axisLabel.substr(0, 10) +\n (this.axisLabel.length > 10 ? '...' : '') :\n '';\n\n // Add left-padding so that the y-axes are aligned with one another.\n this.chartOptions.scales.yAxes[0]['afterSetDimensions'] = function(axes) {\n axes.paddingLeft = GraphComponent.Y_AXIS_LEFT_PADDING;\n axes.chart.canvas.parentNode.style.height =\n GraphComponent.MIN_AXIS_HEIGHT + 'px';\n };\n\n const self = this;\n this.chartOptions.animation.onComplete = function(chart) {\n self.showNoDataLabel(this);\n };\n }\n\n private showXRegions() {\n if (!this.xRegions) {\n return;\n }\n for (const region of this.xRegions) {\n const annotation = {\n // Show the region underneath the data points.\n drawTime: 'beforeDatasetsDraw',\n type: 'box',\n xMin: region[0].toMillis(),\n xMax: region[1].toMillis(),\n xScaleID: GraphComponent.X_AXIS_ID,\n yScaleID: GraphComponent.Y_AXIS_ID,\n backgroundColor: 'rgba(179, 157, 219, 0.3)', // purple secondary color\n borderColor: 'rgba(179, 157, 219, 0.4)', // purple secondary color\n borderWidth: 1,\n };\n this.chartOptions.annotation.annotations.push(annotation);\n }\n this.reloadChart();\n }\n\n showNoDataLabel(chart: any) {\n if (!this.dataPointsInDateRange) {\n // Remove all other ctx objects drawn.\n chart.clear();\n chart.draw();\n\n const xCoordinate = chart.width / 2;\n const yCoordinate = chart.height / 2;\n chart.ctx.textAlign = 'center';\n chart.ctx.fillText(\n UI_CONSTANTS.NO_DATA_AVAILABLE_TMPL +\n this.entireInterval.start.toLocal().toLocaleString() + ' and ' +\n this.entireInterval.end.toLocal().toLocaleString(),\n xCoordinate, yCoordinate);\n }\n }\n\n protected onlyDefaultDataPresent() {\n return this.chartData.length === 1 &&\n this.chartData[0].label === GraphComponent.DEFAULT_BLANK_DATA_LABEL;\n }\n\n /***************************\n * Legend interactions\n */\n\n resetChart() {\n this.generateChart();\n }\n\n focusOnSeries(labeledSeries: LabeledSeries[]) {\n this.generateChart(labeledSeries);\n }\n\n /******************************\n * Helper functions for tooltipping\n */\n\n /**\n * Finds or creates a HTML element to render the tooltip onto.\n * @param canvas The Canvas this graph is rendered on\n * @param uniqueId The unique ID to give to this element. If not provided,\n * will use 'chartjs-tooltip' + the chart div ID.\n */\n protected findOrCreateTooltipElement(canvas: HTMLElement, uniqueId: string):\n HTMLElement {\n const tooltipTag =\n uniqueId ? uniqueId : 'chartjs-tooltip' + this.chartDivId;\n let tooltipEl = document.getElementById(tooltipTag);\n if (!tooltipEl) {\n tooltipEl = document.createElement('div');\n tooltipEl.id = tooltipTag;\n tooltipEl.classList.add('chartjs-tooltip');\n tooltipEl.innerHTML = '
';\n canvas.parentNode.appendChild(tooltipEl);\n }\n return tooltipEl;\n }\n\n /**\n * Adds any additional elements from AnnotatedTooltip that are not\n * in the normal tooltip. Currently logic in the children class, but\n * when we need more overarching logic, we can populate this function.\n *\n * @param tooltipArray AnnotatedTooltip[] containing the attachment we wish\n * to display in the matDialog.\n */\n protected addAdditionalElementTooltip(tooltipArray: AnnotatedTooltip[]) {}\n\n /**\n * Gets the tooltip for the given context.\n * @param tooltipContext The tooltip context passed into the tooltip\n * callback\n */\n private getTooltipValue(tooltipContext: any): AnnotatedTooltip[] {\n // We squish together all points at the same timestamp preemptively\n // in our tooltip creation so that we just find the index of the\n // tooltip based on the first point's x-value.\n const xValue = tooltipContext.dataPoints[0].label;\n\n const timestampKey = DateTime.fromISO(xValue).toMillis().toString();\n // Our data class may provide a tooltip key function that will\n // get the correct identifier from the data point. If it does,\n // we'll use that, but by default, the key is the timestamp\n // of the data point.\n const keyToUse = this.data.tooltipKeyFn ?\n this.data.tooltipKeyFn(tooltipContext) :\n timestampKey;\n\n // If something bad happens and we don't have a tooltip for the\n // key, return a generic tooltip with the value.\n let newTT: AnnotatedTooltip[];\n if (!this.data.tooltipMap || !this.data.tooltipMap.has(keyToUse)) {\n newTT = [new StandardTooltip(\n [], undefined,\n this.data instanceof LineGraphData ? this.data.unit : '')\n .getTooltip(undefined, this.sanitizer)];\n } else {\n newTT = this.data.tooltipMap.get(keyToUse);\n }\n return newTT;\n }\n\n /*************************\n * Helper functions for other chart options\n */\n protected generateXAxis(): ChartXAxe {\n return {\n id: GraphComponent.X_AXIS_ID,\n type: 'time',\n gridLines: {display: true, drawOnChartArea: false},\n time: {\n // This sets the bounds of the x-axis. The default values of 0 and 10\n // are nonsensical but necessary since the graph is first rendered\n // before dateRange is bound.\n min: this.dateRange ? this.dateRange.start.toISO() :\n DateTime.utc().toISO(),\n max: this.dateRange ? this.dateRange.end.toISO() :\n DateTime.utc().toISO(),\n // If we're showing fewer than three days, go for the hour axis labels;\n // otherwise go with by-day axis labels.\n unit: this.dateRange && (this.dateRange.length('day') > 3) ? 'day' :\n 'hour',\n displayFormats: {\n hour: 'MM/DD H:mm',\n day: 'MM/DD',\n }\n },\n ticks: {\n // Only show as many tick labels will fit neatly on the axis.\n autoSkip: true,\n display: true,\n fontSize: 12,\n padding: -10,\n },\n scaleLabel: {fontFamily: 'Work Sans'}\n };\n }\n\n private generateYAxis(): ChartYAxe {\n return {\n id: GraphComponent.Y_AXIS_ID,\n position: 'left',\n // Show tick marks but not grid lines.\n gridLines: {display: true, drawOnChartArea: false},\n scaleLabel: {\n display: true,\n labelString: '',\n },\n ticks: {\n // We explicitly set the y values to show, so we don't want to use\n // autoskip.\n autoSkip: false,\n callback: (value, index, values) => {\n if (!this.data || (typeof value) !== 'number') {\n return value;\n }\n return formatNumberWithPrecision(value, this.data.precision);\n }\n }\n };\n }\n}\n","\n// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\nimport * as Color from 'color';\nimport * as Colors from '../../theme/verily_colors';\n/**\n * Represents how a concept will be displayed in a legend, with a label, fill\n * color, and outline color.\n */\nexport class LegendInfo {\n private static colorIdx = 0;\n constructor(\n readonly label: string, readonly fill?: Color, readonly outline?: Color) {\n let tempColor: Color = fill;\n if (!fill) {\n tempColor = Colors.getDataColors()[LegendInfo.colorIdx];\n LegendInfo.colorIdx =\n (LegendInfo.colorIdx + 1) % Colors.getDataColors().length;\n }\n this.fill = tempColor;\n this.outline = outline ? outline : tempColor;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject, Input, OnChanges, SimpleChanges} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {ChartPoint} from 'chart.js';\nimport {DateTime} from 'luxon';\nimport {ABNORMAL} from 'src/app/theme/verily_colors';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {LabeledSeries} from '../../graphdatatypes/labeled-series';\nimport {LineGraphData} from '../../graphdatatypes/linegraphdata';\nimport {GraphComponent} from '../graph/graph.component';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\n\n@Component({\n selector: 'app-linegraph',\n templateUrl: '../graph/graph.component.html',\n styleUrls: ['../graph.css'],\n providers: [\n {provide: GraphComponent, useExisting: forwardRef(() => LineGraphComponent)}\n ]\n})\nexport class LineGraphComponent extends GraphComponent implements\n OnChanges {\n /**\n * The amount to pad the y-axis around the displayed data range. This gives\n * the data points a little cushion so that they don't run off the top or\n * bottom of the axis.\n */\n static readonly yAxisPaddingFactor = 0.25;\n static readonly NORMAL_BOUND_SERIES_NAME = 'normalBound';\n\n @Input() showTicks: boolean;\n\n private addedNormalBound = false;\n\n constructor(\n readonly sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n super.ngOnChanges(changes);\n }\n\n adjustGeneratedChartConfiguration() {\n // We have to wait until after the data loads up into the graph to iterate\n // over the points and adjust their coloring based on the normal range.\n this.addedNormalBound = this.isNormalBoundAdded(this.data.series);\n this.addYNormalRange();\n\n const seriesLength = this.data.series.length;\n\n if (this.addedNormalBound) {\n // Gives the last labeledSeries in the array a different set of\n // characteristics. The last labeledSeries depicts the normal boundary.\n const chartjsSeries = this.chartData[seriesLength - 1];\n chartjsSeries.pointStyle = 'crossRot';\n chartjsSeries.pointBorderColor = 'rgba(0,0,0,0.5)'; // medium-gray color\n chartjsSeries.pointBorderWidth = 2;\n chartjsSeries.pointRadius = 4;\n chartjsSeries.borderColor = 'transparent';\n }\n\n // Color points that fall outside of their respective normal ranges.\n // If it hasNormalBound, then the last labeledSeries does not need to\n // be styled in this for loop.\n for (let i = 0;\n i < (this.addedNormalBound ? seriesLength - 1 : seriesLength); i++) {\n const chartjsSeries = this.chartData[i];\n const labeledSeries = this.data.series[i];\n this.colorAbnormalPoints(chartjsSeries, labeledSeries);\n }\n if (!this.showTicks) {\n this.chartOptions.scales.yAxes[0].display = false;\n this.chartOptions.scales.yAxes[0].ticks.beginAtZero = true;\n }\n }\n\n /**\n * Adds y normal ranges to the graph and colors points the designated\n * \"abnormal\" color if they fall outside the normal range.\n */\n private addYNormalRange() {\n // Only LineGraphData has y normal bounds.\n if (!(this.data instanceof LineGraphData)) {\n return;\n }\n\n let normalRangeBounds;\n if (this.data.series.length === 1 || this.addedNormalBound) {\n // Some things are only valid if there are y-axis normal bounds. We\n // also only show normal bounds if there's one data series on the\n // axis, and all normal bounds for the current date range are the same.\n // These customizations are based on this.data, which is a type\n // specific for LineGraphData, and could not be generalized in the\n // abstract GraphCard class.\n let dateTimesInRange = [];\n let firstNormalRange: [number, number];\n if (this.data.series[0].normalRanges) {\n dateTimesInRange = Array.from(this.data.series[0].normalRanges.keys())\n .filter(date => this.dateRange.contains(date));\n firstNormalRange = dateTimesInRange.length > 0 ?\n this.data.series[0].normalRanges.get(dateTimesInRange[0]) :\n undefined;\n }\n if (firstNormalRange) {\n let differentNormalRanges = false;\n for (const time of dateTimesInRange) {\n const currNormalRange = this.data.series[0].normalRanges.get(time);\n if (currNormalRange[0] !== firstNormalRange[0] ||\n currNormalRange[1] !== firstNormalRange[1]) {\n differentNormalRanges = true;\n }\n }\n // If all normal ranges associated with points in the current date\n // range are the same, then add the region to the chart, and adjust\n // display bounds accordingly.\n if (!differentNormalRanges) {\n // To prevent the creation of multiple normal bound tooltips\n if (this.addedNormalBound === false) {\n this.createNormalBoundsTooltip(firstNormalRange);\n }\n this.addGreenRegion(firstNormalRange);\n normalRangeBounds = firstNormalRange;\n this.addedNormalBound = true;\n }\n }\n }\n this.adjustChartYScales(normalRangeBounds);\n }\n\n private adjustChartYScales(normalRangeBounds: [number, number]) {\n const yDisplayBounds = this.getDisplayBounds(normalRangeBounds);\n\n // If the display bounds are enforced and all the bounds are the\n // same, don't pad.\n const padding = (this.allBoundsAreEnforced() && this.allBoundsAreSame()) ?\n 0 :\n Math.abs(yDisplayBounds[1] - yDisplayBounds[0]) *\n LineGraphComponent.yAxisPaddingFactor;\n this.chartOptions.scales.yAxes[0].ticks.min = yDisplayBounds[0] - padding;\n this.chartOptions.scales.yAxes[0].ticks.max = yDisplayBounds[1] + padding;\n this.chartOptions.scales.yAxes[0].afterBuildTicks = (scale) => {\n if (this.data && this.data.yTicks) {\n scale.ticks =\n LineGraphData.getYTicks(yDisplayBounds[0], yDisplayBounds[1]);\n }\n };\n }\n\n /**\n * Helper function that determines whether the LabeledSeries has\n * a normal bound or not.\n * @param series LabeledSeries[] that presents the data that is to\n * be presented in the graph.\n * @returns boolean value that reflects whether there is a normal\n * bound or not.\n */\n private isNormalBoundAdded(series: LabeledSeries[]): boolean {\n for (const s of series) {\n if (s.label === LineGraphComponent.NORMAL_BOUND_SERIES_NAME) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Reconciles together several possible sources of y-axis display bounds. The\n * bounds can come from three places:\n * 1) Each ResourceCode has an expected data bound encoded.\n * 2) Each Observation point may have a normal range encoded (passed in as\n * normalRangeBounds only if all the observation points have the same\n * normal range; otherwise normalRangeBounds is undefined).\n * 3) LineGraphData tracks the range of data seen across all data points.\n *\n * Our goal here is to show as much data as possible without being misleading\n * or skewing the graph too much to include outlier points. So, we follow\n * these rules:\n *\n * 1) If all the ResourceCodes have the same expected data bound, and all of\n * them are marked to enforce that bound, choose those upper and lower\n * bounds.\n * 2) Else, consider each endpoint of the bound separately.\n * a. For the lower bound, choose min(min data, min normal bound)\n * b. For the upper bound, choose max(max data, max normal bound)\n */\n private getDisplayBounds(normalRangeBounds: [number, number]):\n [number, number] {\n if (this.allBoundsAreSame() && this.allBoundsAreEnforced()) {\n return this.data.resourceGroup.resourceCodes[0].displayBounds;\n }\n\n if (!normalRangeBounds) {\n return (this.data.yAxisDataBounds);\n }\n\n return [\n Math.min(this.data.yAxisDataBounds[0], normalRangeBounds[0]),\n Math.max(this.data.yAxisDataBounds[1], normalRangeBounds[1])\n ];\n }\n\n private allBoundsAreSame(): boolean {\n if (this.data.resourceGroup) {\n return new Set(\n this.data.resourceGroup.resourceCodes\n .map(code => code.displayBounds)\n .filter(bound => bound !== undefined)\n .map(\n bound =>\n bound.toString() // cast to string for hashability\n ))\n .size === 1;\n }\n return false;\n }\n\n private allBoundsAreEnforced(): boolean {\n if (this.data.resourceGroup) {\n return this.data.resourceGroup.resourceCodes\n .map(x => x.forceDisplayBounds)\n .every(x => x === true);\n }\n return false;\n }\n\n /**\n * Adds a LabeledSeries that represents the normal bounds on the y-axis\n * to the Tooltip Map.\n * @param yNormalBounds The bounds of the y range considered normal.\n */\n private createNormalBoundsTooltip(yNormalBounds: [number, number]) {\n // TypeScript requires a separate declaration for arrays of tuples.\n let coordinatesLblSeries: [DateTime, number][];\n coordinatesLblSeries = [\n [this.dateRange.start, yNormalBounds[0]],\n [this.dateRange.start, yNormalBounds[1]]\n ];\n const lblSeries = new LabeledSeries(\n LineGraphComponent.NORMAL_BOUND_SERIES_NAME, coordinatesLblSeries,\n this.data.unit);\n\n let coordinatesChartPoint: ChartPoint[];\n coordinatesChartPoint = [\n {x: this.dateRange.start.toISO(), y: yNormalBounds[0]},\n {x: this.dateRange.start.toISO(), y: yNormalBounds[1]}\n ];\n\n if (this.data) {\n this.data.series.push(lblSeries);\n\n // Creates an HTML table for the tooltip text, and adds it to the tooltip\n // map. This was done separately because not all line graphs have normal\n // bounds depicted.\n const tooltipText = '' +\n '
' +\n 'Normal Boundary
' +\n 'Upper: ' + yNormalBounds[1] + ' ' + this.data.unit + '\\n' +\n 'Lower: ' + yNormalBounds[0] + ' ' + this.data.unit +\n '
';\n\n const newTT = new AnnotatedTooltip(tooltipText);\n\n const mapKey = this.dateRange.start.valueOf().toString();\n if (this.data.tooltipMap.has(mapKey)) {\n this.data.tooltipMap.get(mapKey).push(newTT);\n } else {\n this.data.tooltipMap.set(mapKey, [newTT]);\n }\n }\n this.chartData.push({\n data: coordinatesChartPoint,\n label: LineGraphComponent.NORMAL_BOUND_SERIES_NAME\n });\n }\n\n /**\n * Draws a green box spanning the entire x-axis and covering y axis normal\n * range. Also puts descriptive labels at the top and bottom of the range.\n * @param yNormalBounds The bounds of the y range considered normal.\n */\n private addGreenRegion(yNormalBounds: [number, number]) {\n const normalRegionAnnotation = {\n // Show the y-bounds underneath the graph points.\n drawTime: 'beforeDatasetsDraw',\n type: 'box',\n yMin: yNormalBounds[0],\n yMax: yNormalBounds[1],\n // No x-axis bounds so it extends to cover the whole graph.\n xScaleID: GraphComponent.X_AXIS_ID,\n yScaleID: GraphComponent.Y_AXIS_ID,\n // Color the region light green.\n backgroundColor: 'rgba(64, 191, 128, 0.15)',\n };\n this.chartOptions.annotation.annotations.push(normalRegionAnnotation);\n }\n\n /**\n * Colors the point the default series color if it's not abnormal, or outlines\n * with the abnormal color if marked as abnormal.\n *\n * @param series The data series to color points for.\n * @param yNormalBounds The bounds of what should be considered normal.\n * @param seriesLegend The legend info for the series we're working with.\n */\n private colorAbnormalPoints(\n chartjsSeries: any, labeledSeries: LabeledSeries) {\n const pointBackgroundColors = new Array();\n const pointBorderColors = new Array();\n const pointStyle = new Array();\n\n for (let pt of chartjsSeries.data) {\n // pt could also be a number here, so we constrain it to when it's a\n // ChartPoint. For some reason Typescript doesn't like it when we do a\n // test to see if pt is an instanceof ChartPoint so checking for the\n // y-attribute is a workaround.\n pt = pt as ChartPoint;\n const inAbnormalSet = labeledSeries.abnormalCoordinates.has(pt.x);\n\n if (inAbnormalSet) {\n pointBackgroundColors.push(\n labeledSeries.legendInfo.fill.rgb().string());\n pointBorderColors.push(ABNORMAL.rgb().string());\n pointStyle.push('triangle');\n } else {\n pointBackgroundColors.push(\n labeledSeries.legendInfo.fill.rgb().string());\n pointBorderColors.push(labeledSeries.legendInfo.outline.rgb().string());\n pointStyle.push('circle');\n }\n chartjsSeries.pointBackgroundColor = pointBackgroundColors;\n chartjsSeries.pointBorderColor = pointBorderColors;\n chartjsSeries.pointStyle = pointStyle;\n }\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {ChartPoint} from 'chart.js';\nimport {CHECK_RESULT_CODE, PARTIAL} from 'src/app/fhir-resources/observation-interpretation-valueset';\nimport {WHITE} from 'src/app/theme/verily_colors';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {LabeledSeries} from '../../graphdatatypes/labeled-series';\nimport {GraphComponent} from '../graph/graph.component';\nimport {StepGraphComponent} from '../stepgraph/stepgraph.component';\n\n@Component({\n selector: 'app-microbio-graph',\n templateUrl: '../stepgraph/stepgraph.component.html',\n styleUrls: ['../graph.css'],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => MicrobioGraphComponent)\n }]\n})\nexport class MicrobioGraphComponent extends StepGraphComponent {\n constructor(\n sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n }\n\n adjustGeneratedChartConfiguration() {\n // Color points that fall outside of their respective normal ranges.\n for (let i = 0; i < this.data.series.length; i++) {\n const chartjsSeries = this.chartData[i];\n const labeledSeries = this.data.series[i];\n\n const isPositive = labeledSeries.label.includes(CHECK_RESULT_CODE);\n const isPartial = labeledSeries.label.includes(PARTIAL);\n\n const pointStyle = new Array();\n const pointBackgroundColors = new Array();\n const pointBorderColors = new Array();\n\n for (let pt of chartjsSeries.data) {\n // pt could also be a number here, so we constrain it to when it's a\n // ChartPoint. For some reason Typescript doesn't like it when we do a\n // test to see if pt is an instanceof ChartPoint so checking for the\n // y-attribute is a workaround.\n pt = pt as ChartPoint;\n // Making positive points be triangular rather than circular\n if (isPositive) {\n pointStyle.push('triangle');\n } else {\n pointStyle.push('circle');\n }\n // Making partial points have an outline rather than filled in\n if (isPartial) {\n pointBackgroundColors.push(WHITE.rgb().string());\n pointBorderColors.push(\n labeledSeries.legendInfo.outline.rgb().string());\n } else {\n pointBackgroundColors.push(\n labeledSeries.legendInfo.fill.rgb().string());\n pointBorderColors.push(\n labeledSeries.legendInfo.outline.rgb().string());\n }\n (chartjsSeries as any).pointStyle = pointStyle;\n (chartjsSeries as any).pointBackgroundColor = pointBackgroundColors;\n (chartjsSeries as any).pointBorderColor = pointBorderColors;\n }\n }\n }\n /***************************\n * Legend interactions\n * Because of the unique nature of the series in the MicrobioGraph, we do not\n * allow legend interactions for microbiology graphs. This prevents errors\n * that occur when the user hovers over a legend element that might correspond\n * to many series on the chart.\n */\n\n /**\n * @override\n */\n resetChart() {}\n\n /**\n * @override\n */\n focusOnSeries(labeledSeries: LabeledSeries[]) {}\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\n\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\nimport {GraphComponent} from '../graph/graph.component';\nimport {LineGraphComponent} from '../linegraph/linegraph.component';\n\n@Component({\n selector: 'app-scatterplot',\n templateUrl: '../graph/graph.component.html',\n styleUrls: ['../graph.css'],\n providers: [{\n provide: GraphComponent,\n useExisting: forwardRef(() => ScatterplotComponent)\n }]\n})\nexport class ScatterplotComponent extends LineGraphComponent {\n constructor(\n sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n this.chartTypeString = 'scatter';\n }\n}\n","module.exports = \"\\n
\\n
\\n \\n
\\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, forwardRef, Inject} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {DiagnosticGraphData} from '../../graphdatatypes/diagnosticgraphdata';\nimport {MicrobioGraphData} from '../../graphdatatypes/microbiographdata';\nimport {StepGraphData} from '../../graphdatatypes/stepgraphdata';\nimport {GraphComponent} from '../graph/graph.component';\n\n@Component({\n selector: 'app-stepgraph',\n templateUrl: './stepgraph.component.html',\n styleUrls: ['../graph.css'],\n providers: [\n {provide: GraphComponent, useExisting: forwardRef(() => StepGraphComponent)}\n ]\n})\nexport class StepGraphComponent extends\n GraphComponent {\n constructor(\n readonly sanitizer: DomSanitizer,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n super(sanitizer, uiConstants);\n }\n /**\n * The maximum characters for a y-axis tick label.\n */\n readonly Y_AXIS_TICK_MAX_LENGTH = 12;\n\n /**\n * Splits long tick names into multiple lines.\n *\n * To split a label into multiple lines, we turn a string into an array of\n * strings - each gets their own line when rendered.\n *\n * At most will return 2 lines so that the graph labels do not get too\n * crowded.\n *\n * @param ticks Array of current tick markings.\n */\n adjustTickLabels(ticks: string[]): string[][] {\n return ticks.map(tick => {\n const words = tick.split(' ');\n // keeps track of the resulting array corresponding to the label.\n let resultLabel = [];\n // keeps track of the current line we are building.\n let temp = '';\n for (const word of words) {\n // if adding the new word makes the line go over the max line length,\n // we add the temp line to the list of results and restart the temp\n // string with the word.\n if ((temp + word).length > this.Y_AXIS_TICK_MAX_LENGTH) {\n if (temp.length > 0) {\n resultLabel.push(temp);\n }\n temp = word;\n } else {\n temp = temp.length > 0 ? temp + ' ' + word : word;\n }\n }\n // at the end, we push the remaining line to the result.\n if (temp.length > 0) {\n resultLabel.push(temp);\n }\n\n // in the case that the result label will be more than 2 lines, we only\n // return the first 2 lines so that the graph is not too crowded.\n if (resultLabel.length > 2) {\n resultLabel = resultLabel.splice(0, 2);\n resultLabel[1] += '...';\n }\n return resultLabel;\n });\n }\n\n /**\n * Adjusts the y-axis configuration for the chart.\n */\n prepareForChartConfiguration() {\n this.chartOptions.scales.yAxes[0].type = 'category';\n this.chartOptions.scales.yAxes[0].gridLines = {\n display: true,\n drawOnChartArea: true\n };\n\n // Set up the data points.\n const allLabelsSet = new Set();\n for (const series of this.data.series) {\n series.coordinates.forEach(pt => {\n allLabelsSet.add(pt[1] as string);\n });\n }\n // Show the labels alphabetically along the y-axis.\n const allLabels = Array.from(allLabelsSet).sort();\n // Add blank labels to the top and bottom of the graph to add some\n // padding.\n allLabels.push('\\t');\n allLabels.unshift('\\t');\n this.chartOptions.scales.yAxes[0]['labels'] = allLabels;\n\n // the tick labels as is may be very long so we need to adjust them\n // before they turn into labels. We do this as a callback so that the\n // mapping from data points to the axis still works without adjustment.\n this.chartOptions.scales.yAxes[0].beforeTickToLabelConversion = (scale) => {\n scale.ticks = this.adjustTickLabels(scale.ticks);\n // based on the number of ticks, update the height of the graph\n const height =\n Math.max(GraphComponent.MIN_AXIS_HEIGHT, (scale.ticks.length) * 35);\n scale.chart.canvas.parentNode.style.height = height + 'px';\n };\n }\n adjustGeneratedChartConfiguration() {}\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LIC\n\n/**\n * Class containing information to display on the tooltips\n */\nexport class AnnotatedTooltip {\n /** InnerHTML representing the tooltipChart displayed as tooltip */\n readonly tooltipChart: string;\n /**\n * String[] containing the innerHTML of the additional attachments\n * to be displayed in the tooltip.\n */\n readonly additionalAttachment: string[];\n /**\n * Optional uniqueID used to map additionalAttachments to the correct\n * tooltip if necessary.\n */\n readonly id: string;\n\n constructor(tooltipChart: string, additionalAttachment?: string[], id?: string) {\n this.tooltipChart = tooltipChart;\n if (additionalAttachment) {\n this.additionalAttachment = additionalAttachment;\n }\n if (id) {\n this.id = id;\n }\n }\n\n /**\n * Combines the AnnotatedTooltip[] into a single AnnotatedTooltip by\n * concatenating the tooltipChart strings into a single string, and\n * combining the multiple additionalAttachment arrays into a single array.\n * This combined AnnotatedTooltip will not have a uniqueID, as the id is\n * only reserved for interfacing with the \"Attachment\" buttons.\n * @param tooltipArray AnnotatedTooltip[] that needs to be converted into a single\n * AnnotatedTooltip\n */\n public static combineAnnotatedTooltipArr(tooltipArray: AnnotatedTooltip[]): AnnotatedTooltip {\n\n const attachmentArrays = tooltipArray.map(tt => tt.additionalAttachment);\n // Flattens the array of arrays into one array\n const flattenedArray = ([] as string[]).concat(...attachmentArrays);\n\n let tooltipChart = '';\n for (const annotatedTT of tooltipArray) {\n tooltipChart += annotatedTT.tooltipChart;\n }\n return new AnnotatedTooltip(tooltipChart, flattenedArray);\n }\n}\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {SecurityContext} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {AnnotatedDiagnosticReport} from 'src/app/fhir-resources/annotated/annotated-diagnostic-report';\nimport {v4 as uuid} from 'uuid';\n\nimport {UI_CONSTANTS} from '../../../../constants';\nimport {AnnotatedTooltip} from '../tooltips/annotated-tooltip';\nimport {Tooltip} from '../tooltips/tooltip';\n\n/*\n * This class makes a tooltip for a DiagnosticReport that applies to all points\n * charted from the same report. It lists the time of the report and the html\n * text attached with the report.\n */\nexport class DiagnosticTooltip extends Tooltip {\n constructor(private addTimestampRow = true) {\n super();\n }\n\n getTooltip(\n annotatedReport: AnnotatedDiagnosticReport,\n sanitizer: DomSanitizer): AnnotatedTooltip {\n const timestamp = annotatedReport.timestamp;\n\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(timestamp, table, sanitizer);\n }\n\n // The AnnotatedTooltip will have the same ID as the button that it\n // corresponds with\n const uniqueID = uuid();\n // Replace the dashes in the UUID to meet HTML requirements.\n const re = /\\-/gi;\n const buttonID = 'button' + uniqueID.replace(re, '');\n // Attach button to the tooltip to display attachments\n this.addAttachmentButton(\n buttonID, UI_CONSTANTS.REPORT_ATTACHMENT, table, sanitizer);\n\n const tooltipChart = table.outerHTML;\n const additionalAttachment = [annotatedReport.attachmentHtml];\n return new AnnotatedTooltip(tooltipChart, additionalAttachment, buttonID);\n }\n\n /**\n * Adds a button that spans the whole row in the tooltip table.\n * @param buttonID UniqueID that helps identify the button\n * @param buttonLabel String reflecting content inside the button\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param sanitizer A DOM sanitizer\n */\n private addAttachmentButton(\n buttonID: string, buttonLabel: string, table: HTMLTableElement,\n sanitizer: DomSanitizer) {\n const row = table.insertRow();\n const cell1 = row.insertCell();\n const button = document.createElement('button');\n // Styles the button\n button.setAttribute('class', 'mat-menu-item');\n // Sets unique button ID (matches the AnnotatedTooltip ID)\n button.setAttribute('id', buttonID);\n button.innerHTML = sanitizer.sanitize(SecurityContext.HTML, buttonLabel);\n cell1.appendChild(button);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {Duration} from 'luxon';\nimport {AnnotatedAdministration, MedicationAdministration} from 'src/app/fhir-resources/medication-administration';\nimport {formatNumberWithPrecision} from 'src/app/utils/number_utils';\n\nimport {UI_CONSTANTS} from '../../../../constants';\nimport {AnnotatedMedicationOrder} from '../../../fhir-resources/medication-order';\nimport {Tooltip} from '../tooltips/tooltip';\n\nimport {AnnotatedTooltip} from './annotated-tooltip';\n\n/**\n * Makes a tooltip for a medication order that lists the order's first and last\n * doses in a table.\n */\nexport class MedicationTooltip extends Tooltip {\n getTooltip(annotatedOrder: AnnotatedMedicationOrder, sanitizer: DomSanitizer):\n AnnotatedTooltip {\n const medication = annotatedOrder.label;\n const firstDose =\n Tooltip.formatTimestamp(annotatedOrder.firstAdministration.timestamp);\n const lastDose =\n Tooltip.formatTimestamp(annotatedOrder.lastAdministration.timestamp);\n const dosageInstruction = annotatedOrder.order.dosageInstruction;\n const table = Tooltip.createNewTable();\n Tooltip.addHeader(\n `${medication}: Order #${annotatedOrder.order.orderId}`, table,\n sanitizer);\n Tooltip.addRow(table, [UI_CONSTANTS.FIRST_DOSE, firstDose], sanitizer);\n Tooltip.addRow(table, [UI_CONSTANTS.LAST_DOSE, lastDose], sanitizer);\n Tooltip.addRow(\n table, [UI_CONSTANTS.DOSAGE_INSTRUCTIONS, dosageInstruction],\n sanitizer);\n\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n\n/**\n * Makes a tooltip for a medication administration that shows its dose\n * as well as the time since the last dose.\n */\nexport class MedicationAdministrationTooltip extends\n Tooltip {\n getTooltip(\n administrations: AnnotatedAdministration[],\n sanitizer: DomSanitizer): AnnotatedTooltip {\n const timestamp = administrations[0].medAdministration.timestamp;\n const table = Tooltip.createNewTable();\n for (const administration of administrations) {\n Tooltip.addHeader(\n `${Tooltip.formatTimestamp(timestamp)}: ${\n administration.medAdministration.rxNormCode\n .label} dose. Part of Order #${\n administration.medAdministration.medicationOrderId}`,\n table, sanitizer, 3);\n Tooltip.addRow(table, ['', 'Time', 'Dose'], sanitizer);\n Tooltip.addRow(\n table,\n [\n UI_CONSTANTS.THIS_DOSE,\n Tooltip.formatTimestamp(administration.medAdministration.timestamp),\n this.formatDosage(administration.medAdministration)\n ],\n sanitizer);\n\n if (administration.previousDose) {\n const timestampDifference: Duration =\n administration.medAdministration.timestamp.diff(\n administration.previousDose.medAdministration.timestamp);\n\n const doseDiffText =\n Tooltip.formatTimestamp(\n administration.previousDose.medAdministration.timestamp) +\n '
(' + timestampDifference.toFormat('h:m') +\n ' before this dose)';\n\n Tooltip.addRow(\n table,\n [\n UI_CONSTANTS.PREVIOUS_DOSE, doseDiffText,\n this.formatDosage(administration.previousDose.medAdministration)\n ],\n sanitizer);\n } else {\n Tooltip.addRow(\n table, [UI_CONSTANTS.NO_PREVIOUS_DOSE], sanitizer, undefined, false,\n 3);\n }\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n\n private formatDosage(administration: MedicationAdministration) {\n return formatNumberWithPrecision(administration.dosage.quantity) + ' ' +\n administration.dosage.unit;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport * as Color from 'color';\nimport {AnnotatedMicrobioReport} from 'src/app/fhir-resources/annotated/annotated-microbio-report';\nimport {DiagnosticReportStatus} from 'src/app/fhir-resources/diagnostic-report';\n\nimport {UI_CONSTANTS} from '../../../../constants';\nimport {AnnotatedTooltip} from './annotated-tooltip';\nimport {Tooltip} from './tooltip';\n\n/*\n * This class makes a tooltip for BCH Microbio DiagnosticReport that applies to\n * all points charted from the same report. It lists the time of the report, the\n * report status, as well as all results contained in the report.\n */\nexport class MicrobioTooltip extends Tooltip {\n constructor(private addTimestampRow = true, private color?: Color) {\n super();\n }\n\n getTooltip(\n annotatedReport: AnnotatedMicrobioReport, sanitizer: DomSanitizer,\n isAbnormal: boolean = false): AnnotatedTooltip {\n const status = DiagnosticReportStatus[annotatedReport.report.status];\n const results = annotatedReport.report.results;\n const timestamp = annotatedReport.timestamp;\n const specimen = annotatedReport.report.specimen.type;\n\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(timestamp, table, sanitizer);\n }\n\n Tooltip.addHeader(UI_CONSTANTS.RESULT, table, sanitizer);\n\n for (const result of results) {\n Tooltip.addRow(\n table, [result.display, result.interpretation.display], sanitizer,\n this.color, isAbnormal);\n }\n Tooltip.addRow(table, [UI_CONSTANTS.STATUS, status], sanitizer);\n Tooltip.addRow(table, [UI_CONSTANTS.SPECIMEN, specimen], sanitizer);\n\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DomSanitizer} from '@angular/platform-browser';\nimport * as Color from 'color';\nimport {DateTime} from 'luxon';\nimport {AnnotatedObservation} from 'src/app/fhir-resources/annotated/annotated-observation';\nimport {Observation} from 'src/app/fhir-resources/observation';\nimport {NORMAL} from 'src/app/fhir-resources/observation-interpretation-valueset';\n\nimport {AnnotatedTooltip} from './annotated-tooltip';\nimport {Tooltip} from './tooltip';\n\n/*\n * This class makes a tooltip for a list of Observations containing discrete, or\n * qualitative, values rather than quantitative results. The list of\n * Observations should all have the same timestamp.\n */\nexport class DiscreteObservationTooltip extends Tooltip {\n constructor(private addTimestampRow = true) {\n super();\n }\n\n /**\n * Returns the HTML for a generic tooltip for discrete observations.\n * @param observations An array of type Observation\n * @param sanitizer A DOM sanitizer\n * @param isAbnormal A boolean used to change the color of the text if\n * abnormal\n * @returns A string representing the HTML table.\n */\n getTooltip(observations: Observation[], sanitizer: DomSanitizer):\n AnnotatedTooltip {\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(observations[0].timestamp, table, sanitizer);\n }\n for (const obs of observations) {\n let isAbnormal = false;\n let obsValue = obs.result;\n if (obs.interpretation && obs.interpretation.code !== NORMAL) {\n isAbnormal = true;\n obsValue = obs.result + ' (' + obs.interpretation.display + ')';\n }\n Tooltip.addRow(\n table, [obs.label, obsValue], sanitizer,\n undefined, // color\n isAbnormal);\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n\n/**\n * Makes a generic tooltip for an AnnotatedObservation with rows for each of\n * its annotation values.\n */\nexport class GenericAnnotatedObservationTooltip extends\n Tooltip {\n constructor(private addTimestampRow: boolean, private color: Color) {\n super();\n }\n\n /**\n * Returns the HTML for a generic tooltip.\n * @param observation The AnnotatedObservation used to generate the tooltip\n * @param sanitizer A DOM sanitizer\n * @param isAbnormal A boolean used to change the color of the text if\n * abnormal\n * @returns If the observation has annotations, a AnnotatedTooltip.\n * If there are no annotations, will return undefined.\n */\n getTooltip(\n observation: AnnotatedObservation, sanitizer: DomSanitizer,\n isAbnormal: boolean = false): AnnotatedTooltip|undefined {\n const table = Tooltip.createNewTable();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(\n observation.observation.timestamp, table, sanitizer);\n }\n\n Tooltip.addRow(\n table, [observation.label, this.getObservationValue(observation)],\n sanitizer, this.color, isAbnormal);\n for (const annotation of observation.annotationValues) {\n Tooltip.addRow(table, annotation, sanitizer);\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n /**\n * Helper function that returns a string that reflects the observation\n * value depicted on the tooltip.\n * @param observation The AnnotatedObservation used to generate the tooltip\n */\n\n private getObservationValue(observation: AnnotatedObservation): string {\n const interpretation = observation.observation.interpretation ?\n ' (' + observation.observation.interpretation.display + ')' :\n '';\n // Example: Temperature | 38.8 Deg C (HI)\n if (observation.observation.value && observation.observation.unit) {\n return observation.observation.value.value.toString() + ' ' +\n observation.observation.unit + interpretation;\n }\n // Example: Bacteria Urinalysis | Trace Graded/hpf (ABN)\n if (observation.observation.result) {\n return observation.observation.result + interpretation;\n }\n // Example: Blood Pressure | (HI)\n return interpretation;\n }\n}\n\n/**\n * Makes a generic tooltip for an AnnotatedObservation with rows for each of\n * its annotation values.\n */\nexport class GenericAbnormalTooltip extends\n Tooltip<{[key: string]: number | string}> {\n constructor(private addTimestampRow: boolean, private color: Color) {\n super();\n }\n\n /**\n * Returns the HTML for a generic tooltip.\n * @param params The parameters necessary for the AbnormalTooltip text. It\n * should contain a timestamp field, a value field, a label field, and a\n * unit field.\n * @param sanitizer A DOM sanitizer\n * @returns If the observation has annotations, an AnnotatedTooltip.\n * If there are no annotations, will return undefined.\n */\n getTooltip(params: {[key: string]: number|string}, sanitizer: DomSanitizer):\n AnnotatedTooltip|undefined {\n const table = Tooltip.createNewTable();\n const millis: any = params['timestamp'];\n const timestamp = DateTime.fromMillis(millis).toLocal();\n if (this.addTimestampRow) {\n Tooltip.addTimeHeader(timestamp, table, sanitizer);\n }\n\n Tooltip.addHeader('Caution: abnormal value', table, sanitizer);\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {SecurityContext} from '@angular/core';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport * as Color from 'color';\nimport {DateTime} from 'luxon';\n\nimport * as Colors from '../../../theme/verily_colors';\n\nimport {AnnotatedTooltip} from './annotated-tooltip';\n\n/*\n * This base class contains useful helper methods used while making a custom\n * tooltip for a c3 chart, including adding a row to the table, resetting the\n * table, and adding a header.\n *\n * This is functionally a static class, but Typescript doesn't allow for\n * abstract static functions. We make all tooltip classes inherit from Tooltip\n * so that they must implement the getTooltip function.\n *\n * @param T The type of data that the tooltip is derived from.\n */\nexport abstract class Tooltip {\n /**CSS styling for normal tooltip circular color swatch */\n static readonly TOOLTIP_NORMAL_CSS =\n 'display: inline-block; height: 10px; width: 10px; ' +\n 'margin-right: 6px; border-radius: 50%;';\n /**CSS styling for abnormal tooltip triangular color swatch */\n static readonly TOOLTIP_ABNORMAL_CSS =\n 'width: 0; display:inline-block; margin-right: 6px; ' +\n 'height: 0; border-left: 6px solid transparent; ' +\n 'border-right: 6px solid transparent; border-bottom: ' +\n '6px solid ';\n\n /**\n * Creates a new table for the tooltip. Returns a HTMLTableElement.\n */\n static createNewTable(): HTMLTableElement {\n const table: HTMLTableElement = document.createElement('table');\n table.setAttribute('class', 'tooltip');\n return table;\n }\n\n /**\n * Adds a header on the tooltips depicting the timepoint of the data\n * @param timestamp DateTime reflecting the datapoint depicted on the tooltip\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param sanitizer A DOM sanitizer\n * @param colSpan The number of columns that the header spans\n */\n static addTimeHeader(\n timestamp: DateTime, table: HTMLTableElement, sanitizer: DomSanitizer,\n colSpan = 2) {\n Tooltip.addHeader(\n Tooltip.formatTimestamp(timestamp), table, sanitizer, colSpan);\n }\n\n /**\n * Returns a string of the timestamp in format: MM/DD/YYYY HH:MM\n * @param timestamp DateTime reflecting the datapoint depicted on the tooltip\n */\n static formatTimestamp(timestamp: DateTime) {\n return timestamp.toLocal().toLocaleString() + ' ' +\n timestamp.toLocal().toLocaleString(DateTime.TIME_24_SIMPLE);\n }\n\n /**\n * Adds a header to the HTMLTableElement\n * @param content String reflecting content inside the header\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param sanitizer A DOM sanitizer\n * @param colSpan The number of columns that the header spans\n */\n static addHeader(\n content: string, table: HTMLTableElement, sanitizer: DomSanitizer,\n colSpan = 2) {\n // Header row\n const row = table.insertRow();\n const headerCell = document.createElement('th');\n row.appendChild(headerCell);\n headerCell.colSpan = colSpan;\n headerCell.innerHTML = sanitizer.sanitize(SecurityContext.HTML, content);\n }\n\n /**\n * Adds row to the HTMLTableElement\n * @param table HTMLTableElement on the tooltip that needs to be edited\n * @param cellText String array reflecting the content on the tooltip\n * @param sanitizer A DOM sanitizer\n * @param color Color that is displayed on the legend and the graph.\n * @param isAbnormal Boolean that depicts whether the datapoint is abnormal\n * @param colspan Number that specifies how many columns each cell should span\n */\n static addRow(\n table: HTMLTableElement, cellText: string[], sanitizer: DomSanitizer,\n color?: Color, isAbnormal?: boolean, colspan?: number) {\n const row = table.insertRow();\n for (let i = 0; i < cellText.length; i++) {\n const cell1 = row.insertCell();\n if (colspan) {\n cell1.setAttribute('colspan', colspan.toString());\n }\n if (i === 0) {\n cell1.className = 'name';\n if (isAbnormal) {\n cell1.setAttribute('style', 'color: ' + Colors.ABNORMAL);\n }\n if (color) {\n cell1.appendChild(Tooltip.makeColorSwatch(color, isAbnormal));\n const div = document.createElement('div');\n div.setAttribute('style', 'display: inline-block;');\n div.innerHTML = sanitizer.sanitize(SecurityContext.HTML, cellText[i]);\n cell1.appendChild(div);\n continue;\n }\n } else {\n cell1.className = 'value';\n if (isAbnormal) {\n cell1.setAttribute('style', 'color: ' + Colors.ABNORMAL);\n }\n }\n cell1.innerHTML = sanitizer.sanitize(SecurityContext.HTML, cellText[i]);\n }\n }\n\n /**\n * Helper function that creates the color swatch on the tooltips. If it\n * is regular, it is rectangular. If it is abnormal, it is triangular.\n * @param color Color that is displayed on the legend and the graph.\n * @param isAbnormal Boolean that depicts whether the datapoint is abnormal\n */\n static makeColorSwatch(color: Color, isAbnormal: boolean = false):\n HTMLSpanElement {\n const colorSpan: HTMLSpanElement = document.createElement('span');\n if (isAbnormal) {\n // Creates a triangular color swatch\n colorSpan.setAttribute(\n 'style', this.TOOLTIP_ABNORMAL_CSS + color.toString());\n } else {\n // Creates a circular color swatch\n colorSpan.setAttribute(\n 'style',\n 'background-color: ' + color.toString() + '; ' +\n this.TOOLTIP_NORMAL_CSS);\n }\n return colorSpan;\n }\n\n abstract getTooltip(inputValue: T, sanitizer: DomSanitizer): AnnotatedTooltip;\n}\n\n/**\n * This is a generic tooltip for a data point on the graph. It just takes in\n * the data points C3 provides to the tooltip function, then returns a table\n * with a header of the timestamp and a row for each included point.\n * The left hand side of each row is the series label. The right hand side of\n * each row is the y-value.\n */\nexport class StandardTooltip extends Tooltip {\n constructor(\n private dataPoints: any[], private color: Function, private unit = '') {\n super();\n }\n\n getTooltip(unused: any, sanitizer: DomSanitizer): AnnotatedTooltip {\n const table = Tooltip.createNewTable();\n Tooltip.addTimeHeader(\n DateTime.fromJSDate(new Date(this.dataPoints[0].x)), table, sanitizer);\n\n for (const pt of this.dataPoints) {\n Tooltip.addRow(\n table, [pt.name, pt.value + ' ' + this.unit], sanitizer,\n this.color(pt));\n }\n const tooltipChart = table.outerHTML;\n return new AnnotatedTooltip(tooltipChart);\n }\n}\n","/**\n * Error class for errors with request IDs.\n * Formats the error message with the list of request IDs, the message,\n * and optional json.\n */\nexport class ResultError extends Error {\n readonly shortMessage;\n\n constructor(requestIds: Set, message: string, json?: any) {\n const requestIDMessage = requestIds.size > 0 ?\n `Request IDs: ${Array.from(requestIds).join(', ')}.\\n` :\n '';\n const shortMessage = requestIDMessage + message;\n let completeMessage = shortMessage;\n if (json) {\n completeMessage += `\\nJSON: ${JSON.stringify(json, null, 4)}`;\n }\n super(completeMessage);\n // 'super' needs to be called before accessing 'this', so we need to set\n // this.shortMessage after calling 'super'.\n this.shortMessage = shortMessage;\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Injectable} from '@angular/core';\nimport {DateTime, Interval} from 'luxon';\n\nimport {ResourceCodeCreator} from '../conceptmappings/resource-code-creator';\nimport {ResourceCodeManager} from '../conceptmappings/resource-code-manager';\nimport {DisplayGrouping} from '../conceptmappings/resource-codes/display-grouping';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ResultError} from '../result-error';\n\n/**\n * This class is a service that communicates the user-selected concepts on the\n * configuration page (SetupComponent) to CardContainerComponent.\n */\n@Injectable({providedIn: 'root'})\nexport class SetupDataService {\n private today = DateTime.local().startOf('day');\n\n /** Which concepts to display. */\n selectedConcepts = new Array();\n /** Which encounters to show in the date picker. */\n encounters = new Array();\n encountersError?: ResultError;\n /**\n * The first date range to load into the app.\n */\n selectedDateRange: Interval =\n Interval.fromDateTimes(this.today.minus({days: 7}), this.today);\n\n readonly displayGroupMapping: Promise> =\n this.resourceCodeManager.getDisplayGroupMapping(\n this.fhirService, this.resourceCodeCreator);\n\n constructor(\n private resourceCodeManager: ResourceCodeManager,\n private fhirService: FhirService,\n private resourceCodeCreator: ResourceCodeCreator) {}\n}\n","module.exports = \"button {\\n margin-right: 10px;\\n}\\n\\nh3 {\\n padding: 5px;\\n margin: 10px;\\n}\\n\\nh1, h2 {\\n font-family: 'Montserrat', sans-serif;\\n}\\n\\n.search-icon {\\n padding-top: 20px;\\n vertical-align: bottom;\\n}\\n\\n.actions {\\n margin-left: auto;\\n padding: 20px;\\n}\\n\\n.category {\\n padding-left: 10px;\\n}\\n\\n.category-group-tile {\\n padding-bottom: 10px;\\n}\\n\\n.category-label {\\n line-height: 28px;\\n margin: 0px;\\n padding: 0px;\\n padding-left: 15px;\\n}\\n\\n.mainSetup {\\n width: 100%;\\n padding-top: 20px;\\n padding-left: 40px;\\n color: white;\\n height: 100%;\\n}\\n\\n.conceptOptions {\\n padding-left: 25px;\\n}\\n\\n::ng-deep .mat-figure {\\n -ms-flex-align: start !important;\\n align-items: flex-start !important;\\n -ms-flex-pack: left !important;\\n justify-content: left !important;\\n display: -ms-grid !important;\\n}\\n\\n::ng-deep .mat-checkbox-label {\\n line-height: 28px !important;\\n}\\n\\n::ng-deep .mat-toolbar-row, .mat-toolbar-single-row {\\n display: flex;\\n display: -ms-flexbox;\\n}\\n\\n.defaultBackgroundColor {\\n background-color: #202020; /* Grey 900 */\\n}\\n\\n.accentBackgroundColor {\\n /* Deep Purple 800 to Pink 900 */\\n background-image: linear-gradient(to right, #4527A0 , #870D4E);\\n color: white;\\n}\\n\\n::ng-deep app-setup .mat-form-field-wrapper {\\n color: white;\\n}\\n\\n::ng-deep app-setup .mat-checkbox-frame {\\n border-color: white;\\n}\\n\\n::ng-deep app-setup .mat-radio-outer-circle {\\n border-color: white;\\n}\\n\\n::ng-deep app-setup .mat-checkbox-disabled .mat-checkbox-label {\\n color: gray;\\n}\\n\\n::ng-deep app-setup .mat-form-field-empty.mat-form-field-label {\\n color: white;\\n}\\n\\n::ng-deep app-setup .mat-form-field-label {\\n color:white !important;\\n}\\n\\n::ng-deep app-setup .mat-form-field-underline {\\n background-color: white !important;\\n}\\n\\n::ng-deep app-setup .mat-form-field.mat-focused .mat-form-field-ripple {\\n background-color: white !important;\\n}\\n\\n::ng-deep app-setup .mat-form-field-underline {\\n background-color: white !important;\\n}\\n\\napp-setup .mat-input-placeholder {\\n color: white;\\n}\\n\\n.encounters-error {\\n width: 50%;\\n margin-bottom: 16px;\\n white-space: pre-wrap;\\n word-break: break-all;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvc2V0dXAvc2V0dXAuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFlBQVk7RUFDWixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxxQ0FBcUM7QUFDdkM7O0FBRUE7RUFDRSxpQkFBaUI7RUFDakIsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFLGlCQUFpQjtFQUNqQixXQUFXO0VBQ1gsWUFBWTtFQUNaLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsa0JBQWtCO0VBQ2xCLFlBQVk7RUFDWixZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxnQ0FBa0M7TUFBbEMsa0NBQWtDO0VBQ2xDLDhCQUFnQztNQUFoQyxnQ0FBZ0M7RUFDaEMsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG9CQUFvQjtBQUN0Qjs7QUFFQTtFQUNFLHlCQUF5QixFQUFFLGFBQWE7QUFDMUM7O0FBRUE7RUFDRSxnQ0FBZ0M7Q0FDakMsOERBQThEO0NBQzlELFlBQVk7QUFDYjs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFdBQVc7QUFDYjs7QUFDQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLGtDQUFrQztBQUNwQzs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLFVBQVU7RUFDVixtQkFBbUI7RUFDbkIscUJBQXFCO0VBQ3JCLHFCQUFxQjtBQUN2QiIsImZpbGUiOiJzcmMvYXBwL3NldHVwL3NldHVwLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJidXR0b24ge1xuICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG59XG5cbmgzIHtcbiAgcGFkZGluZzogNXB4O1xuICBtYXJnaW46IDEwcHg7XG59XG5cbmgxLCBoMiB7XG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCcsIHNhbnMtc2VyaWY7XG59XG5cbi5zZWFyY2gtaWNvbiB7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xufVxuXG4uYWN0aW9ucyB7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBwYWRkaW5nOiAyMHB4O1xufVxuXG4uY2F0ZWdvcnkge1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5jYXRlZ29yeS1ncm91cC10aWxlIHtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XG5cbi5jYXRlZ29yeS1sYWJlbCB7XG4gIGxpbmUtaGVpZ2h0OiAyOHB4O1xuICBtYXJnaW46IDBweDtcbiAgcGFkZGluZzogMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG59XG5cbi5tYWluU2V0dXAge1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogNDBweDtcbiAgY29sb3I6IHdoaXRlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5jb25jZXB0T3B0aW9ucyB7XG4gIHBhZGRpbmctbGVmdDogMjVweDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtZmlndXJlIHtcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQgIWltcG9ydGFudDtcbiAganVzdGlmeS1jb250ZW50OiBsZWZ0ICFpbXBvcnRhbnQ7XG4gIGRpc3BsYXk6IC1tcy1ncmlkICFpbXBvcnRhbnQ7XG59XG5cbjo6bmctZGVlcCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgbGluZS1oZWlnaHQ6IDI4cHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtdG9vbGJhci1yb3csIC5tYXQtdG9vbGJhci1zaW5nbGUtcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG59XG5cbi5kZWZhdWx0QmFja2dyb3VuZENvbG9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsgLyogR3JleSA5MDAgKi9cbn1cblxuLmFjY2VudEJhY2tncm91bmRDb2xvciB7XG4gIC8qIERlZXAgUHVycGxlIDgwMCB0byBQaW5rIDkwMCAqL1xuIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzQ1MjdBMCAsICM4NzBENEUpO1xuIGNvbG9yOiB3aGl0ZTtcbn1cblxuOjpuZy1kZWVwICBhcHAtc2V0dXAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIge1xuICBjb2xvcjogd2hpdGU7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1jaGVja2JveC1mcmFtZSB7XG4gIGJvcmRlci1jb2xvcjogd2hpdGU7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6IHdoaXRlO1xufVxuXG46Om5nLWRlZXAgYXBwLXNldHVwIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbCB7XG4gIGNvbG9yOiBncmF5O1xufVxuOjpuZy1kZWVwIGFwcC1zZXR1cCAubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogd2hpdGU7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6d2hpdGUgIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIGFwcC1zZXR1cCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIGFwcC1zZXR1cCAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG59XG5cbjo6bmctZGVlcCBhcHAtc2V0dXAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG59XG5cbmFwcC1zZXR1cCAubWF0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHdoaXRlO1xufVxuXG4uZW5jb3VudGVycy1lcnJvciB7XG4gIHdpZHRoOiA1MCU7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xufVxuIl19 */\"","module.exports = \"\\n

{{uiConstants.INITIAL_CONFIGURATION_HEADER}}  

\\n \\n
\\n \\n
\\n
\\n
\\n \\n
\\n
\\n
\\n

{{uiConstants.WHICH_ENCOUNTER_FIRST}}

\\n \\n \\n errorError loading patient encounters.\\n Technical details:
{{setupDataService.encountersError.message}}\\n
\\n \\n
\\n \\n {{encounter.period.toFormat('MM/dd/yyyy')}} {{uiConstants.ENCOUNTER}}\\n \\n
\\n
\\n \\n {{item[1]}}\\n \\n
\\n
\\n
\\n
\\n

{{uiConstants.WHICH_CONCEPTS_FIRST}}

\\n \\n \\n
\\n
\\n \\n \\n search\\n \\n
\\n \\n \\n \\n \\n
\\n
\\n

{{entry[0].label}}

\\n
\\n
\\n \\n {{element.label}} {{uiConstants.NO_DATA_PAST_SIX_MOS}}\\n {{uiConstants.CHECKING_DATA_AVAILABILITY}}\\n \\n
\\n
\\n
\\n
\\n
\\n
\\n {{uiConstants.NO_RESULTS}}\\n
\\n
\\n
\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, Inject, OnDestroy, ViewChild} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {MatRadioGroup} from '@angular/material/radio';\nimport {Router} from '@angular/router';\nimport {DateTime, Interval} from 'luxon';\nimport {Observable} from 'rxjs';\nimport {map, startWith} from 'rxjs/operators';\nimport {APP_TIMESPAN, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {environment} from '../../environments/environment';\nimport {DisplayGrouping} from '../conceptmappings/resource-codes/display-grouping';\nimport {RxNormCode} from '../conceptmappings/resource-codes/rx-norm';\nimport {RxNormCodeGroup} from '../conceptmappings/resource-codes/rx-norm-group';\nimport {Encounter} from '../fhir-resources/encounter';\nimport {FhirService} from '../fhir-server/fhir.service';\nimport {AxisGroup} from '../graphs/graphtypes/axis-group';\nimport {ResultError} from '../result-error';\n\nimport {SetupDataService} from './setup-data.service';\n\nenum LoadStatus {\n LOADING,\n DATA_AVAILABLE,\n DATA_UNAVAILABLE\n}\n\n/**\n * Contains the intial configuration options for the MedTimeLine.\n * Users can choose which concepts to display, or pick the default\n * configuration.\n */\n@Component({\n selector: 'app-setup',\n templateUrl: './setup.component.html',\n styleUrls: ['./setup.component.css']\n})\nexport class SetupComponent implements OnDestroy {\n readonly allConcepts: Promise;\n readonly checkedConcepts = new Map();\n readonly chosenConcepts = new Array();\n readonly useDebugger = environment.useDebugger;\n\n readonly statusConsts = LoadStatus;\n\n /**\n * Which encounter to load into the app first.\n */\n @ViewChild(MatRadioGroup) selectedDateRange: MatRadioGroup;\n\n /**\n * This FormControl monitors changes in the user input typed in the\n * autocomplete.\n */\n readonly conceptCtrl = new FormControl();\n /**\n * An Observable of filtered [DisplayGrouping, ResourceCodesForCard[] pairings\n * based on user input in the autocomplete. Each element of the array contains\n * a DisplayGrouping and filtered ResourceCodesForCards that belong to that\n * DisplayGrouping.\n */\n displayGroupingOptions: Observable>;\n\n /**\n * An array of DisplayGroupings and AxisGroup that belong to that\n * grouping.\n */\n displayGroupings: Promise>;\n\n /**\n * Holds whether there's any data available for each resource code group.\n */\n readonly codeGroupAvailable = new Map();\n\n /**\n * List of times the patient was in the hospital.\n */\n encounters: Encounter[];\n\n // Fixed time periods to offer as options for selection.\n private today: DateTime = DateTime.local().startOf('day');\n readonly lastOneDay =\n Interval.fromDateTimes(this.today.minus({days: 1}), this.today);\n readonly lastThreeDays =\n Interval.fromDateTimes(this.today.minus({days: 3}), this.today);\n readonly lastSevenDays =\n Interval.fromDateTimes(this.today.minus({days: 7}), this.today);\n readonly lastMonth =\n Interval.fromDateTimes(this.today.minus({months: 1}), this.today);\n readonly lastThreeMonths =\n Interval.fromDateTimes(this.today.minus({months: 3}), this.today);\n\n /**\n * The time options that are always available. The boolean indicates which is\n * selected by default.\n */\n staticTimeOptions: Array<[Interval, string, boolean]>;\n\n sortResources = (function(a, b) {\n return a.label.localeCompare(b.label);\n });\n\n /**\n * Promise to load all Medication data that when resolved returns a Set of\n * all RxNormCodes that have data available within the App Timeframe.\n *\n * We load all the medication data on setup to cut down on the number of\n * calls for medication administration data availability and enhance\n * performance.\n */\n private readonly loadedMedications =\n this.fhirService.dataAvailableForMedications();\n\n ngOnDestroy() {\n // Pass the selected information through to the setup data service.\n this.setupDataService.selectedConcepts = this.chosenConcepts;\n this.setupDataService.encounters = this.encounters;\n this.setupDataService.selectedDateRange = this.selectedDateRange.value ?\n this.selectedDateRange.value :\n Interval.fromDateTimes(this.today.minus({days: 7}), this.today);\n }\n\n constructor(\n private router: Router, readonly setupDataService: SetupDataService,\n private fhirService: FhirService,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n this.allConcepts =\n setupDataService.displayGroupMapping.then((displayGroups) => {\n /* Load in the concepts to display, flattening them\n * all into a single-depth array. */\n return Array.from(displayGroups.values())\n .reduce((acc, val) => acc.concat(val), []);\n });\n this.displayGroupings =\n setupDataService.displayGroupMapping.then((displayGroups) => {\n return Array.from(displayGroups.entries());\n });\n this.staticTimeOptions = [\n [this.lastThreeMonths, uiConstants.LAST_THREE_MONTHS, false],\n [this.lastMonth, uiConstants.LAST_MONTH, false],\n [this.lastSevenDays, uiConstants.LAST_SEVEN_DAYS, true],\n [this.lastThreeDays, uiConstants.LAST_THREE_DAYS, false],\n [this.lastOneDay, uiConstants.LAST_ONE_DAY, false]\n ];\n this.setupInterface();\n }\n\n /**\n * Sets the status for the AxisGroup based on whether data is available.\n * If not available, the AxisGroup will be unchecked.\n *\n * @param axisGroup AxisGroup to set availability status for\n * @param available whether there is any data for the AxisGroup\n */\n setAxisGroupStatus(axisGroup: AxisGroup, available: boolean) {\n axisGroup.dataAvailable = available;\n if (!available) {\n this.checkedConcepts[axisGroup.label] = false;\n }\n this.codeGroupAvailable.set(\n axisGroup.label,\n available ? LoadStatus.DATA_AVAILABLE : LoadStatus.DATA_UNAVAILABLE);\n }\n\n /**\n * Sets up availability for AxisGroups that are associated with Medications.\n *\n * Since MedicationAdministration loading takes a long time (due to Cerner\n * limitations), we have preloaded the availability for all RxNormCodes.\n * Instead of making a call to the server for each Medication to check\n * availability, we use the pre-loaded list of available RxNormCodes.\n *\n * @param medAxisGroups AxisGroups with at least one axis that has an\n * RxNormCodeGroup.\n */\n setupMedicationAxisGroups(medAxisGroups: AxisGroup[]) {\n this.loadedMedications.then(rxNormCodesWithData => {\n medAxisGroups.forEach((axisGroup: AxisGroup) => {\n const availablityPromises = axisGroup.axes.map(axis => {\n // some AxisGroups have RxNormCodeGroups and non-RxNormCodeGroups axes\n // such as Medication administrations and monitoring (LOINC). We check\n // for availability differently depending on the resource group type.\n if (axis.resourceGroup instanceof RxNormCodeGroup) {\n const axisHasData = axis.resourceGroup.resourceCodes.some(\n (code: RxNormCode) => rxNormCodesWithData.has(code));\n // since we are not using the axisDataAvailableInAppTimeScope\n // function, we need to set axisDataAvailable manually\n axis.axisDataAvailable = axisHasData;\n return Promise.resolve(axisHasData);\n } else {\n return axis.axisDataAvailableInAppTimeScope();\n }\n });\n Promise.all(availablityPromises).then(availablityList => {\n this.setAxisGroupStatus(\n axisGroup, availablityList.some(avail => !!avail));\n });\n });\n });\n }\n\n setupInterface() {\n // Retrieve the patient encounters. When they load in asynchronously,\n // the radio buttons for encounter selection will show up.\n this.getEncounters();\n const medAxisGroups = [];\n this.displayGroupings.then((displayGroupings) => {\n displayGroupings.forEach((row) => {\n // row[1] is an AxisGroup[] corresponding to the display grouping in\n // row[0].\n const axisGroupArray = row[1];\n axisGroupArray.forEach((axisGroup) => {\n // Check off concepts that are on by default and set initial status\n // to loading.\n this.checkedConcepts[axisGroup.label] =\n axisGroup.axes.some(axis => axis.resourceGroup.showByDefault);\n this.codeGroupAvailable.set(axisGroup.label, LoadStatus.LOADING);\n\n // if any of the axes in the axis group are for RxNormCodeGroups,\n // we handle the axis group differently for performance reasons.\n if (axisGroup.axes.some(\n axis => axis.resourceGroup instanceof RxNormCodeGroup)) {\n medAxisGroups.push(axisGroup);\n } else {\n axisGroup.dataAvailableInAppTimeScope().then(available => {\n this.setAxisGroupStatus(axisGroup, available);\n });\n }\n });\n });\n this.setupMedicationAxisGroups(medAxisGroups);\n\n // Watch for changes to the user input on the autocomplete panel.\n this.displayGroupingOptions = this.conceptCtrl.valueChanges.pipe(\n startWith(\n ''), // The autocomplete input starts with nothing typed in.\n map(concept => concept ? this.filter(concept, displayGroupings) :\n displayGroupings.slice()));\n });\n }\n\n private getEncounters() {\n this.setupDataService.encountersError = null;\n this.fhirService.getEncountersForPatient(APP_TIMESPAN)\n .then(\n encounters => {\n if (encounters.length > 0) {\n this.encounters = encounters.sort(\n (a, b) =>\n a.period.start.toMillis() - b.period.start.toMillis());\n }\n },\n rejection => {\n if (rejection instanceof ResultError) {\n this.setupDataService.encountersError = rejection;\n } else if (rejection instanceof Error) {\n this.setupDataService.encountersError =\n new ResultError(new Set(), rejection.message);\n } else {\n this.setupDataService.encountersError =\n new ResultError(new Set(), '', rejection);\n }\n });\n }\n\n /**\n * The user wishes to continue to the main screen of MedTimeLine, with all\n * charts selected.\n */\n onContinue() {\n this.allConcepts.then((allConcepts) => {\n for (const concept of allConcepts) {\n if (this.checkedConcepts[concept.label]) {\n this.chosenConcepts.push(concept);\n }\n }\n this.router.navigate(['/main'], {skipLocationChange: true});\n });\n }\n\n /**\n * The user wishes to select all concepts.\n */\n selectAll() {\n this.allConcepts.then((allConcepts) => {\n for (const concept of allConcepts) {\n if (this.codeGroupAvailable.has(concept.label) &&\n this.codeGroupAvailable.get(concept.label) !==\n LoadStatus.DATA_UNAVAILABLE) {\n this.checkedConcepts[concept.label] = true;\n }\n }\n });\n }\n\n /**\n * The user wishes to clear all select concepts.\n */\n clearAll() {\n this.allConcepts.then((allConcepts) => {\n for (const concept of allConcepts) {\n this.checkedConcepts[concept.label] = false;\n }\n });\n }\n\n /**\n * Filter the concepts shown on the autocomplete menu.\n */\n filter(concept, displayGroupings: Array<[DisplayGrouping, AxisGroup[]]>):\n any[] {\n return displayGroupings\n .filter(entry => {\n return entry[1].some(\n axis => axis.label.toLowerCase().indexOf(\n concept.toLowerCase()) === 0);\n })\n .map(function(entry) {\n const displayGrouping: DisplayGrouping = entry[0];\n const resourceCodesFiltered = entry[1].filter(\n codes => codes.label.toLowerCase().indexOf(\n concept.toLowerCase()) === 0);\n return [displayGrouping, resourceCodesFiltered];\n });\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport * as Color from 'color';\n/**\n * Encodings of the colors for Verily branding.\n */\n\n// Primary color palette\nexport const GREY_900 = Color('#202020');\nexport const BLACK = Color('#000000');\nexport const BLUE_A400 = Color('#2878FF');\nexport const BLUE_A700 = Color('#2861FF');\nexport const DEEP_PURPLE_600 = Color('#5E35B1');\nexport const DEEP_PURPLE_800 = Color('#4527A0');\nexport const PINK_A700 = Color('#C41061');\nexport const PINK_900 = Color('#870D4E');\nexport const PINK_A400 = Color('#FF1643');\nexport const PINK_A700_DARKER = Color('#D40000');\nexport const BLUE_GREY_100 = Color('#C3D7DB');\nexport const BLUE_GREY_500 = Color('#5F7C8A');\nexport const BLUE_GREY_50 = Color('#EBEEF0');\nexport const WHITE = Color('#FFFFFF');\n\n// Secondary color palette\nexport const CYAN = Color('#00C6EF');\nexport const DEEP_CYAN = Color('#009DB7');\nexport const TURQUOISE = Color('#07796A');\nexport const DEEP_TURQUOISE = Color('#045B4C');\nexport const GREEN = Color('#0D8D39');\nexport const DEEP_GREEN = Color('#056823');\nexport const LIME = Color('#80BA17');\nexport const DEEP_LIME = Color('#668E0E');\nexport const GOLD = Color('#FFB233');\nexport const DEEP_GOLD = Color('#C38419');\nexport const ORANGE = Color('#FF8117');\nexport const DEEP_ORANGE = Color('#C35308');\nexport const CORAL = Color('#FF5052');\nexport const DEEP_CORAL = Color('#C14047');\n\n// Color to indicate a selected item.\nexport const SELECTED = BLUE_GREY_50;\n\nexport const ABNORMAL = PINK_A700_DARKER;\n\n/**\n * Returns all the colors that are acceptable for data points to be plotted in.\n */\nexport function getDataColors(): Color[] {\n return [BLUE_A700, DEEP_PURPLE_800, PINK_900, GREEN, GOLD, ORANGE, TURQUOISE];\n}\n","module.exports = \".datePicker {\\n background-color: white;\\n padding-top: 20px;\\n}\\n\\n.mat-form-field {\\n width: 40%;\\n margin-right: 5%;\\n margin-left: 5%;\\n}\\n\\n::ng-deep .mat-h2 {\\n margin-bottom: 0px !important;\\n}\\n\\n/* Remove extra padding below the button. */\\n\\n::ng-deep .mat-mini-fab .mat-button-wrapper {\\n padding: 0px !important;\\n}\\n\\n::ng-deep .mat-h2 {\\n margin-bottom: 0px !important;\\n}\\n\\n::ng-deep td.available{\\n color: black;\\n}\\n\\n::ng-deep td.notInEncounter {\\n color: grey !important;\\n opacity: .5;\\n text-decoration: line-through;\\n}\\n\\n::ng-deep td.inEncounter {\\n color: #4527A0 !important; /* Deep Purple 800 */\\n background-color: #e5f3ec;\\n}\\n\\n::ng-deep td.active.available.inEncounter {\\n color: white !important;\\n}\\n\\ninput {\\n font-family: 'Work Sans', sans-serif;\\n}\\n\\n/* Change colors of ngx-datepicker to match custom material theme */\\n\\n::ng-deep .ranges button.active {\\n background-color: #4527A0 !important; /* Deep Purple 800 */\\n}\\n\\n::ng-deep .md-drppicker .btn {\\n background-color: #4527A0 !important; /* Deep Purple 800 */\\n}\\n\\n::ng-deep td.active.available {\\n background-color: #4527A0 !important; /* Deep Purple 800 */\\n}\\n\\n.errorIcon {\\n width: 40px;\\n height: 40px;\\n line-height: 40px;\\n cursor: default;\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvdGltZS1uYXZpZ2F0aW9uL3RpbWVsaW5lLWNvbnRyb2xsZXIvdGltZWxpbmUtY29udHJvbGxlci5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0UsdUJBQXVCO0VBQ3ZCLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLFVBQVU7RUFDVixnQkFBZ0I7RUFDaEIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDZCQUE2QjtBQUMvQjs7QUFFQSwyQ0FBMkM7O0FBQzNDO0VBQ0UsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsNkJBQTZCO0FBQy9COztBQUVBO0VBQ0UsWUFBWTtBQUNkOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSx5QkFBeUIsRUFBRSxvQkFBb0I7RUFDL0MseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0Usb0NBQW9DO0FBQ3RDOztBQUVBLG1FQUFtRTs7QUFDbkU7RUFDRSxvQ0FBb0MsRUFBRSxvQkFBb0I7QUFDNUQ7O0FBRUE7RUFDRSxvQ0FBb0MsRUFBRSxvQkFBb0I7QUFDNUQ7O0FBRUE7RUFDRSxvQ0FBb0MsRUFBRSxvQkFBb0I7QUFDNUQ7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixlQUFlO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvdGltZS1uYXZpZ2F0aW9uL3RpbWVsaW5lLWNvbnRyb2xsZXIvdGltZWxpbmUtY29udHJvbGxlci5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmRhdGVQaWNrZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgcGFkZGluZy10b3A6IDIwcHg7XG59XG5cbi5tYXQtZm9ybS1maWVsZCB7XG4gIHdpZHRoOiA0MCU7XG4gIG1hcmdpbi1yaWdodDogNSU7XG4gIG1hcmdpbi1sZWZ0OiA1JTtcbn1cblxuOjpuZy1kZWVwIC5tYXQtaDIge1xuICBtYXJnaW4tYm90dG9tOiAwcHggIWltcG9ydGFudDtcbn1cblxuLyogUmVtb3ZlIGV4dHJhIHBhZGRpbmcgYmVsb3cgdGhlIGJ1dHRvbi4gKi9cbjo6bmctZGVlcCAubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXIge1xuICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIC5tYXQtaDIge1xuICBtYXJnaW4tYm90dG9tOiAwcHggIWltcG9ydGFudDtcbn1cblxuOjpuZy1kZWVwIHRkLmF2YWlsYWJsZXtcbiAgY29sb3I6IGJsYWNrO1xufVxuXG46Om5nLWRlZXAgdGQubm90SW5FbmNvdW50ZXIge1xuICBjb2xvcjogZ3JleSAhaW1wb3J0YW50O1xuICBvcGFjaXR5OiAuNTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XG59XG5cbjo6bmctZGVlcCB0ZC5pbkVuY291bnRlciB7XG4gIGNvbG9yOiAjNDUyN0EwICFpbXBvcnRhbnQ7IC8qIERlZXAgUHVycGxlIDgwMCAqL1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVmM2VjO1xufVxuXG46Om5nLWRlZXAgdGQuYWN0aXZlLmF2YWlsYWJsZS5pbkVuY291bnRlciB7XG4gIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xufVxuXG5pbnB1dCB7XG4gIGZvbnQtZmFtaWx5OiAnV29yayBTYW5zJywgc2Fucy1zZXJpZjtcbn1cblxuLyogQ2hhbmdlIGNvbG9ycyBvZiBuZ3gtZGF0ZXBpY2tlciB0byBtYXRjaCBjdXN0b20gbWF0ZXJpYWwgdGhlbWUgKi9cbjo6bmctZGVlcCAucmFuZ2VzIGJ1dHRvbi5hY3RpdmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDUyN0EwICFpbXBvcnRhbnQ7IC8qIERlZXAgUHVycGxlIDgwMCAqL1xufVxuXG46Om5nLWRlZXAgLm1kLWRycHBpY2tlciAuYnRuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzQ1MjdBMCAhaW1wb3J0YW50OyAvKiBEZWVwIFB1cnBsZSA4MDAgKi9cbn1cblxuOjpuZy1kZWVwIHRkLmFjdGl2ZS5hdmFpbGFibGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNDUyN0EwICFpbXBvcnRhbnQ7IC8qIERlZXAgUHVycGxlIDgwMCAqL1xufVxuXG4uZXJyb3JJY29uIHtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cbiJdfQ== */\"","module.exports = \"
\\n \\n \\n warning\\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, Input, OnInit, Output, Renderer2, ViewChild} from '@angular/core';\nimport {DateTime, Duration, Interval} from 'luxon';\nimport * as moment from 'moment';\nimport {DaterangepickerDirective} from 'ngx-daterangepicker-material';\nimport {APP_TIMESPAN, recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {Encounter} from '../../fhir-resources/encounter';\nimport {ResultError} from '../../result-error';\nimport {getDaysForIntervalSet} from '../../utils/date_utils';\n\n/**\n * Date range picker for selecting the time span to show in all the charts.\n *\n * There is a lot of messy date conversion in this class. The problem is that\n * we use luxon DateTime for our date handling across this application, but the\n * date range picker only works with Moment.js datetimes. The only format both\n * classes have converters for is JSDate, so we pass dates through that\n * several places.\n */\n@Component({\n selector: 'app-timeline-controller',\n templateUrl: './timeline-controller.component.html',\n styleUrls: ['./timeline-controller.component.css']\n})\nexport class TimelineControllerComponent implements OnInit {\n @Output() changeDateRange = new EventEmitter();\n @ViewChild(DaterangepickerDirective)\n pickerDirective: DaterangepickerDirective;\n\n /**\n * Holds the encounters for this patient.\n */\n @Input() encounters: Encounter[];\n\n /**\n * Holds the error if there was an error getting the encounters.\n */\n @Input() encountersError: ResultError;\n\n /**\n * Holds the date range to default to on initial setup. If unset, we'll\n * default to the last seven days.\n */\n @Input() selectedDateRange: Interval;\n\n /**\n * Holds all the ISO strings for days covered by all the patient encounters\n * above. Used to gray out datepicker options that are not part of\n * a patient's encounter.\n */\n private daysCoveredByAnEncounter = new Set();\n\n /** Bounds the dates that may be selected. */\n earliestAvailableDate = moment.utc(APP_TIMESPAN.start.toJSDate());\n readonly latestAvailableDate = moment.utc(APP_TIMESPAN.end.toJSDate());\n\n /** Selected timespan is past seven days by default. */\n readonly defaultDateRange = {\n startDate: moment(DateTime.local()\n .minus(Duration.fromObject({days: 7}))\n .startOf('day')\n .toJSDate()),\n endDate: moment(DateTime.local().startOf('day').toJSDate())\n };\n\n /**\n * The date range picker binds to this variable.\n */\n selected: {startDate: moment.Moment, endDate: moment.Moment};\n\n /** The list of encounters to display as available ranges to select. */\n readonly datePickerRanges = {};\n\n /**\n * Whether there was an encounter input into this component.\n */\n hasEncounterError = false;\n\n constructor(\n private renderer: Renderer2,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {}\n\n ngOnInit() {\n // Set the initial date range selection and fire off a change event.\n const selectedRange = {\n startDate: moment(this.selectedDateRange.start.startOf('day').toJSDate()),\n endDate: moment(this.selectedDateRange.end.startOf('day').toJSDate())\n };\n this.selected = selectedRange;\n this.datesUpdated(selectedRange);\n\n // Set up the encounters in the date picker.\n if (this.encounters && this.encounters.length > 0 &&\n !this.encountersError) {\n this.hasEncounterError = false;\n\n this.encounters = this.encounters.sort(\n (a, b) => a.period.start.toMillis() - b.period.start.toMillis());\n\n // Set the minimum date to select to be the beginning of the\n // earliest encounter that had days that fell inside the app\n // timespan, in UTC.\n this.earliestAvailableDate = moment(\n this.encounters[0].period.start.startOf('day').toUTC().toJSDate());\n\n // We have to store everything as an ISO string because if we\n // store as objects the set membership check doesn't work.\n this.daysCoveredByAnEncounter = new Set(\n getDaysForIntervalSet(this.encounters.map(x => x.period))\n .map(x => x.toISO().slice(0, 10)));\n\n // We manually update the ranges stored in the daterangepicker\n // so that the list of encounters is displayed.\n // We store these in local time to prevent errors with\n // displaying a date different than the dates of the encounter.\n // While being communicated with charts, the interval will be\n // converted to UTC.\n for (const encounter of this.encounters) {\n const start = moment(encounter.period.start.startOf('day').toJSDate());\n const end = moment(encounter.period.end.endOf('day').toJSDate());\n const label =\n start.format('MM/DD/YYYY') + '-' + end.format('MM/DD/YYYY');\n this.datePickerRanges[label] = [start, end];\n }\n this.datePickerRanges[this.uiConstants.LAST_ONE_DAY] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({days: 1}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n this.datePickerRanges[this.uiConstants.LAST_THREE_DAYS] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({days: 3}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n this.datePickerRanges[this.uiConstants.LAST_SEVEN_DAYS] =\n [this.defaultDateRange.startDate, this.defaultDateRange.endDate];\n this.datePickerRanges[this.uiConstants.LAST_MONTH] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({months: 1}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n this.datePickerRanges[this.uiConstants.LAST_THREE_MONTHS] = [\n moment(DateTime.local()\n .minus(Duration.fromObject({months: 3}))\n .startOf('day')\n .toJSDate()),\n this.defaultDateRange.endDate\n ];\n } else {\n this.hasEncounterError = true;\n }\n }\n\n /**\n * Used to add a style to dates in the date picker so that the user can\n * differentiate between dates inside and outside of encounters.\n */\n addCustomClass =\n (m: moment.Moment) => {\n // The slice gets jus tthe date portion of the ISO string.\n return this.daysCoveredByAnEncounter.has(m.toISOString().slice(0, 10)) ?\n 'inEncounter' :\n 'notInEncounter';\n }\n\n /**\n * Emits the date range picked in the date picker as an event.\n * @param range The date range selected in the picker.\n */\n datesUpdated(rangeIn: {startDate: moment.Moment, endDate: moment.Moment}) {\n if (!rangeIn.startDate || !rangeIn.endDate || !this.selected) {\n return;\n }\n if (rangeIn.startDate.isBefore(rangeIn.endDate)) {\n this.selected = rangeIn;\n // Convert to UTC time.\n const interval = Interval.fromDateTimes(\n DateTime.fromJSDate(rangeIn.startDate.toDate())\n .startOf('day')\n .toUTC(),\n DateTime.fromJSDate(rangeIn.endDate.toDate()).endOf('day').toUTC());\n this.changeDateRange.emit(interval);\n\n recordGoogleAnalyticsEvent(\n 'dateRangeChanged', 'timeline',\n interval.start.toLocaleString() + ' - ' +\n interval.end.toLocaleString());\n }\n }\n}\n","module.exports = \"
\\n \\n
{{uiConstants.SYNTH_DATA}}
\\n
{{uiConstants.LOINC_VERIFIED_STRING}}
\\n \\n \\n \\n \\n \\n
\\n\"","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {Component, EventEmitter, Inject, Output} from '@angular/core';\nimport {MatDialog} from '@angular/material/dialog';\nimport {SetupDataService} from 'src/app/setup/setup-data.service';\nimport {recordGoogleAnalyticsEvent, UI_CONSTANTS_TOKEN} from 'src/constants';\n\nimport {environment} from '../../../environments/environment';\nimport {DisplayGrouping} from '../../conceptmappings/resource-codes/display-grouping';\nimport {HelpDialogComponent} from '../../dialogs/help-dialog/help-dialog.component';\nimport {IfuDialogComponent} from '../../dialogs/ifu-dialog/ifu-dialog.component';\nimport {AxisGroup} from '../../graphs/graphtypes/axis-group';\n\n@Component({\n selector: 'app-timeline-toolbar',\n templateUrl: './timeline-toolbar.component.html',\n styleUrls: ['../../cardcontainer/cardcontainer.component.css']\n})\nexport class TimelineToolbarComponent {\n displayGroupings: Array<[DisplayGrouping, AxisGroup[]]>;\n readonly showMockDataMessage = environment.useMockServer;\n\n @Output() saveSnapshot = new EventEmitter();\n @Output() addTextbox = new EventEmitter();\n\n constructor(\n setupDataService: SetupDataService, private helpDialog: MatDialog,\n private ifuDialog: MatDialog,\n @Inject(UI_CONSTANTS_TOKEN) readonly uiConstants: any) {\n setupDataService.displayGroupMapping.then((displayGroups) => {\n this.displayGroupings = Array.from(displayGroups.entries());\n });\n }\n\n // Emits an event indicating to CardContainer to save a snapshot of the page.\n snapshot() {\n this.saveSnapshot.emit();\n }\n\n // Emits an event indicating to CardContainer to add a blank textbox at the\n // top of the page.\n textbox() {\n this.addTextbox.emit();\n }\n\n openHelpDialog() {\n const dialogRef = this.helpDialog.open(HelpDialogComponent);\n recordGoogleAnalyticsEvent(\n 'viewTutorial', 'tutorial', new Date().toDateString());\n }\n\n openIFU() {\n const dialogRef = this.ifuDialog.open(IfuDialogComponent);\n recordGoogleAnalyticsEvent(\n 'viewTutorial', 'tutorial', new Date().toDateString());\n }\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {DateTime, Duration, Interval} from 'luxon';\n/**\n * For the given date range, returns a DateTime for each day in the time\n * range (converting to local time first) as a list in chronological\n * order. All data points in dateRange will be enclosed by the days listed in\n * the returned array. If specified, additional DateTimes will be included at\n * the 12-hour mark of each day in the interval.\n * @param dateRange The date range to get tick marks for.\n * @param twelveHour Whether or not to include DateTimes at the 12-hour mark of\n * each day.\n *\n * @returns A list of the days in chronological order within the time range.\n */\nexport function getTickMarksForXAxis(\n dateRange: Interval, twelveHour: boolean): DateTime[] {\n const days: DateTime[] = [];\n // The dateRange could be stored in UTC, so convert it back to local\n // time.\n const intervalLocal = Interval.fromDateTimes(\n dateRange.start.toLocal(), dateRange.end.toLocal());\n const startDate: DateTime = intervalLocal.start.startOf('day');\n const dayCount =\n Duration.fromMillis(intervalLocal.end.toMillis() - startDate.toMillis())\n .as('days');\n\n for (let i = 0; i <= dayCount; i++) {\n days.push(startDate.plus({days: i}));\n if (twelveHour) {\n days.push(startDate.plus({days: i, hours: 12}));\n }\n }\n\n return days;\n}\n\n/**\n * Returns a DateTime for each day contained in any of the intervals in the\n * passed-in interval set. If the interval set contains day-boundaries, it will\n * add an extra day to be sure to encompass the full day, like\n * getTickMarksForXAxis. The days returned will be in an array in time order.\n *\n * @param intervals The intervals to list all the days for.\n */\nexport function getDaysForIntervalSet(intervals: Interval[]): DateTime[] {\n const days: DateTime[] = [];\n const allIntervals = Interval.merge(intervals);\n for (const interval of allIntervals) {\n getTickMarksForXAxis(interval, false).forEach(x => days.push(x.toUTC()));\n }\n return days.sort();\n}\n","/**\n * Formats a number as a string to the correct precision.\n *\n * Formats the number into a more \"human-readable\" format.\n * For example, the number 10000 would get formatted to 10,000.\n *\n * @param number the number to format\n * @param precision the precision to format the number to. Passing 0 means\n * no decimal. Passing 1 means 1 digit after the decimal point.\n */\nexport function formatNumberWithPrecision(number: number, precision?: number) {\n // The function Number.toLocalString formats into a more \"human-readable\"\n // format. In IE10 and below, toLocalString always rounds to 2 decimal places.\n // https://stackoverflow.com/questions/21536984/javascript-format-whole-numbers-using-tolocalestring\n // In order to ensure the correct precision in all browsers, We need to adjust\n // the decimal portion of the string after formatting it with the correct\n // precision.\n\n // get the number rounded to the correct precision.\n const numberAtPrecision =\n precision !== undefined ? number.toFixed(precision) : number.toString();\n\n // numberParts will always contain the integer part of the number as the first\n // element in the list.\n const numberParts = numberAtPrecision.split('.');\n const integer = numberParts[0];\n\n const formattedInteger =\n Number(integer).toLocaleString('en-us').split('.')[0];\n\n // if the precision is 0 or there was no decimal value, then just return the\n // formatted integer. Otherwise, add the decimal part back to the formatted\n // integer.\n return (precision === 0 || numberParts.length === 1) ?\n formattedInteger :\n `${formattedInteger}.${numberParts[1]}`;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/**\n * This function replaces abbrevations and symbols in a unit string to comply\n * with EHRA guidelines.\n * @param unit The unit string to fix abbreviations of.\n */\nexport function fixUnitAbbreviations(unit: string): string {\n if (unit) {\n return unit.replace('uL', 'microL')\n .replace('µ', 'micro')\n .replace('DegC', 'Deg C');\n }\n return undefined;\n}\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {InjectionToken} from '@angular/core';\nimport {DateTime, Duration, Interval} from 'luxon';\n\nimport {environment} from './environments/environment';\n\nexport function recordGoogleAnalyticsEvent(\n eventName: string, eventCategory: string, eventLabel: string) {\n if ((window).gtag) {\n (window).gtag('event', eventName, {\n 'event_category': eventCategory,\n 'event_label': eventLabel\n });\n }\n}\n\n/** The period of time this app will search for patient encounters in. */\nexport const APP_TIMESPAN = environment.production ?\n Interval.fromDateTimes(\n DateTime.utc().minus(Duration.fromObject({months: 6})),\n DateTime.utc()) :\n Interval.fromDateTimes(\n DateTime.utc().minus(Duration.fromObject({months: 60})),\n DateTime.utc());\n\n/**\n * Do not consider any encounters with a start date earlier than a year from\n * now.\n */\nexport const EARLIEST_ENCOUNTER_START_DATE = DateTime.utc().minus({years: 1});\n\n/** Constants used for FHIR resource types. */\nexport enum FhirResourceType {\n Encounter = 'Encounter',\n Observation = 'Observation',\n MedicationAdministration = 'MedicationAdministration',\n MedicationOrder = 'MedicationOrder',\n DocumentReference = 'DocumentReference',\n Patient = 'Patient',\n Specimen = 'Specimen',\n Medication = 'Medication',\n DiagnosticReport = 'DiagnosticReport'\n}\n\n/**\n * Injection token for passing UI constants across the app.\n */\nexport let UI_CONSTANTS_TOKEN = new InjectionToken('UiConstantsToken');\n\n/**\n * UI constants text.\n */\nexport const UI_CONSTANTS = {\n SYNTH_DATA: 'This is synthesized data used only for demo purposes.',\n LOINC_VERIFIED_STRING:\n 'These BCH data mappings were verified 2019-04-30. v.2.3.0.0',\n // Tooltip for adding a card inline\n ADD_TIMELINE_HERE: 'Add timeline here',\n // Dialog for adding an event to the custom timeline\n ADD_TITLE_CUSTOM_EVENT: 'Add title',\n ADD_DESCRIPTION_CUSTOM_EVENT: 'Add description',\n ADD_CARD_HERE: 'Add card here',\n DATE_CUSTOM_EVENT: 'Date',\n TIME_CUSTOM_EVENT: 'Time',\n CANCEL: 'Cancel',\n SAVE: 'Save',\n CONTINUE: 'Continue',\n // Custom timeline constants\n ADD_CUSTOM_TIMELINE: 'Add Custom Timeline',\n CUSTOM_TIMELINE_LABEL: 'Custom Timeline',\n CUSTOM_TIMELINE_INSTRUCTIONS:\n 'Click on this graph to add a flag for anything you want to keep track of.',\n // Annotation constants\n ADD_ANNOTATION: 'Add Textbox',\n ANNOTATION_INSTRUCTIONS: 'Add your text here.',\n SAVE_TEXT_HINT: 'Click the save button to save your text.',\n EDIT_TEXT_HINT: 'Click the edit button to edit this text.',\n // Constants\n NO_DATA_AVAILABLE_TMPL: 'No data between ',\n // Used in menu to add timelines\n ADD_CHART: 'Add Data Timeline',\n SEARCH_FOR_A_CONCEPT: 'Search for a concept',\n // Confirmation dialog for removing a card\n REMOVE_CARD: 'Do you want to remove this card?',\n REMOVE_CARD_NO: 'No',\n REMOVE_CARD_YES: 'Yes, remove this card',\n // Error handling\n BAD_DATA_ERROR: 'Invalid data received. Please check the PowerChart.',\n BAD_ENCOUNTER_ERROR:\n 'Unable to retrieve hospital visit dates for this patient.' +\n ' You can select any time period in the past six months.',\n // Setup screen\n INITIAL_CONFIGURATION_HEADER: 'MedTimeLine',\n LAST_ONE_DAY: 'Since midnight yesterday',\n LAST_THREE_DAYS: 'Last three days',\n LAST_SEVEN_DAYS: 'Last seven days',\n LAST_MONTH: 'Last month',\n LAST_THREE_MONTHS: 'Last three months',\n NO_RESULTS: 'No results found',\n SELECT_ALL: 'Select all',\n CLEAR_SELECTION: 'Clear selection',\n NO_DATA_PAST_SIX_MOS: '(No data found for past six months)',\n CHECKING_DATA_AVAILABILITY: '(Checking data availability...)',\n WHICH_ENCOUNTER_FIRST: 'Which time period would you like to see first?',\n WHICH_CONCEPTS_FIRST: 'Which data timelines would you like to see first?',\n ENCOUNTER: '(patient encounter)',\n // Top banner constants\n CHANGE_DATE_RANGE: 'Change date range',\n MOCK_DATA_BANNER: 'This is synthesized data used for demo purposes only.',\n LAUNCH_TUTORIAL: 'Launch Tutorial',\n IFU: 'Open Instructions for Use',\n SAVE_TO_NOTE: 'Save a screenshot to a PowerChart clinical note',\n // Interacting with cards\n REMOVE_THIS_CARD: 'Remove this card',\n CARD_REMOVED: 'Card removed.',\n UNDO: 'Undo',\n DRAG_THIS_CARD: 'Drag and drop to move this card somewhere else',\n EDIT_THIS_CARD: 'Edit this card',\n SAVE_YOUR_WORK: 'Save your work on this card',\n // Saving to PowerChart\n SAVED_TO_POWERCHART: 'Screenshot saved to PowerChart.',\n ERROR_SAVED_TO_POWERCHART: 'Error saving to PowerChart.',\n DISMISS: 'Dismiss',\n // Tooltip headings\n SUMMARY: 'Summary',\n RESULT: 'Result set',\n CATEGORY: 'Category',\n STATUS: 'Status',\n SPECIMEN: 'Specimen',\n REPORT_ATTACHMENT: 'Report Attachment',\n TIME_SINCE_PREVIOUS_DOSE: 'Time since previous dose in this timeframe',\n TIME_BEFORE_NEXT_DOSE: 'Time before next dose in this timeframe',\n FIRST_DOSE: 'First dose within this timeframe',\n LAST_DOSE: 'Last dose within this timeframe',\n THIS_DOSE: 'This dose',\n PREVIOUS_DOSE: 'Previous dose within this timeframe (for this order)',\n NO_PREVIOUS_DOSE: 'No previous dose within this timeframe (for this order).',\n DOSAGE_INSTRUCTIONS: 'Dosage Instructions'\n};\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nimport {environment_file_locations} from './environment_file_locations';\n\nexport const environment = {\n production: false,\n useMockServer: true,\n mockDataFolder: 'demo_data/test_bmedtimeB',\n mockDataFiles: [\n 'BMedTimeB_DiagReport',\n 'BMedTimeB_Encounter',\n 'BMedTimeB_Obs_labs',\n 'BMedTimeB_Obs_vitals',\n 'BMedtimeB_MB_data',\n 'BMedTimeB_Med_Admins',\n 'BMedTimeB_Med_Orders',\n ],\n ...environment_file_locations,\n useDebugger: false,\n};\n\n/*\n * In development mode, to ignore zone related error stack frames such as\n * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can\n * import the following file, but please comment it out in production mode\n * because it will have performance impact when throw error\n */\nimport 'zone.js/dist/zone-error'; // Included with Angular CLI.\n","// Copyright 2019 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This file can be replaced during build by using the `fileReplacements`\n// array.// `ng build ---prod` replaces `environment.ts` with\n// `environment.prod.ts`. The list of file replacements can be found in\n// `angular.json`.\n\n// This file is used in the e2e tests.\n\nexport const environment_file_locations = {\n conceptsFolder: 'clinical_concept_configuration',\n vitalGroupFile: 'vital_sign_groups.json',\n vitalConceptsFile: 'vital_signs.json',\n labConceptsFile: 'lab_results.json',\n labGroupFile: 'lab_groups.json',\n radiologyConceptsFile: 'radiology_results.json',\n radiologyGroupFile: 'radiology_groups.json',\n antibioticConceptsFile: 'medications_antibiotics.json',\n antibioticGroupFile: 'medication_groups_antibiotics.json',\n antiviralConceptsFile: 'medications_antivirals.json',\n antiviralGroupFile: 'medication_groups_antivirals.json',\n antifungalConceptsFile: 'medications_antifungals.json',\n antifungalGroupFile: 'medication_groups_antifungals.json',\n microbioGroupFile: 'microbio_groups.json',\n microbioConceptsFile: 'microbio_results.json'\n};\n\n/*\n * In development mode, to ignore zone related error stack frames such as\n * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can\n * import the following file, but please comment it out in production mode\n * because it will have performance impact when throw error\n */\nimport 'zone.js/dist/zone-error'; // Included with Angular CLI.\n","// Copyright 2018 Verily Life Sciences Inc.\n//\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\nimport {enableProdMode} from '@angular/core';\nimport {platformBrowserDynamic} from '@angular/platform-browser-dynamic';\n\nimport {AppModule} from './app/app.module';\nimport * as FhirConfig from './app/fhir_config';\nimport {environment} from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\n\nif (FhirConfig.googleAnalyticsTag) {\n // Global site tag (gtag.js) - Google Analytics\n document.write(\n ' ');\n document.write(\n '');\n} else {\n // If there is no Google Analytics Tag found, insert an empty script to\n // prevent errors with user interaction.\n document.write('');\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule).catch(\n err => console.log(err));\n"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/polyfills.js b/docs/polyfills.js index 19fe3702..6cc22f0c 100644 --- a/docs/polyfills.js +++ b/docs/polyfills.js @@ -10632,11 +10632,11 @@ window.global = window; /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(/*! /usr/local/google/home/laurendukes/charmander-bch/medtimeline/src/polyfills.ts */"./src/polyfills.ts"); -module.exports = __webpack_require__(/*! /usr/local/google/home/laurendukes/charmander-bch/medtimeline/node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js"); +__webpack_require__(/*! /usr/local/google/home/hmulholland/Code/bch/medtimeline/src/polyfills.ts */"./src/polyfills.ts"); +module.exports = __webpack_require__(/*! /usr/local/google/home/hmulholland/Code/bch/medtimeline/node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js */"./node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/jit-polyfills.js"); /***/ }) },[[1,"runtime"]]]); -//# sourceMappingURL=polyfills.js.map +//# sourceMappingURL=polyfills.js.map \ No newline at end of file diff --git a/docs/styles.js b/docs/styles.js index ecd67a8e..c3c28f3a 100644 --- a/docs/styles.js +++ b/docs/styles.js @@ -18,7 +18,7 @@ module.exports = [[module.i, ".gu-mirror {\n position: fixed !important;\n mar /*! no static exports found */ /***/ (function(module, exports) { -module.exports = [[module.i, "\n@import url(\"https://fonts.googleapis.com/css?family=Roboto+Mono\");\n@import url(\"https://fonts.googleapis.com/css?family=Montserrat\");\n@import url(\"https://fonts.googleapis.com/css?family=Work+Sans\");\n/* Default Angular Material prebuilt theme. */\n/* Theme for the ripple elements.*/\n/* stylelint-disable material/no-prefixes */\n/* stylelint-enable */\n.mat-badge-content {\n font-weight: 600;\n font-size: 12px;\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-badge-small .mat-badge-content {\n font-size: 6px; }\n.mat-badge-large .mat-badge-content {\n font-size: 24px; }\n.mat-h1, .mat-headline, .mat-typography h1 {\n font: 400 24px/32px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h2, .mat-title, .mat-typography h2 {\n font: 500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h3, .mat-subheading-2, .mat-typography h3 {\n font: 400 16px/28px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h4, .mat-subheading-1, .mat-typography h4 {\n font: 400 15px/24px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h5, .mat-typography h5 {\n font: 400 11.62px/20px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 12px; }\n.mat-h6, .mat-typography h6 {\n font: 400 9.38px/20px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 12px; }\n.mat-body-strong, .mat-body-2 {\n font: 500 14px/24px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-body, .mat-body-1, .mat-typography {\n font: 400 14px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-body p, .mat-body-1 p, .mat-typography p {\n margin: 0 0 12px; }\n.mat-small, .mat-caption {\n font: 400 12px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-display-4, .mat-typography .mat-display-4 {\n font: 300 112px/112px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 56px;\n letter-spacing: -0.05em; }\n.mat-display-3, .mat-typography .mat-display-3 {\n font: 400 56px/56px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 64px;\n letter-spacing: -0.02em; }\n.mat-display-2, .mat-typography .mat-display-2 {\n font: 400 45px/48px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 64px;\n letter-spacing: -0.005em; }\n.mat-display-1, .mat-typography .mat-display-1 {\n font: 400 34px/40px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 64px; }\n.mat-bottom-sheet-container {\n font: 400 14px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-button, .mat-raised-button, .mat-icon-button, .mat-stroked-button,\n.mat-flat-button, .mat-fab, .mat-mini-fab {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 500; }\n.mat-button-toggle {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-card {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-card-title {\n font-size: 24px;\n font-weight: 500; }\n.mat-card-header .mat-card-title {\n font-size: 20px; }\n.mat-card-subtitle,\n.mat-card-content {\n font-size: 14px; }\n.mat-checkbox {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-checkbox-layout .mat-checkbox-label {\n line-height: 24px; }\n.mat-chip {\n font-size: 14px;\n font-weight: 500; }\n.mat-chip .mat-chip-trailing-icon.mat-icon,\n .mat-chip .mat-chip-remove.mat-icon {\n font-size: 18px; }\n.mat-table {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-header-cell {\n font-size: 12px;\n font-weight: 500; }\n.mat-cell, .mat-footer-cell {\n font-size: 14px; }\n.mat-calendar {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-calendar-body {\n font-size: 13px; }\n.mat-calendar-body-label,\n.mat-calendar-period-button {\n font-size: 14px;\n font-weight: 500; }\n.mat-calendar-table-header th {\n font-size: 11px;\n font-weight: 400; }\n.mat-dialog-title {\n font: 500 20px/32px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-expansion-panel-header {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 15px;\n font-weight: 400; }\n.mat-expansion-panel-content {\n font: 400 14px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-form-field {\n font-size: inherit;\n font-weight: 400;\n line-height: 1.125;\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-form-field-wrapper {\n padding-bottom: 1.34375em; }\n.mat-form-field-prefix .mat-icon,\n.mat-form-field-suffix .mat-icon {\n font-size: 150%;\n line-height: 1.125; }\n.mat-form-field-prefix .mat-icon-button,\n.mat-form-field-suffix .mat-icon-button {\n height: 1.5em;\n width: 1.5em; }\n.mat-form-field-prefix .mat-icon-button .mat-icon,\n .mat-form-field-suffix .mat-icon-button .mat-icon {\n height: 1.125em;\n line-height: 1.125; }\n.mat-form-field-infix {\n padding: 0.5em 0;\n border-top: 0.84375em solid transparent; }\n.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.34375em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.34374em) scale(0.75);\n width: 133.33334333%; }\n.mat-form-field-label-wrapper {\n top: -0.84375em;\n padding-top: 0.84375em; }\n.mat-form-field-label {\n top: 1.34375em; }\n.mat-form-field-underline {\n bottom: 1.34375em; }\n.mat-form-field-subscript-wrapper {\n font-size: 75%;\n margin-top: 0.66666667em;\n top: calc(100% - 1.79166667em); }\n.mat-form-field-appearance-legacy .mat-form-field-wrapper {\n padding-bottom: 1.25em; }\n.mat-form-field-appearance-legacy .mat-form-field-infix {\n padding: 0.4375em 0; }\n.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.001px);\n -ms-transform: translateY(-1.28125em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00101px);\n -ms-transform: translateY(-1.28124em) scale(0.75);\n width: 133.33334333%; }\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00102px);\n -ms-transform: translateY(-1.28123em) scale(0.75);\n width: 133.33335333%; }\n.mat-form-field-appearance-legacy .mat-form-field-label {\n top: 1.28125em; }\n.mat-form-field-appearance-legacy .mat-form-field-underline {\n bottom: 1.25em; }\n.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper {\n margin-top: 0.54166667em;\n top: calc(100% - 1.66666667em); }\n@media print {\n .mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.28122em) scale(0.75); }\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.28121em) scale(0.75); }\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.2812em) scale(0.75); } }\n.mat-form-field-appearance-fill .mat-form-field-infix {\n padding: 0.25em 0 0.75em 0; }\n.mat-form-field-appearance-fill .mat-form-field-label {\n top: 1.09375em;\n margin-top: -0.5em; }\n.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-0.59375em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-0.59374em) scale(0.75);\n width: 133.33334333%; }\n.mat-form-field-appearance-outline .mat-form-field-infix {\n padding: 1em 0 1em 0; }\n.mat-form-field-appearance-outline .mat-form-field-label {\n top: 1.84375em;\n margin-top: -0.25em; }\n.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.59375em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.59374em) scale(0.75);\n width: 133.33334333%; }\n.mat-grid-tile-header,\n.mat-grid-tile-footer {\n font-size: 14px; }\n.mat-grid-tile-header .mat-line,\n .mat-grid-tile-footer .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-grid-tile-header .mat-line:nth-child(n+2),\n .mat-grid-tile-footer .mat-line:nth-child(n+2) {\n font-size: 12px; }\ninput.mat-input-element {\n margin-top: -0.0625em; }\n.mat-menu-item {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 400; }\n.mat-paginator,\n.mat-paginator-page-size .mat-select-trigger {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 12px; }\n.mat-radio-button {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-select {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-select-trigger {\n height: 1.125em; }\n.mat-slide-toggle-content {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-slider-thumb-label-text {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 12px;\n font-weight: 500; }\n.mat-stepper-vertical, .mat-stepper-horizontal {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-step-label {\n font-size: 14px;\n font-weight: 400; }\n.mat-step-sub-label-error {\n font-weight: normal; }\n.mat-step-label-error {\n font-size: 14px; }\n.mat-step-label-selected {\n font-size: 14px;\n font-weight: 500; }\n.mat-tab-group {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-tab-label, .mat-tab-link {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 500; }\n.mat-toolbar,\n.mat-toolbar h1,\n.mat-toolbar h2,\n.mat-toolbar h3,\n.mat-toolbar h4,\n.mat-toolbar h5,\n.mat-toolbar h6 {\n font: 500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0; }\n.mat-tooltip {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 10px;\n padding-top: 6px;\n padding-bottom: 6px; }\n.mat-tooltip-handset {\n font-size: 14px;\n padding-top: 8px;\n padding-bottom: 8px; }\n.mat-list-item {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-list-option {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-list-base .mat-list-item {\n font-size: 16px; }\n.mat-list-base .mat-list-item .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base .mat-list-item .mat-line:nth-child(n+2) {\n font-size: 14px; }\n.mat-list-base .mat-list-option {\n font-size: 16px; }\n.mat-list-base .mat-list-option .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base .mat-list-option .mat-line:nth-child(n+2) {\n font-size: 14px; }\n.mat-list-base .mat-subheader {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 500; }\n.mat-list-base[dense] .mat-list-item {\n font-size: 12px; }\n.mat-list-base[dense] .mat-list-item .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2) {\n font-size: 12px; }\n.mat-list-base[dense] .mat-list-option {\n font-size: 12px; }\n.mat-list-base[dense] .mat-list-option .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2) {\n font-size: 12px; }\n.mat-list-base[dense] .mat-subheader {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 12px;\n font-weight: 500; }\n.mat-option {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 16px; }\n.mat-optgroup-label {\n font: 500 14px/24px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-simple-snackbar {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px; }\n.mat-simple-snackbar-action {\n line-height: 1;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500; }\n.mat-tree {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-tree-node,\n.mat-nested-tree-node {\n font-weight: 400;\n font-size: 14px; }\n.mat-ripple {\n overflow: hidden;\n position: relative; }\n.mat-ripple.mat-ripple-unbounded {\n overflow: visible; }\n.mat-ripple-element {\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n transition: opacity, transform 0ms cubic-bezier(0, 0, 0.2, 1);\n transform: scale(0); }\n@media (-ms-high-contrast: active) {\n .mat-ripple-element {\n display: none; } }\n.cdk-visually-hidden {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n outline: 0;\n -webkit-appearance: none;\n -moz-appearance: none; }\n.cdk-overlay-container, .cdk-global-overlay-wrapper {\n pointer-events: none;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%; }\n.cdk-overlay-container {\n position: fixed;\n z-index: 1000; }\n.cdk-overlay-container:empty {\n display: none; }\n.cdk-global-overlay-wrapper {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n z-index: 1000; }\n.cdk-overlay-pane {\n position: absolute;\n pointer-events: auto;\n box-sizing: border-box;\n z-index: 1000;\n display: -ms-flexbox;\n display: flex;\n max-width: 100%;\n max-height: 100%; }\n.cdk-overlay-backdrop {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1000;\n pointer-events: auto;\n -webkit-tap-highlight-color: transparent;\n transition: opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);\n opacity: 0; }\n.cdk-overlay-backdrop.cdk-overlay-backdrop-showing {\n opacity: 1; }\n@media screen and (-ms-high-contrast: active) {\n .cdk-overlay-backdrop.cdk-overlay-backdrop-showing {\n opacity: 0.6; } }\n.cdk-overlay-dark-backdrop {\n background: rgba(0, 0, 0, 0.32); }\n.cdk-overlay-transparent-backdrop, .cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing {\n opacity: 0; }\n.cdk-overlay-connected-position-bounding-box {\n position: absolute;\n z-index: 1000;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 1px;\n min-height: 1px; }\n.cdk-global-scrollblock {\n position: fixed;\n width: 100%;\n overflow-y: scroll; }\n@-webkit-keyframes cdk-text-field-autofill-start {\n /*!*/ }\n@keyframes cdk-text-field-autofill-start {\n /*!*/ }\n@-webkit-keyframes cdk-text-field-autofill-end {\n /*!*/ }\n@keyframes cdk-text-field-autofill-end {\n /*!*/ }\n.cdk-text-field-autofill-monitored:-webkit-autofill {\n -webkit-animation-name: cdk-text-field-autofill-start;\n animation-name: cdk-text-field-autofill-start; }\n.cdk-text-field-autofill-monitored:not(:-webkit-autofill) {\n -webkit-animation-name: cdk-text-field-autofill-end;\n animation-name: cdk-text-field-autofill-end; }\ntextarea.cdk-textarea-autosize {\n resize: none; }\ntextarea.cdk-textarea-autosize-measuring {\n height: auto !important;\n overflow: hidden !important;\n padding: 2px 0 !important;\n box-sizing: content-box !important; }\n.mat-ripple-element {\n background-color: rgba(0, 0, 0, 0.1); }\n.mat-option {\n color: rgba(0, 0, 0, 0.87); }\n.mat-option:hover:not(.mat-option-disabled), .mat-option:focus:not(.mat-option-disabled) {\n background: rgba(0, 0, 0, 0.04); }\n.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled) {\n background: rgba(0, 0, 0, 0.04); }\n.mat-option.mat-active {\n background: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.87); }\n.mat-option.mat-option-disabled {\n color: rgba(0, 0, 0, 0.38); }\n.mat-primary .mat-option.mat-selected:not(.mat-option-disabled) {\n color: #5e35b1; }\n.mat-accent .mat-option.mat-selected:not(.mat-option-disabled) {\n color: #c41061; }\n.mat-warn .mat-option.mat-selected:not(.mat-option-disabled) {\n color: #f44336; }\n.mat-optgroup-label {\n color: rgba(0, 0, 0, 0.54); }\n.mat-optgroup-disabled .mat-optgroup-label {\n color: rgba(0, 0, 0, 0.38); }\n.mat-pseudo-checkbox {\n color: rgba(0, 0, 0, 0.54); }\n.mat-pseudo-checkbox::after {\n color: #fafafa; }\n.mat-pseudo-checkbox-disabled {\n color: #b0b0b0; }\n.mat-pseudo-checkbox-checked,\n.mat-pseudo-checkbox-indeterminate,\n.mat-accent .mat-pseudo-checkbox-checked,\n.mat-accent .mat-pseudo-checkbox-indeterminate {\n background: #c41061; }\n.mat-primary .mat-pseudo-checkbox-checked,\n.mat-primary .mat-pseudo-checkbox-indeterminate {\n background: #5e35b1; }\n.mat-warn .mat-pseudo-checkbox-checked,\n.mat-warn .mat-pseudo-checkbox-indeterminate {\n background: #f44336; }\n.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,\n.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled {\n background: #b0b0b0; }\n.mat-elevation-z0 {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z1 {\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z2 {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z3 {\n box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z4 {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z5 {\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z6 {\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z7 {\n box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z8 {\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z9 {\n box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z10 {\n box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z11 {\n box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z12 {\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z13 {\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z14 {\n box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z15 {\n box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z16 {\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z17 {\n box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z18 {\n box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z19 {\n box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z20 {\n box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z21 {\n box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z22 {\n box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z23 {\n box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z24 {\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); }\n.mat-app-background {\n background-color: #fafafa;\n color: rgba(0, 0, 0, 0.87); }\n.mat-theme-loaded-marker {\n display: none; }\n.mat-autocomplete-panel {\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-autocomplete-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover) {\n background: white; }\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled) {\n color: rgba(0, 0, 0, 0.87); }\n.mat-badge-content {\n color: white;\n background: #5e35b1; }\n@media (-ms-high-contrast: active) {\n .mat-badge-content {\n outline: solid 1px;\n border-radius: 0; } }\n.mat-badge-accent .mat-badge-content {\n background: #c41061;\n color: white; }\n.mat-badge-warn .mat-badge-content {\n color: white;\n background: #f44336; }\n.mat-badge {\n position: relative; }\n.mat-badge-hidden .mat-badge-content {\n display: none; }\n.mat-badge-disabled .mat-badge-content {\n background: #b9b9b9;\n color: rgba(0, 0, 0, 0.38); }\n.mat-badge-content {\n position: absolute;\n text-align: center;\n display: inline-block;\n border-radius: 50%;\n transition: transform 200ms ease-in-out;\n transform: scale(0.6);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n pointer-events: none; }\n.mat-badge-content.mat-badge-active {\n transform: none; }\n.mat-badge-small .mat-badge-content {\n width: 16px;\n height: 16px;\n line-height: 16px; }\n.mat-badge-small.mat-badge-above .mat-badge-content {\n top: -8px; }\n.mat-badge-small.mat-badge-below .mat-badge-content {\n bottom: -8px; }\n.mat-badge-small.mat-badge-before .mat-badge-content {\n left: -16px; }\n[dir='rtl'] .mat-badge-small.mat-badge-before .mat-badge-content {\n left: auto;\n right: -16px; }\n.mat-badge-small.mat-badge-after .mat-badge-content {\n right: -16px; }\n[dir='rtl'] .mat-badge-small.mat-badge-after .mat-badge-content {\n right: auto;\n left: -16px; }\n.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: -8px; }\n[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: auto;\n right: -8px; }\n.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: -8px; }\n[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: auto;\n left: -8px; }\n.mat-badge-medium .mat-badge-content {\n width: 22px;\n height: 22px;\n line-height: 22px; }\n.mat-badge-medium.mat-badge-above .mat-badge-content {\n top: -11px; }\n.mat-badge-medium.mat-badge-below .mat-badge-content {\n bottom: -11px; }\n.mat-badge-medium.mat-badge-before .mat-badge-content {\n left: -22px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-before .mat-badge-content {\n left: auto;\n right: -22px; }\n.mat-badge-medium.mat-badge-after .mat-badge-content {\n right: -22px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-after .mat-badge-content {\n right: auto;\n left: -22px; }\n.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: -11px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: auto;\n right: -11px; }\n.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: -11px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: auto;\n left: -11px; }\n.mat-badge-large .mat-badge-content {\n width: 28px;\n height: 28px;\n line-height: 28px; }\n.mat-badge-large.mat-badge-above .mat-badge-content {\n top: -14px; }\n.mat-badge-large.mat-badge-below .mat-badge-content {\n bottom: -14px; }\n.mat-badge-large.mat-badge-before .mat-badge-content {\n left: -28px; }\n[dir='rtl'] .mat-badge-large.mat-badge-before .mat-badge-content {\n left: auto;\n right: -28px; }\n.mat-badge-large.mat-badge-after .mat-badge-content {\n right: -28px; }\n[dir='rtl'] .mat-badge-large.mat-badge-after .mat-badge-content {\n right: auto;\n left: -28px; }\n.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: -14px; }\n[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: auto;\n right: -14px; }\n.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: -14px; }\n[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: auto;\n left: -14px; }\n.mat-bottom-sheet-container {\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-button, .mat-icon-button, .mat-stroked-button {\n color: inherit;\n background: transparent; }\n.mat-button.mat-primary, .mat-icon-button.mat-primary, .mat-stroked-button.mat-primary {\n color: #5e35b1; }\n.mat-button.mat-accent, .mat-icon-button.mat-accent, .mat-stroked-button.mat-accent {\n color: #c41061; }\n.mat-button.mat-warn, .mat-icon-button.mat-warn, .mat-stroked-button.mat-warn {\n color: #f44336; }\n.mat-button.mat-primary[disabled], .mat-button.mat-accent[disabled], .mat-button.mat-warn[disabled], .mat-button[disabled][disabled], .mat-icon-button.mat-primary[disabled], .mat-icon-button.mat-accent[disabled], .mat-icon-button.mat-warn[disabled], .mat-icon-button[disabled][disabled], .mat-stroked-button.mat-primary[disabled], .mat-stroked-button.mat-accent[disabled], .mat-stroked-button.mat-warn[disabled], .mat-stroked-button[disabled][disabled] {\n color: rgba(0, 0, 0, 0.26); }\n.mat-button.mat-primary .mat-button-focus-overlay, .mat-icon-button.mat-primary .mat-button-focus-overlay, .mat-stroked-button.mat-primary .mat-button-focus-overlay {\n background-color: #5e35b1; }\n.mat-button.mat-accent .mat-button-focus-overlay, .mat-icon-button.mat-accent .mat-button-focus-overlay, .mat-stroked-button.mat-accent .mat-button-focus-overlay {\n background-color: #c41061; }\n.mat-button.mat-warn .mat-button-focus-overlay, .mat-icon-button.mat-warn .mat-button-focus-overlay, .mat-stroked-button.mat-warn .mat-button-focus-overlay {\n background-color: #f44336; }\n.mat-button[disabled] .mat-button-focus-overlay, .mat-icon-button[disabled] .mat-button-focus-overlay, .mat-stroked-button[disabled] .mat-button-focus-overlay {\n background-color: transparent; }\n.mat-button .mat-ripple-element, .mat-icon-button .mat-ripple-element, .mat-stroked-button .mat-ripple-element {\n opacity: 0.1;\n background-color: currentColor; }\n.mat-button-focus-overlay {\n background: black; }\n.mat-stroked-button:not([disabled]) {\n border-color: rgba(0, 0, 0, 0.12); }\n.mat-flat-button, .mat-raised-button, .mat-fab, .mat-mini-fab {\n color: rgba(0, 0, 0, 0.87);\n background-color: white; }\n.mat-flat-button.mat-primary, .mat-raised-button.mat-primary, .mat-fab.mat-primary, .mat-mini-fab.mat-primary {\n color: white; }\n.mat-flat-button.mat-accent, .mat-raised-button.mat-accent, .mat-fab.mat-accent, .mat-mini-fab.mat-accent {\n color: white; }\n.mat-flat-button.mat-warn, .mat-raised-button.mat-warn, .mat-fab.mat-warn, .mat-mini-fab.mat-warn {\n color: white; }\n.mat-flat-button.mat-primary[disabled], .mat-flat-button.mat-accent[disabled], .mat-flat-button.mat-warn[disabled], .mat-flat-button[disabled][disabled], .mat-raised-button.mat-primary[disabled], .mat-raised-button.mat-accent[disabled], .mat-raised-button.mat-warn[disabled], .mat-raised-button[disabled][disabled], .mat-fab.mat-primary[disabled], .mat-fab.mat-accent[disabled], .mat-fab.mat-warn[disabled], .mat-fab[disabled][disabled], .mat-mini-fab.mat-primary[disabled], .mat-mini-fab.mat-accent[disabled], .mat-mini-fab.mat-warn[disabled], .mat-mini-fab[disabled][disabled] {\n color: rgba(0, 0, 0, 0.26); }\n.mat-flat-button.mat-primary, .mat-raised-button.mat-primary, .mat-fab.mat-primary, .mat-mini-fab.mat-primary {\n background-color: #5e35b1; }\n.mat-flat-button.mat-accent, .mat-raised-button.mat-accent, .mat-fab.mat-accent, .mat-mini-fab.mat-accent {\n background-color: #c41061; }\n.mat-flat-button.mat-warn, .mat-raised-button.mat-warn, .mat-fab.mat-warn, .mat-mini-fab.mat-warn {\n background-color: #f44336; }\n.mat-flat-button.mat-primary[disabled], .mat-flat-button.mat-accent[disabled], .mat-flat-button.mat-warn[disabled], .mat-flat-button[disabled][disabled], .mat-raised-button.mat-primary[disabled], .mat-raised-button.mat-accent[disabled], .mat-raised-button.mat-warn[disabled], .mat-raised-button[disabled][disabled], .mat-fab.mat-primary[disabled], .mat-fab.mat-accent[disabled], .mat-fab.mat-warn[disabled], .mat-fab[disabled][disabled], .mat-mini-fab.mat-primary[disabled], .mat-mini-fab.mat-accent[disabled], .mat-mini-fab.mat-warn[disabled], .mat-mini-fab[disabled][disabled] {\n background-color: rgba(0, 0, 0, 0.12); }\n.mat-flat-button.mat-primary .mat-ripple-element, .mat-raised-button.mat-primary .mat-ripple-element, .mat-fab.mat-primary .mat-ripple-element, .mat-mini-fab.mat-primary .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.1); }\n.mat-flat-button.mat-accent .mat-ripple-element, .mat-raised-button.mat-accent .mat-ripple-element, .mat-fab.mat-accent .mat-ripple-element, .mat-mini-fab.mat-accent .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.1); }\n.mat-flat-button.mat-warn .mat-ripple-element, .mat-raised-button.mat-warn .mat-ripple-element, .mat-fab.mat-warn .mat-ripple-element, .mat-mini-fab.mat-warn .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.1); }\n.mat-stroked-button:not([class*='mat-elevation-z']), .mat-flat-button:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-raised-button:not([class*='mat-elevation-z']) {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-raised-button:not([disabled]):active:not([class*='mat-elevation-z']) {\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }\n.mat-raised-button[disabled]:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-fab:not([class*='mat-elevation-z']), .mat-mini-fab:not([class*='mat-elevation-z']) {\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\n.mat-fab:not([disabled]):active:not([class*='mat-elevation-z']), .mat-mini-fab:not([disabled]):active:not([class*='mat-elevation-z']) {\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }\n.mat-fab[disabled]:not([class*='mat-elevation-z']), .mat-mini-fab[disabled]:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-standalone,\n.mat-button-toggle-group {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,\n.mat-button-toggle-group-appearance-standard {\n box-shadow: none; }\n.mat-button-toggle {\n color: rgba(0, 0, 0, 0.38); }\n.mat-button-toggle .mat-button-toggle-focus-overlay {\n background-color: rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-appearance-standard {\n color: rgba(0, 0, 0, 0.87);\n background: white; }\n.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay {\n background-color: black; }\n.mat-button-toggle-group-appearance-standard .mat-button-toggle + .mat-button-toggle {\n border-left: solid 1px rgba(0, 0, 0, 0.12); }\n[dir='rtl'] .mat-button-toggle-group-appearance-standard .mat-button-toggle + .mat-button-toggle {\n border-left: none;\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle + .mat-button-toggle {\n border-left: none;\n border-right: none;\n border-top: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-checked {\n background-color: #e0e0e0;\n color: rgba(0, 0, 0, 0.54); }\n.mat-button-toggle-checked.mat-button-toggle-appearance-standard {\n color: rgba(0, 0, 0, 0.87); }\n.mat-button-toggle-disabled {\n color: rgba(0, 0, 0, 0.26);\n background-color: #eeeeee; }\n.mat-button-toggle-disabled.mat-button-toggle-appearance-standard {\n background: white; }\n.mat-button-toggle-disabled.mat-button-toggle-checked {\n background-color: #bdbdbd; }\n.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,\n.mat-button-toggle-group-appearance-standard {\n border: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-card {\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-card:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }\n.mat-card.mat-card-flat:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-card-subtitle {\n color: rgba(0, 0, 0, 0.54); }\n.mat-checkbox-frame {\n border-color: rgba(0, 0, 0, 0.54); }\n.mat-checkbox-checkmark {\n fill: #fafafa; }\n.mat-checkbox-checkmark-path {\n stroke: #fafafa !important; }\n@media (-ms-high-contrast: black-on-white) {\n .mat-checkbox-checkmark-path {\n stroke: #000 !important; } }\n.mat-checkbox-mixedmark {\n background-color: #fafafa; }\n.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background, .mat-checkbox-checked.mat-primary .mat-checkbox-background {\n background-color: #5e35b1; }\n.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background, .mat-checkbox-checked.mat-accent .mat-checkbox-background {\n background-color: #c41061; }\n.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background, .mat-checkbox-checked.mat-warn .mat-checkbox-background {\n background-color: #f44336; }\n.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background, .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background {\n background-color: #b0b0b0; }\n.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame {\n border-color: #b0b0b0; }\n.mat-checkbox-disabled .mat-checkbox-label {\n color: rgba(0, 0, 0, 0.54); }\n@media (-ms-high-contrast: active) {\n .mat-checkbox-disabled {\n opacity: 0.5; } }\n@media (-ms-high-contrast: active) {\n .mat-checkbox-background {\n background: none; } }\n.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element {\n background-color: #5e35b1; }\n.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element {\n background-color: #c41061; }\n.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element {\n background-color: #f44336; }\n.mat-chip.mat-standard-chip {\n background-color: #e0e0e0;\n color: rgba(0, 0, 0, 0.87); }\n.mat-chip.mat-standard-chip .mat-chip-remove {\n color: rgba(0, 0, 0, 0.87);\n opacity: 0.4; }\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active {\n box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover {\n opacity: 0.54; }\n.mat-chip.mat-standard-chip.mat-chip-disabled {\n opacity: 0.4; }\n.mat-chip.mat-standard-chip::after {\n background: black; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary {\n background-color: #5e35b1;\n color: white; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove {\n color: white;\n opacity: 0.4; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element {\n background: rgba(255, 255, 255, 0.1); }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn {\n background-color: #f44336;\n color: white; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove {\n color: white;\n opacity: 0.4; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element {\n background: rgba(255, 255, 255, 0.1); }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent {\n background-color: #c41061;\n color: white; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove {\n color: white;\n opacity: 0.4; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element {\n background: rgba(255, 255, 255, 0.1); }\n.mat-table {\n background: white; }\n.mat-table thead, .mat-table tbody, .mat-table tfoot,\nmat-header-row, mat-row, mat-footer-row,\n[mat-header-row], [mat-row], [mat-footer-row],\n.mat-table-sticky {\n background: inherit; }\nmat-row, mat-header-row, mat-footer-row,\nth.mat-header-cell, td.mat-cell, td.mat-footer-cell {\n border-bottom-color: rgba(0, 0, 0, 0.12); }\n.mat-header-cell {\n color: rgba(0, 0, 0, 0.54); }\n.mat-cell, .mat-footer-cell {\n color: rgba(0, 0, 0, 0.87); }\n.mat-calendar-arrow {\n border-top-color: rgba(0, 0, 0, 0.54); }\n.mat-datepicker-toggle,\n.mat-datepicker-content .mat-calendar-next-button,\n.mat-datepicker-content .mat-calendar-previous-button {\n color: rgba(0, 0, 0, 0.54); }\n.mat-calendar-table-header {\n color: rgba(0, 0, 0, 0.38); }\n.mat-calendar-table-header-divider::after {\n background: rgba(0, 0, 0, 0.12); }\n.mat-calendar-body-label {\n color: rgba(0, 0, 0, 0.54); }\n.mat-calendar-body-cell-content {\n color: rgba(0, 0, 0, 0.87);\n border-color: transparent; }\n.mat-calendar-body-disabled > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected) {\n color: rgba(0, 0, 0, 0.38); }\n.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected),\n.cdk-keyboard-focused .mat-calendar-body-active > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected),\n.cdk-program-focused .mat-calendar-body-active > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected) {\n background-color: rgba(0, 0, 0, 0.04); }\n.mat-calendar-body-today:not(.mat-calendar-body-selected) {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-calendar-body-disabled > .mat-calendar-body-today:not(.mat-calendar-body-selected) {\n border-color: rgba(0, 0, 0, 0.18); }\n.mat-calendar-body-selected {\n background-color: #5e35b1;\n color: white; }\n.mat-calendar-body-disabled > .mat-calendar-body-selected {\n background-color: rgba(94, 53, 177, 0.4); }\n.mat-calendar-body-today.mat-calendar-body-selected {\n box-shadow: inset 0 0 0 1px white; }\n.mat-datepicker-content {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);\n background-color: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-datepicker-content.mat-accent .mat-calendar-body-selected {\n background-color: #c41061;\n color: white; }\n.mat-datepicker-content.mat-accent .mat-calendar-body-disabled > .mat-calendar-body-selected {\n background-color: rgba(196, 16, 97, 0.4); }\n.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected {\n box-shadow: inset 0 0 0 1px white; }\n.mat-datepicker-content.mat-warn .mat-calendar-body-selected {\n background-color: #f44336;\n color: white; }\n.mat-datepicker-content.mat-warn .mat-calendar-body-disabled > .mat-calendar-body-selected {\n background-color: rgba(244, 67, 54, 0.4); }\n.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected {\n box-shadow: inset 0 0 0 1px white; }\n.mat-datepicker-content-touch {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-datepicker-toggle-active {\n color: #5e35b1; }\n.mat-datepicker-toggle-active.mat-accent {\n color: #c41061; }\n.mat-datepicker-toggle-active.mat-warn {\n color: #f44336; }\n.mat-dialog-container {\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-divider {\n border-top-color: rgba(0, 0, 0, 0.12); }\n.mat-divider-vertical {\n border-right-color: rgba(0, 0, 0, 0.12); }\n.mat-expansion-panel {\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-expansion-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-action-row {\n border-top-color: rgba(0, 0, 0, 0.12); }\n.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']).cdk-keyboard-focused, .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']).cdk-program-focused, .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']):hover {\n background: rgba(0, 0, 0, 0.04); }\n@media (hover: none) {\n .mat-expansion-panel:not(.mat-expanded):not([aria-disabled='true'])\n.mat-expansion-panel-header:hover {\n background: white; } }\n.mat-expansion-panel-header-title {\n color: rgba(0, 0, 0, 0.87); }\n.mat-expansion-panel-header-description,\n.mat-expansion-indicator::after {\n color: rgba(0, 0, 0, 0.54); }\n.mat-expansion-panel-header[aria-disabled='true'] {\n color: rgba(0, 0, 0, 0.26); }\n.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-title,\n .mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-description {\n color: inherit; }\n.mat-form-field-label {\n color: rgba(0, 0, 0, 0.6); }\n.mat-hint {\n color: rgba(0, 0, 0, 0.6); }\n.mat-form-field.mat-focused .mat-form-field-label {\n color: #5e35b1; }\n.mat-form-field.mat-focused .mat-form-field-label.mat-accent {\n color: #c41061; }\n.mat-form-field.mat-focused .mat-form-field-label.mat-warn {\n color: #f44336; }\n.mat-focused .mat-form-field-required-marker {\n color: #c41061; }\n.mat-form-field-ripple {\n background-color: rgba(0, 0, 0, 0.87); }\n.mat-form-field.mat-focused .mat-form-field-ripple {\n background-color: #5e35b1; }\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent {\n background-color: #c41061; }\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn {\n background-color: #f44336; }\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after {\n color: #5e35b1; }\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after {\n color: #c41061; }\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after {\n color: #f44336; }\n.mat-form-field.mat-form-field-invalid .mat-form-field-label {\n color: #f44336; }\n.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,\n .mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker {\n color: #f44336; }\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent {\n background-color: #f44336; }\n.mat-error {\n color: #f44336; }\n.mat-form-field-appearance-legacy .mat-form-field-label {\n color: rgba(0, 0, 0, 0.54); }\n.mat-form-field-appearance-legacy .mat-hint {\n color: rgba(0, 0, 0, 0.54); }\n.mat-form-field-appearance-legacy .mat-form-field-underline {\n background-color: rgba(0, 0, 0, 0.42); }\n.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline {\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);\n background-size: 4px 100%;\n background-repeat: repeat-x; }\n.mat-form-field-appearance-standard .mat-form-field-underline {\n background-color: rgba(0, 0, 0, 0.42); }\n.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline {\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);\n background-size: 4px 100%;\n background-repeat: repeat-x; }\n.mat-form-field-appearance-fill .mat-form-field-flex {\n background-color: rgba(0, 0, 0, 0.04); }\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex {\n background-color: rgba(0, 0, 0, 0.02); }\n.mat-form-field-appearance-fill .mat-form-field-underline::before {\n background-color: rgba(0, 0, 0, 0.42); }\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label {\n color: rgba(0, 0, 0, 0.38); }\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before {\n background-color: transparent; }\n.mat-form-field-appearance-outline .mat-form-field-outline {\n color: rgba(0, 0, 0, 0.12); }\n.mat-form-field-appearance-outline .mat-form-field-outline-thick {\n color: rgba(0, 0, 0, 0.87); }\n.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick {\n color: #5e35b1; }\n.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick {\n color: #c41061; }\n.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick {\n color: #f44336; }\n.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick {\n color: #f44336; }\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label {\n color: rgba(0, 0, 0, 0.38); }\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline {\n color: rgba(0, 0, 0, 0.06); }\n.mat-icon.mat-primary {\n color: #5e35b1; }\n.mat-icon.mat-accent {\n color: #c41061; }\n.mat-icon.mat-warn {\n color: #f44336; }\n.mat-form-field-type-mat-native-select .mat-form-field-infix::after {\n color: rgba(0, 0, 0, 0.54); }\n.mat-input-element:disabled,\n.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after {\n color: rgba(0, 0, 0, 0.38); }\n.mat-input-element {\n caret-color: #5e35b1; }\n.mat-input-element::-webkit-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-moz-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element:-ms-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-ms-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-moz-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-webkit-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element:-ms-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-accent .mat-input-element {\n caret-color: #c41061; }\n.mat-warn .mat-input-element,\n.mat-form-field-invalid .mat-input-element {\n caret-color: #f44336; }\n.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after {\n color: #f44336; }\n.mat-list-base .mat-list-item {\n color: rgba(0, 0, 0, 0.87); }\n.mat-list-base .mat-list-option {\n color: rgba(0, 0, 0, 0.87); }\n.mat-list-base .mat-subheader {\n color: rgba(0, 0, 0, 0.54); }\n.mat-list-item-disabled {\n background-color: #eeeeee; }\n.mat-list-option:hover, .mat-list-option:focus,\n.mat-nav-list .mat-list-item:hover,\n.mat-nav-list .mat-list-item:focus,\n.mat-action-list .mat-list-item:hover,\n.mat-action-list .mat-list-item:focus {\n background: rgba(0, 0, 0, 0.04); }\n.mat-menu-panel {\n background: white; }\n.mat-menu-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-menu-item {\n background: transparent;\n color: rgba(0, 0, 0, 0.87); }\n.mat-menu-item[disabled], .mat-menu-item[disabled]::after {\n color: rgba(0, 0, 0, 0.38); }\n.mat-menu-item .mat-icon-no-color,\n.mat-menu-item-submenu-trigger::after {\n color: rgba(0, 0, 0, 0.54); }\n.mat-menu-item:hover:not([disabled]),\n.mat-menu-item.cdk-program-focused:not([disabled]),\n.mat-menu-item.cdk-keyboard-focused:not([disabled]),\n.mat-menu-item-highlighted:not([disabled]) {\n background: rgba(0, 0, 0, 0.04); }\n.mat-paginator {\n background: white; }\n.mat-paginator,\n.mat-paginator-page-size .mat-select-trigger {\n color: rgba(0, 0, 0, 0.54); }\n.mat-paginator-decrement,\n.mat-paginator-increment {\n border-top: 2px solid rgba(0, 0, 0, 0.54);\n border-right: 2px solid rgba(0, 0, 0, 0.54); }\n.mat-paginator-first,\n.mat-paginator-last {\n border-top: 2px solid rgba(0, 0, 0, 0.54); }\n.mat-icon-button[disabled] .mat-paginator-decrement,\n.mat-icon-button[disabled] .mat-paginator-increment,\n.mat-icon-button[disabled] .mat-paginator-first,\n.mat-icon-button[disabled] .mat-paginator-last {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-progress-bar-background {\n fill: #cfc2e8; }\n.mat-progress-bar-buffer {\n background-color: #cfc2e8; }\n.mat-progress-bar-fill::after {\n background-color: #5e35b1; }\n.mat-progress-bar.mat-accent .mat-progress-bar-background {\n fill: #edb7d0; }\n.mat-progress-bar.mat-accent .mat-progress-bar-buffer {\n background-color: #edb7d0; }\n.mat-progress-bar.mat-accent .mat-progress-bar-fill::after {\n background-color: #c41061; }\n.mat-progress-bar.mat-warn .mat-progress-bar-background {\n fill: #ffcdd2; }\n.mat-progress-bar.mat-warn .mat-progress-bar-buffer {\n background-color: #ffcdd2; }\n.mat-progress-bar.mat-warn .mat-progress-bar-fill::after {\n background-color: #f44336; }\n.mat-progress-spinner circle, .mat-spinner circle {\n stroke: #5e35b1; }\n.mat-progress-spinner.mat-accent circle, .mat-spinner.mat-accent circle {\n stroke: #c41061; }\n.mat-progress-spinner.mat-warn circle, .mat-spinner.mat-warn circle {\n stroke: #f44336; }\n.mat-radio-outer-circle {\n border-color: rgba(0, 0, 0, 0.54); }\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle {\n border-color: #5e35b1; }\n.mat-radio-button.mat-primary .mat-radio-inner-circle,\n.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,\n.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple {\n background-color: #5e35b1; }\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle {\n border-color: #c41061; }\n.mat-radio-button.mat-accent .mat-radio-inner-circle,\n.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,\n.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple {\n background-color: #c41061; }\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle {\n border-color: #f44336; }\n.mat-radio-button.mat-warn .mat-radio-inner-circle,\n.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,\n.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple {\n background-color: #f44336; }\n.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,\n.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,\n.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle {\n background-color: rgba(0, 0, 0, 0.38); }\n.mat-radio-button.mat-radio-disabled .mat-radio-label-content {\n color: rgba(0, 0, 0, 0.38); }\n.mat-radio-button .mat-ripple-element {\n background-color: black; }\n.mat-select-value {\n color: rgba(0, 0, 0, 0.87); }\n.mat-select-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-select-disabled .mat-select-value {\n color: rgba(0, 0, 0, 0.38); }\n.mat-select-arrow {\n color: rgba(0, 0, 0, 0.54); }\n.mat-select-panel {\n background: white; }\n.mat-select-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple) {\n background: rgba(0, 0, 0, 0.12); }\n.mat-form-field.mat-focused.mat-primary .mat-select-arrow {\n color: #5e35b1; }\n.mat-form-field.mat-focused.mat-accent .mat-select-arrow {\n color: #c41061; }\n.mat-form-field.mat-focused.mat-warn .mat-select-arrow {\n color: #f44336; }\n.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow {\n color: #f44336; }\n.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow {\n color: rgba(0, 0, 0, 0.38); }\n.mat-drawer-container {\n background-color: #fafafa;\n color: rgba(0, 0, 0, 0.87); }\n.mat-drawer {\n background-color: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-drawer.mat-drawer-push {\n background-color: white; }\n.mat-drawer:not(.mat-drawer-side) {\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }\n.mat-drawer-side {\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-drawer-side.mat-drawer-end {\n border-left: solid 1px rgba(0, 0, 0, 0.12);\n border-right: none; }\n[dir='rtl'] .mat-drawer-side {\n border-left: solid 1px rgba(0, 0, 0, 0.12);\n border-right: none; }\n[dir='rtl'] .mat-drawer-side.mat-drawer-end {\n border-left: none;\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-drawer-backdrop.mat-drawer-shown {\n background-color: rgba(0, 0, 0, 0.6); }\n.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb {\n background-color: #c41061; }\n.mat-slide-toggle.mat-checked .mat-slide-toggle-bar {\n background-color: rgba(196, 16, 97, 0.54); }\n.mat-slide-toggle.mat-checked .mat-ripple-element {\n background-color: #c41061; }\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb {\n background-color: #5e35b1; }\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar {\n background-color: rgba(94, 53, 177, 0.54); }\n.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element {\n background-color: #5e35b1; }\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb {\n background-color: #f44336; }\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar {\n background-color: rgba(244, 67, 54, 0.54); }\n.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element {\n background-color: #f44336; }\n.mat-slide-toggle:not(.mat-checked) .mat-ripple-element {\n background-color: black; }\n.mat-slide-toggle-thumb {\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12);\n background-color: #fafafa; }\n.mat-slide-toggle-bar {\n background-color: rgba(0, 0, 0, 0.38); }\n.mat-slider-track-background {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-primary .mat-slider-track-fill,\n.mat-primary .mat-slider-thumb,\n.mat-primary .mat-slider-thumb-label {\n background-color: #5e35b1; }\n.mat-primary .mat-slider-thumb-label-text {\n color: white; }\n.mat-accent .mat-slider-track-fill,\n.mat-accent .mat-slider-thumb,\n.mat-accent .mat-slider-thumb-label {\n background-color: #c41061; }\n.mat-accent .mat-slider-thumb-label-text {\n color: white; }\n.mat-warn .mat-slider-track-fill,\n.mat-warn .mat-slider-thumb,\n.mat-warn .mat-slider-thumb-label {\n background-color: #f44336; }\n.mat-warn .mat-slider-thumb-label-text {\n color: white; }\n.mat-slider-focus-ring {\n background-color: rgba(196, 16, 97, 0.2); }\n.mat-slider:hover .mat-slider-track-background,\n.cdk-focused .mat-slider-track-background {\n background-color: rgba(0, 0, 0, 0.38); }\n.mat-slider-disabled .mat-slider-track-background,\n.mat-slider-disabled .mat-slider-track-fill,\n.mat-slider-disabled .mat-slider-thumb {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-disabled:hover .mat-slider-track-background {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-min-value .mat-slider-focus-ring {\n background-color: rgba(0, 0, 0, 0.12); }\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label {\n background-color: rgba(0, 0, 0, 0.87); }\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb {\n border-color: rgba(0, 0, 0, 0.26);\n background-color: transparent; }\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb, .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb, .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb {\n border-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-has-ticks .mat-slider-wrapper::after {\n border-color: rgba(0, 0, 0, 0.7); }\n.mat-slider-horizontal .mat-slider-ticks {\n background-image: repeating-linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent);\n background-image: -moz-repeating-linear-gradient(0.0001deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent); }\n.mat-slider-vertical .mat-slider-ticks {\n background-image: repeating-linear-gradient(to bottom, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent); }\n.mat-step-header.cdk-keyboard-focused, .mat-step-header.cdk-program-focused, .mat-step-header:hover {\n background-color: rgba(0, 0, 0, 0.04); }\n@media (hover: none) {\n .mat-step-header:hover {\n background: none; } }\n.mat-step-header .mat-step-label,\n.mat-step-header .mat-step-optional {\n color: rgba(0, 0, 0, 0.54); }\n.mat-step-header .mat-step-icon {\n background-color: rgba(0, 0, 0, 0.54);\n color: white; }\n.mat-step-header .mat-step-icon-selected,\n.mat-step-header .mat-step-icon-state-done,\n.mat-step-header .mat-step-icon-state-edit {\n background-color: #5e35b1;\n color: white; }\n.mat-step-header .mat-step-icon-state-error {\n background-color: transparent;\n color: #f44336; }\n.mat-step-header .mat-step-label.mat-step-label-active {\n color: rgba(0, 0, 0, 0.87); }\n.mat-step-header .mat-step-label.mat-step-label-error {\n color: #f44336; }\n.mat-stepper-horizontal, .mat-stepper-vertical {\n background-color: white; }\n.mat-stepper-vertical-line::before {\n border-left-color: rgba(0, 0, 0, 0.12); }\n.mat-horizontal-stepper-header::before,\n.mat-horizontal-stepper-header::after,\n.mat-stepper-horizontal-line {\n border-top-color: rgba(0, 0, 0, 0.12); }\n.mat-sort-header-arrow {\n color: #757575; }\n.mat-tab-nav-bar,\n.mat-tab-header {\n border-bottom: 1px solid rgba(0, 0, 0, 0.12); }\n.mat-tab-group-inverted-header .mat-tab-nav-bar,\n.mat-tab-group-inverted-header .mat-tab-header {\n border-top: 1px solid rgba(0, 0, 0, 0.12);\n border-bottom: none; }\n.mat-tab-label, .mat-tab-link {\n color: rgba(0, 0, 0, 0.87); }\n.mat-tab-label.mat-tab-disabled, .mat-tab-link.mat-tab-disabled {\n color: rgba(0, 0, 0, 0.38); }\n.mat-tab-header-pagination-chevron {\n border-color: rgba(0, 0, 0, 0.87); }\n.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-tab-group[class*='mat-background-'] .mat-tab-header,\n.mat-tab-nav-bar[class*='mat-background-'] {\n border-bottom: none;\n border-top: none; }\n.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(207, 194, 232, 0.3); }\n.mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar {\n background-color: #5e35b1; }\n.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar {\n background-color: white; }\n.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(237, 183, 208, 0.3); }\n.mat-tab-group.mat-accent .mat-ink-bar, .mat-tab-nav-bar.mat-accent .mat-ink-bar {\n background-color: #c41061; }\n.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar, .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar {\n background-color: white; }\n.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(255, 205, 210, 0.3); }\n.mat-tab-group.mat-warn .mat-ink-bar, .mat-tab-nav-bar.mat-warn .mat-ink-bar {\n background-color: #f44336; }\n.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar, .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar {\n background-color: white; }\n.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(207, 194, 232, 0.3); }\n.mat-tab-group.mat-background-primary .mat-tab-header, .mat-tab-group.mat-background-primary .mat-tab-links, .mat-tab-nav-bar.mat-background-primary .mat-tab-header, .mat-tab-nav-bar.mat-background-primary .mat-tab-links {\n background-color: #5e35b1; }\n.mat-tab-group.mat-background-primary .mat-tab-label, .mat-tab-group.mat-background-primary .mat-tab-link, .mat-tab-nav-bar.mat-background-primary .mat-tab-label, .mat-tab-nav-bar.mat-background-primary .mat-tab-link {\n color: white; }\n.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled {\n color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron {\n border-color: white; }\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-primary .mat-ripple-element, .mat-tab-nav-bar.mat-background-primary .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.12); }\n.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(237, 183, 208, 0.3); }\n.mat-tab-group.mat-background-accent .mat-tab-header, .mat-tab-group.mat-background-accent .mat-tab-links, .mat-tab-nav-bar.mat-background-accent .mat-tab-header, .mat-tab-nav-bar.mat-background-accent .mat-tab-links {\n background-color: #c41061; }\n.mat-tab-group.mat-background-accent .mat-tab-label, .mat-tab-group.mat-background-accent .mat-tab-link, .mat-tab-nav-bar.mat-background-accent .mat-tab-label, .mat-tab-nav-bar.mat-background-accent .mat-tab-link {\n color: white; }\n.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled {\n color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron {\n border-color: white; }\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-accent .mat-ripple-element, .mat-tab-nav-bar.mat-background-accent .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.12); }\n.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(255, 205, 210, 0.3); }\n.mat-tab-group.mat-background-warn .mat-tab-header, .mat-tab-group.mat-background-warn .mat-tab-links, .mat-tab-nav-bar.mat-background-warn .mat-tab-header, .mat-tab-nav-bar.mat-background-warn .mat-tab-links {\n background-color: #f44336; }\n.mat-tab-group.mat-background-warn .mat-tab-label, .mat-tab-group.mat-background-warn .mat-tab-link, .mat-tab-nav-bar.mat-background-warn .mat-tab-label, .mat-tab-nav-bar.mat-background-warn .mat-tab-link {\n color: white; }\n.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled {\n color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron {\n border-color: white; }\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-warn .mat-ripple-element, .mat-tab-nav-bar.mat-background-warn .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.12); }\n.mat-toolbar {\n background: whitesmoke;\n color: rgba(0, 0, 0, 0.87); }\n.mat-toolbar.mat-primary {\n background: #5e35b1;\n color: white; }\n.mat-toolbar.mat-accent {\n background: #c41061;\n color: white; }\n.mat-toolbar.mat-warn {\n background: #f44336;\n color: white; }\n.mat-toolbar .mat-form-field-underline,\n .mat-toolbar .mat-form-field-ripple,\n .mat-toolbar .mat-focused .mat-form-field-ripple {\n background-color: currentColor; }\n.mat-toolbar .mat-form-field-label,\n .mat-toolbar .mat-focused .mat-form-field-label,\n .mat-toolbar .mat-select-value,\n .mat-toolbar .mat-select-arrow,\n .mat-toolbar .mat-form-field.mat-focused .mat-select-arrow {\n color: inherit; }\n.mat-toolbar .mat-input-element {\n caret-color: currentColor; }\n.mat-tooltip {\n background: rgba(97, 97, 97, 0.9); }\n.mat-tree {\n background: white; }\n.mat-tree-node,\n.mat-nested-tree-node {\n color: rgba(0, 0, 0, 0.87); }\n.mat-snack-bar-container {\n color: rgba(255, 255, 255, 0.7);\n background: #323232;\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\n.mat-simple-snackbar-action {\n color: #c41061; }\n/* Verily branding basics */\n* {\n font-family: 'Work Sans', sans-serif; }\n@font-face {\n font-family: 'Material Icons';\n font-style: normal;\n font-weight: 400;\n src: local(\"Material Icons\"), local(\"MaterialIcons-Regular\"), url('MaterialIcons-Regular.woff') format(\"woff\"); }\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n /* Preferred icon size */\n display: inline-block;\n line-height: 1;\n text-transform: none;\n letter-spacing: normal;\n word-wrap: normal;\n white-space: nowrap;\n direction: ltr;\n /* Support for all WebKit browsers. */\n -webkit-font-smoothing: antialiased;\n /* Support for Safari and Chrome. */\n text-rendering: optimizeLegibility;\n /* Support for Firefox. */\n -moz-osx-font-smoothing: grayscale;\n /* Support for IE. */\n font-feature-settings: 'liga'; }\n/* Added for ng2-dragula support, see https://github.com/valor-software/ng2-dragula */\n/* in-flight clone */\n.gu-mirror {\n -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n filter: alpha(opacity=100);\n margin: 0 !important;\n opacity: 1 !important;\n pointer-events: none;\n position: fixed !important;\n z-index: 9999 !important; }\n/* high-performance display:none; helper */\n.gu-hide {\n left: -9999px !important; }\n/* added to mirrorContainer (default = body) while dragging */\n.gu-unselectable {\n -ms-user-select: none !important;\n -moz-user-select: none !important;\n -webkit-user-select: none !important;\n user-select: none !important;\n cursor: grabbing !important;\n cursor: -webkit-grabbing; }\n/* added to the source element while its mirror is dragged */\n.gu-transit {\n -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)\";\n filter: alpha(opacity=20);\n opacity: 0.2; }\n.mat-app-background {\n background-color: #202020;\n /* Grey 900 */ }\nbody {\n margin: 0px; }\n\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvbGF1cmVuZHVrZXMvY2hhcm1hbmRlci1iY2gvbWVkdGltZWxpbmUvc3JjL3N0eWxlcy5zY3NzIiwiL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9sYXVyZW5kdWtlcy9jaGFybWFuZGVyLWJjaC9tZWR0aW1lbGluZS9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvbWF0ZXJpYWwvX3RoZW1pbmcuc2NzcyIsIi91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvbGF1cmVuZHVrZXMvY2hhcm1hbmRlci1iY2gvbWVkdGltZWxpbmUvc3JjL3ZlcmlseS1jb2xvcnMtbWF0ZXJpYWwtdGhlbWUuc2NzcyIsInNyYy9zdHlsZXMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsa0VBQVk7QUFDWixpRUFBWTtBQUNaLGdFQUFZO0FBSlosNkNBQUE7QUN5MUNBLGtDQUFBO0FBb2hEQSwyQ0FBQTtBQXdDQSxxQkFBQTtBQXIrQkU7RUFDRSxnQkFoTHVCO0VBaUx2QixlQWxMc0I7RUFtTHRCLGlEQXBpQitELEVBQUE7QUF1aUJqRTtFQUNFLGNBQW1DLEVBQUE7QUFHckM7RUFDRSxlQUFtQyxFQUFBO0FBeFRyQztFQTFORSx3REExQitEO0VBc1AvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQS9ORSx3REExQitEO0VBMlAvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXBPRSx3REExQitEO0VBZ1EvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXpPRSx3REExQitEO0VBcVEvRCxnQkFBZ0IsRUFBQTtBQU1sQjtFQWpQRSwyREExQitEO0VBbVIvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQTVQRSwwREExQitEO0VBOFIvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXZRRSx3REExQitELEVBQUE7QUFxU2pFO0VBM1FFLHdEQTFCK0QsRUFBQTtBQXFTakU7SUFJSSxnQkFBZ0IsRUFBQTtBQUlwQjtFQW5SRSx3REExQitELEVBQUE7QUFtVGpFO0VBelJFLDBEQTFCK0Q7RUFx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QUE4RDtFQWhuSGhFLDJIQUVtRSxFQUFBO0FBbW5IbkU7RUFDRSxjQy8vSFcsRUFBQTtBRjFDZiwyQkFBQTtBQUNBO0VBQ0Usb0NBQW9DLEVBQUE7QUFJdEM7RUFDRSw2QkFBNkI7RUFDN0Isa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQiw4R0FFd0UsRUFBQTtBQUcxRTtFQUNFLDZCQUE2QjtFQUM3QixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFBRyx3QkFBQTtFQUNsQixxQkFBcUI7RUFDckIsY0FBYztFQUNkLG9CQUFvQjtFQUNwQixzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQixjQUFjO0VBRWQscUNBQUE7RUFDQSxtQ0FBbUM7RUFDbkMsbUNBQUE7RUFDQSxrQ0FBa0M7RUFFbEMseUJBQUE7RUFDQSxrQ0FBa0M7RUFFbEMsb0JBQUE7RUFDQSw2QkFBNkIsRUFBQTtBQUcvQixxRkFBQTtBQUNBLG9CQUFBO0FBQ0E7RUFDRSxrRUFBa0U7RUFDbEUsMEJBQTBCO0VBQzFCLG9CQUFvQjtFQUNwQixxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBQTtBQUcxQiwwQ0FBQTtBQUNBO0VBQ0Usd0JBQXdCLEVBQUE7QUFHMUIsNkRBQUE7QUFDQTtFQUNFLGdDQUFnQztFQUNoQyxpQ0FBaUM7RUFDakMsb0NBQW9DO0VBQ3BDLDRCQUE0QjtFQUM1QiwyQkFBMkI7RUFFM0Isd0JBQXdCLEVBQUE7QUFFMUIsNERBQUE7QUFDQTtFQUNFLGlFQUFpRTtFQUNqRSx5QkFBeUI7RUFDekIsWUFBWSxFQUFBO0FBR2Q7RUFDRSx5QkFBeUI7RUFBRSxhQUFBLEVBQWM7QUFHM0M7RUFDRSxXQUFXLEVBQUEiLCJmaWxlIjoic3JjL3N0eWxlcy5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogRGVmYXVsdCBBbmd1bGFyIE1hdGVyaWFsIHByZWJ1aWx0IHRoZW1lLiAqL1xuQGltcG9ydCBcIi4vdmVyaWx5LWNvbG9ycy1tYXRlcmlhbC10aGVtZS5zY3NzXCI7XG5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vJyk7XG5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PU1vbnRzZXJyYXQnKTtcbkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9V29yaytTYW5zJyk7XG5cbi8qIFZlcmlseSBicmFuZGluZyBiYXNpY3MgKi9cbioge1xuICBmb250LWZhbWlseTogJ1dvcmsgU2FucycsIHNhbnMtc2VyaWY7XG59XG5cbi8vIFNlbGYtaG9zdCB0aGUgQW5ndWxhciBNYXRlcmlhbCBpY29ucy5cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBzcmM6IGxvY2FsKCdNYXRlcmlhbCBJY29ucycpLFxuICAgIGxvY2FsKCdNYXRlcmlhbEljb25zLVJlZ3VsYXInKSxcbiAgICB1cmwoLi9hc3NldHMvbWF0ZXJpYWxfaWNvbnMvTWF0ZXJpYWxJY29ucy1SZWd1bGFyLndvZmYpIGZvcm1hdCgnd29mZicpLFxufVxuXG4ubWF0ZXJpYWwtaWNvbnMge1xuICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXNpemU6IDI0cHg7ICAvKiBQcmVmZXJyZWQgaWNvbiBzaXplICovXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgZGlyZWN0aW9uOiBsdHI7XG5cbiAgLyogU3VwcG9ydCBmb3IgYWxsIFdlYktpdCBicm93c2Vycy4gKi9cbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC8qIFN1cHBvcnQgZm9yIFNhZmFyaSBhbmQgQ2hyb21lLiAqL1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuXG4gIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG5cbiAgLyogU3VwcG9ydCBmb3IgSUUuICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xufVxuXG4vKiBBZGRlZCBmb3IgbmcyLWRyYWd1bGEgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZzItZHJhZ3VsYSAqL1xuLyogaW4tZmxpZ2h0IGNsb25lICovXG4uZ3UtbWlycm9yIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0xMDApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApO1xuICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDtcbn1cblxuLyogaGlnaC1wZXJmb3JtYW5jZSBkaXNwbGF5Om5vbmU7IGhlbHBlciAqL1xuLmd1LWhpZGUge1xuICBsZWZ0OiAtOTk5OXB4ICFpbXBvcnRhbnQ7XG59XG5cbi8qIGFkZGVkIHRvIG1pcnJvckNvbnRhaW5lciAoZGVmYXVsdCA9IGJvZHkpIHdoaWxlIGRyYWdnaW5nICovXG4uZ3UtdW5zZWxlY3RhYmxlIHtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICBjdXJzb3I6IGdyYWJiaW5nICFpbXBvcnRhbnQ7XG4gIGN1cnNvcjogLW1vei1ncmFiYmluZztcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nO1xufVxuLyogYWRkZWQgdG8gdGhlIHNvdXJjZSBlbGVtZW50IHdoaWxlIGl0cyBtaXJyb3IgaXMgZHJhZ2dlZCAqL1xuLmd1LXRyYW5zaXQge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTIwKVwiO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjApO1xuICBvcGFjaXR5OiAwLjI7XG59XG5cbi5tYXQtYXBwLWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOyAvKiBHcmV5IDkwMCAqL1xufVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwcHg7XG59XG4iLCIvLyBJbXBvcnQgYWxsIHRoZSB0aGVtaW5nIGZ1bmN0aW9uYWxpdHkuXG4vLyBXZSBjYW4gdXNlIHJlbGF0aXZlIGltcG9ydHMgZm9yIGltcG9ydHMgZnJvbSB0aGUgY2RrIGJlY2F1c2Ugd2UgYnVuZGxlIGV2ZXJ5dGhpbmdcbi8vIHVwIGludG8gYSBzaW5nbGUgZmxhdCBzY3NzIGZpbGUgZm9yIG1hdGVyaWFsLlxuLy8gV2Ugd2FudCBvdmVybGF5cyB0byBhbHdheXMgYXBwZWFyIG92ZXIgdXNlciBjb250ZW50LCBzbyBzZXQgYSBiYXNlbGluZVxuLy8gdmVyeSBoaWdoIHotaW5kZXggZm9yIHRoZSBvdmVybGF5IGNvbnRhaW5lciwgd2hpY2ggaXMgd2hlcmUgd2UgY3JlYXRlIHRoZSBuZXdcbi8vIHN0YWNraW5nIGNvbnRleHQgZm9yIGFsbCBvdmVybGF5cy5cbiRjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcjogMTAwMDtcbiRjZGstei1pbmRleC1vdmVybGF5OiAxMDAwO1xuJGNkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3A6IDEwMDA7XG5cbi8vIEJhY2tncm91bmQgY29sb3IgZm9yIGFsbCBvZiB0aGUgYmFja2Ryb3BzXG4kY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcC1iYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpO1xuXG4vLyBEZWZhdWx0IGJhY2tkcm9wIGFuaW1hdGlvbiBpcyBiYXNlZCBvbiB0aGUgTWF0ZXJpYWwgRGVzaWduIHN3aWZ0LWVhc2Utb3V0LlxuJGJhY2tkcm9wLWFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXMgIWRlZmF1bHQ7XG4kYmFja2Ryb3AtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSkgIWRlZmF1bHQ7XG5cblxuQG1peGluIGNkay1vdmVybGF5KCkge1xuICAuY2RrLW92ZXJsYXktY29udGFpbmVyLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICAgIC8vIERpc2FibGUgZXZlbnRzIGZyb20gYmVpbmcgY2FwdHVyZWQgb24gdGhlIG92ZXJsYXkgY29udGFpbmVyLlxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBzaG91bGQgYmUgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0LlxuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC8vIFRoZSBvdmVybGF5LWNvbnRhaW5lciBpcyBhbiBpbnZpc2libGUgZWxlbWVudCB3aGljaCBjb250YWlucyBhbGwgaW5kaXZpZHVhbCBvdmVybGF5cy5cbiAgLmNkay1vdmVybGF5LWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcjtcblxuICAgICY6ZW1wdHkge1xuICAgICAgLy8gSGlkZSB0aGUgZWxlbWVudCB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGQgbm9kZXMuIFRoaXMgZG9lc24ndFxuICAgICAgLy8gaW5jbHVkZSBvdmVybGF5cyB0aGF0IGhhdmUgYmVlbiBkZXRhY2hlZCwgcmF0aGVyIHRoYW4gZGlzcG9zZWQuXG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIHVzZSBhbiBleHRyYSB3cmFwcGVyIGVsZW1lbnQgaW4gb3JkZXIgdG8gdXNlIG1ha2UgdGhlIG92ZXJsYXkgaXRzZWxmIGEgZmxleCBpdGVtLlxuICAvLyBUaGlzIG1ha2VzIGNlbnRlcmluZyB0aGUgb3ZlcmxheSBlYXN5IHdpdGhvdXQgcnVubmluZyBpbnRvIHRoZSBzdWJwaXhlbCByZW5kZXJpbmdcbiAgLy8gcHJvYmxlbXMgdGllZCB0byB1c2luZyBgdHJhbnNmb3JtYCBhbmQgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBvdGhlciBwb3NpdGlvblxuICAvLyBzdHJhdGVnaWVzLlxuICAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5O1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgb3ZlcmxheSBwYW5lLlxuICAuY2RrLW92ZXJsYXktcGFuZSB7XG4gICAgLy8gTm90ZTogaXQncyBpbXBvcnRhbnQgZm9yIHRoaXMgb25lIHRvIHN0YXJ0IG9mZiBgYWJzb2x1dGVgLFxuICAgIC8vIGluIG9yZGVyIGZvciB1cyB0byBiZSBhYmxlIHRvIG1lYXN1cmUgaXQgY29ycmVjdGx5LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5O1xuXG4gICAgLy8gRm9yIGNvbm5lY3RlZC1wb3NpdGlvbiBvdmVybGF5cywgd2Ugc2V0IGBkaXNwbGF5OiBmbGV4YCBpblxuICAgIC8vIG9yZGVyIHRvIGZvcmNlIGBtYXgtd2lkdGhgIGFuZCBgbWF4LWhlaWdodGAgdG8gdGFrZSBlZmZlY3QuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgfVxuXG4gIC5jZGstb3ZlcmxheS1iYWNrZHJvcCB7XG4gICAgLy8gVE9ETyhqZWxib3Vybik6IHJldXNlIHNpZGVuYXYgZnVsbHNjcmVlbiBtaXhpbi5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgei1pbmRleDogJGNkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3A7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5ICRiYWNrZHJvcC1hbmltYXRpb24tZHVyYXRpb24gJGJhY2tkcm9wLWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb247XG4gICAgb3BhY2l0eTogMDtcblxuICAgICYuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyB7XG4gICAgICBvcGFjaXR5OiAxO1xuXG4gICAgICAvLyBJbiBoaWdoIGNvbnRyYXN0IG1vZGUgdGhlIHJnYmEgYmFja2dyb3VuZCB3aWxsIGJlY29tZSBzb2xpZCBzbyB3ZSBuZWVkIHRvIGZhbGwgYmFja1xuICAgICAgLy8gdG8gbWFraW5nIGl0IG9wYXF1ZSB1c2luZyBgb3BhY2l0eWAuIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGBjZGstaGlnaC1jb250cmFzdGBcbiAgICAgIC8vIG1peGluLCBiZWNhdXNlIHdlIGNhbid0IG5vcm1hbGl6ZSB0aGUgaW1wb3J0IHBhdGggdG8gdGhlIF9hMTF5LnNjc3MgYm90aCBmb3IgdGhlXG4gICAgICAvLyBzb3VyY2UgYW5kIHdoZW4gdGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkLiBTZWUgIzEwOTA4LlxuICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wIHtcbiAgICBiYWNrZ3JvdW5kOiAkY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcC1iYWNrZ3JvdW5kO1xuICB9XG5cbiAgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIHtcbiAgICAvLyBOb3RlOiBhcyBvZiBGaXJlZm94IDU3LCBoYXZpbmcgdGhlIGJhY2tkcm9wIGJlIGBiYWNrZ3JvdW5kOiBub25lYCB3aWxsIHByZXZlbnQgaXQgZnJvbVxuICAgIC8vIGNhcHR1cmluZyB0aGUgdXNlcidzIG1vdXNlIHNjcm9sbCBldmVudHMuIFNpbmNlIHdlIGFsc28gY2FuJ3QgdXNlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gYHJnYmEoMCwgMCwgMCwgMClgLCB3ZSB3b3JrIGFyb3VuZCB0aGUgaW5jb25zaXN0ZW5jeSBieSBub3Qgc2V0dGluZyB0aGUgYmFja2dyb3VuZCBhdFxuICAgIC8vIGFsbCBhbmQgdXNpbmcgYG9wYWNpdHlgIHRvIG1ha2UgdGhlIGVsZW1lbnQgdHJhbnNwYXJlbnQuXG4gICAgJiwgJi5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcmxheSBwYXJlbnQgZWxlbWVudCB1c2VkIHdpdGggdGhlIGNvbm5lY3RlZCBwb3NpdGlvbiBzdHJhdGVneS4gVXNlZCB0byBjb25zdHJhaW4gdGhlXG4gIC8vIG92ZXJsYXkgZWxlbWVudCdzIHNpemUgdG8gZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuXG4gIC5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogJGNkay16LWluZGV4LW92ZXJsYXk7XG5cbiAgICAvLyBXZSB1c2UgYGRpc3BsYXk6IGZsZXhgIG9uIHRoaXMgZWxlbWVudCBleGNsdXNpdmVseSBmb3IgY2VudGVyaW5nIGNvbm5lY3RlZCBvdmVybGF5cy5cbiAgICAvLyBXaGVuICpub3QqIGNlbnRlcmluZywgYSB0b3AvbGVmdC9ib3R0b20vcmlnaHQgd2lsbCBiZSBzZXQgd2hpY2ggb3ZlcnJpZGVzIHRoZSBub3JtYWxcbiAgICAvLyBmbGV4IGxheW91dC5cbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLy8gV2UgdXNlIHRoZSBgY29sdW1uYCBkaXJlY3Rpb24gaGVyZSB0byBhdm9pZCBzb21lIGZsZXhib3ggaXNzdWVzIGluIEVkZ2VcbiAgICAvLyB3aGVuIHVzaW5nIHRoZSBcImdyb3cgYWZ0ZXIgb3BlblwiIG9wdGlvbnMuXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgIC8vIEFkZCBzb21lIGRpbWVuc2lvbnMgc28gdGhlIGVsZW1lbnQgaGFzIGFuIGBpbm5lclRleHRgIHdoaWNoIHNvbWUgcGVvcGxlIGRlcGVuZCBvbiBpbiB0ZXN0cy5cbiAgICBtaW4td2lkdGg6IDFweDtcbiAgICBtaW4taGVpZ2h0OiAxcHg7XG4gIH1cblxuICAvLyBVc2VkIHdoZW4gZGlzYWJsaW5nIGdsb2JhbCBzY3JvbGxpbmcuXG4gIC5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG5cbiAgICAvLyBOZWNlc3NhcnkgZm9yIHRoZSBjb250ZW50IG5vdCB0byBsb3NlIGl0cyB3aWR0aC4gTm90ZSB0aGF0IHdlJ3JlIHVzaW5nIDEwMCUsIGluc3RlYWQgb2ZcbiAgICAvLyAxMDB2dywgYmVjYXVzZSAxMDB2dyBpbmNsdWRlcyB0aGUgd2lkdGggcGx1cyB0aGUgc2Nyb2xsYmFyLCB3aGVyZWFzIDEwMCUgaXMgdGhlIHdpZHRoXG4gICAgLy8gdGhhdCB0aGUgZWxlbWVudCBoYWQgYmVmb3JlIHdlIG1hZGUgaXQgYGZpeGVkYC5cbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC8vIE5vdGU6IHRoaXMgd2lsbCBhbHdheXMgYWRkIGEgc2Nyb2xsYmFyIHRvIHdoYXRldmVyIGVsZW1lbnQgaXQgaXMgb24sIHdoaWNoIGNhblxuICAgIC8vIHBvdGVudGlhbGx5IHJlc3VsdCBpbiBkb3VibGUgc2Nyb2xsYmFycy4gSXQgc2hvdWxkbid0IGJlIGFuIGlzc3VlLCBiZWNhdXNlIHdlIHdvbid0XG4gICAgLy8gYmxvY2sgc2Nyb2xsaW5nIG9uIGEgcGFnZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNjcm9sbGJhciBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICB9XG59XG5cbkBtaXhpbiBjZGstYTExeSB7XG4gIC5jZGstdmlzdWFsbHktaGlkZGVuIHtcbiAgICBib3JkZXI6IDA7XG4gICAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgICBoZWlnaHQ6IDFweDtcbiAgICBtYXJnaW46IC0xcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMXB4O1xuXG4gICAgLy8gQXZvaWQgYnJvd3NlcnMgcmVuZGVyaW5nIHRoZSBmb2N1cyByaW5nIGluIHNvbWUgY2FzZXMuXG4gICAgb3V0bGluZTogMDtcblxuICAgIC8vIEF2b2lkIHNvbWUgY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIgd2lsbCBzdGlsbCByZW5kZXIgdGhlIG5hdGl2ZSBjb250cm9scyAoc2VlICM5MDQ5KS5cbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICB9XG59XG5cbi8vIEFwcGxpZXMgc3R5bGVzIGZvciB1c2VycyBpbiBoaWdoIGNvbnRyYXN0IG1vZGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgYXBwbGllc1xuLy8gdG8gTWljcm9zb2Z0IGJyb3dzZXJzLiBDaHJvbWUgY2FuIGJlIGluY2x1ZGVkIGJ5IGNoZWNraW5nIGZvciB0aGUgYGh0bWxbaGNdYFxuLy8gYXR0cmlidXRlLCBob3dldmVyIENocm9tZSBoYW5kbGVzIGhpZ2ggY29udHJhc3QgZGlmZmVyZW50bHkuXG4vL1xuLy8gQHBhcmFtIHRhcmdldCBXaGljaCBraW5kIG9mIGhpZ2ggY29udHJhc3Qgc2V0dGluZyB0byB0YXJnZXQuIERlZmF1bHRzIHRvIGBhY3RpdmVgLCBjYW4gYmVcbi8vICAgIGB3aGl0ZS1vbi1ibGFja2Agb3IgYGJsYWNrLW9uLXdoaXRlYC5cbkBtaXhpbiBjZGstaGlnaC1jb250cmFzdCgkdGFyZ2V0OiBhY3RpdmUpIHtcbiAgQG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDogJHRhcmdldCkge1xuICAgIEBjb250ZW50O1xuICB9XG59XG5cbi8vIENvcmUgc3R5bGVzIHRoYXQgZW5hYmxlIG1vbml0b3JpbmcgYXV0b2ZpbGwgc3RhdGUgb2YgdGV4dCBmaWVsZHMuXG5AbWl4aW4gY2RrLXRleHQtZmllbGQge1xuICAvLyBLZXlmcmFtZXMgdGhhdCBhcHBseSBubyBzdHlsZXMsIGJ1dCBhbGxvdyB1cyB0byBtb25pdG9yIHdoZW4gYW4gdGV4dCBmaWVsZCBiZWNvbWVzIGF1dG9maWxsZWRcbiAgLy8gYnkgd2F0Y2hpbmcgZm9yIHRoZSBhbmltYXRpb24gZXZlbnRzIHRoYXQgYXJlIGZpcmVkIHdoZW4gdGhleSBzdGFydC4gTm90ZTogdGhlIC8qISovIGNvbW1lbnQgaXNcbiAgLy8gbmVlZGVkIHRvIHByZXZlbnQgTGliU2FzcyBmcm9tIHN0cmlwcGluZyB0aGUga2V5ZnJhbWVzIG91dC5cbiAgLy8gQmFzZWQgb246IGh0dHBzOi8vbWVkaXVtLmNvbS9AYnJ1bm4vZGV0ZWN0aW5nLWF1dG9maWxsZWQtZmllbGRzLWluLWphdmFzY3JpcHQtYWVkNTk4ZDI1ZGE3XG4gIEBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgey8qISovfVxuICBAa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCB7LyohKi99XG5cbiAgLmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxsIHtcbiAgICBhbmltYXRpb24tbmFtZTogY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7XG4gIH1cblxuICAuY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCkge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQ7XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHJlc2l6ZSBoYW5kbGUgb24gYXV0b3NpemluZyB0ZXh0YXJlYXMsIGJlY2F1c2Ugd2hhdGV2ZXIgaGVpZ2h0XG4gIC8vIHRoZSB1c2VyIHJlc2l6ZWQgdG8gd2lsbCBiZSBvdmVyd3JpdHRlbiBvbmNlIHRoZXkgc3RhcnQgdHlwaW5nIGFnYWluLlxuICB0ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUge1xuICAgIHJlc2l6ZTogbm9uZTtcbiAgfVxuXG4gIC8vIFRoaXMgY2xhc3MgaXMgdGVtcG9yYXJpbHkgYXBwbGllZCB0byB0aGUgdGV4dGFyZWEgd2hlbiBpdCBpcyBiZWluZyBtZWFzdXJlZC4gSXQgaXMgaW1tZWRpYXRlbHlcbiAgLy8gcmVtb3ZlZCB3aGVuIG1lYXN1cmluZyBpcyBjb21wbGV0ZS4gV2UgdXNlIGAhaW1wb3J0YW50YCBydWxlcyBoZXJlIHRvIG1ha2Ugc3VyZSB1c2VyLXNwZWNpZmllZFxuICAvLyBydWxlcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIG1lYXN1cmVtZW50LlxuICB0ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nIHtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgLy8gSGF2aW5nIDJweCB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nIHNlZW1zIHRvIGZpeCBhIGJ1ZyB3aGVyZSBDaHJvbWUgZ2V0cyBhbiBpbmNvcnJlY3RcbiAgICAvLyBtZWFzdXJlbWVudC4gV2UganVzdCBoYXZlIHRvIGFjY291bnQgZm9yIGl0IGxhdGVyIGFuZCBzdWJ0cmFjdCBpdCBvZmYgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICBwYWRkaW5nOiAycHggMCAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLy8gVXNlZCB0byBnZW5lcmF0ZSBVSURzIGZvciBrZXlmcmFtZXMgdXNlZCB0byBjaGFuZ2UgdGhlIHRleHQgZmllbGQgYXV0b2ZpbGwgc3R5bGVzLlxuJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50OiAwO1xuXG4vLyBNaXhpbiB1c2VkIHRvIGFwcGx5IGN1c3RvbSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycyB0byBhbiBhdXRvZmlsbGVkIHRleHQgZmllbGQuXG4vLyBCYXNlZCBvbjogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc4MTU0OS9cbi8vIHJlbW92aW5nLWlucHV0LWJhY2tncm91bmQtY29sb3VyLWZvci1jaHJvbWUtYXV0b2NvbXBsZXRlI2Fuc3dlci0zNzQzMjI2MFxuQG1peGluIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yKCRiYWNrZ3JvdW5kLCAkZm9yZWdyb3VuZDonJykge1xuICBAa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLSN7JGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50fSB7XG4gICAgdG8ge1xuICAgICAgYmFja2dyb3VuZDogJGJhY2tncm91bmQ7XG4gICAgICBAaWYgJGZvcmVncm91bmQgIT0gJycgeyBjb2xvcjogJGZvcmVncm91bmQ7IH1cbiAgICB9XG4gIH1cblxuICAmOi13ZWJraXQtYXV0b2ZpbGwge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvci0jeyRjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvci1mcmFtZS1jb3VudH07XG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgfVxuXG4gICYuY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGwge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3ItI3skY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3ItZnJhbWUtY291bnR9O1xuICB9XG5cbiAgJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50OlxuICAgICAgJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50ICsgMSAhZ2xvYmFsO1xufVxuXG5cbi8vIENvcmUgc3R5bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgbWF0ZXJpYWwgZGVzaWduIHRyZWF0bWVudHMgdG8gYW55IGVsZW1lbnQuXG4vLyBNZWRpYSBxdWVyaWVzXG4vLyBUT0RPKGpvc2VwaHBlcnJvdHQpOiBDaGFuZ2UgJG1hdC14c21hbGwgYW5kICRtYXQtc21hbGwgdXNhZ2VzIHRvIHJlbHkgb24gQnJlYWtwb2ludE9ic2VydmVyLFxuJG1hdC14c21hbGw6ICdtYXgtd2lkdGg6IDU5OXB4JztcbiRtYXQtc21hbGw6ICdtYXgtd2lkdGg6IDk1OXB4JztcblxuLy8gVE9ETzogUmV2aXNpdCBhbGwgei1pbmRpY2VzIGJlZm9yZSBiZXRhXG4vLyB6LWluZGV4IG1hc3RlciBsaXN0XG5cbiR6LWluZGV4LWZhYjogMjAgIWRlZmF1bHQ7XG4kei1pbmRleC1kcmF3ZXI6IDEwMCAhZGVmYXVsdDtcblxuLy8gR2xvYmFsIGNvbnN0YW50c1xuJHBpOiAzLjE0MTU5MjY1O1xuXG4vLyBQYWRkaW5nIGJldHdlZW4gaW5wdXQgdG9nZ2xlcyBhbmQgdGhlaXIgbGFiZWxzXG4kbWF0LXRvZ2dsZS1wYWRkaW5nOiA4cHggIWRlZmF1bHQ7XG4vLyBXaWR0aCBhbmQgaGVpZ2h0IG9mIGlucHV0IHRvZ2dsZXNcbiRtYXQtdG9nZ2xlLXNpemU6IDIwcHggIWRlZmF1bHQ7XG5cbi8vIEVhc2luZyBDdXJ2ZXNcbi8vIFRPRE8oamVsYm91cm4pOiBhbGwgb2YgdGhlc2UgbmVlZCB0byBiZSByZXZpc2l0ZWRcblxuLy8gVGhlIGRlZmF1bHQgYW5pbWF0aW9uIGN1cnZlcyB1c2VkIGJ5IG1hdGVyaWFsIGRlc2lnbi5cbiRtYXQtbGluZWFyLW91dC1zbG93LWluLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSAhZGVmYXVsdDtcbiRtYXQtZmFzdC1vdXQtc2xvdy1pbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkgIWRlZmF1bHQ7XG4kbWF0LWZhc3Qtb3V0LWxpbmVhci1pbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpICFkZWZhdWx0O1xuXG4kZWFzZS1pbi1vdXQtY3VydmUtZnVuY3Rpb246IGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSAhZGVmYXVsdDtcblxuJHN3aWZ0LWVhc2Utb3V0LWR1cmF0aW9uOiA0MDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpICFkZWZhdWx0O1xuJHN3aWZ0LWVhc2Utb3V0OiBhbGwgJHN3aWZ0LWVhc2Utb3V0LWR1cmF0aW9uICRzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb24gIWRlZmF1bHQ7XG5cbiRzd2lmdC1lYXNlLWluLWR1cmF0aW9uOiAzMDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMikgIWRlZmF1bHQ7XG4kc3dpZnQtZWFzZS1pbjogYWxsICRzd2lmdC1lYXNlLWluLWR1cmF0aW9uICRzd2lmdC1lYXNlLWluLXRpbWluZy1mdW5jdGlvbiAhZGVmYXVsdDtcblxuJHN3aWZ0LWVhc2UtaW4tb3V0LWR1cmF0aW9uOiA1MDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLW91dC10aW1pbmctZnVuY3Rpb246ICRlYXNlLWluLW91dC1jdXJ2ZS1mdW5jdGlvbiAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLW91dDogYWxsICRzd2lmdC1lYXNlLWluLW91dC1kdXJhdGlvbiAkc3dpZnQtZWFzZS1pbi1vdXQtdGltaW5nLWZ1bmN0aW9uICFkZWZhdWx0O1xuXG4kc3dpZnQtbGluZWFyLWR1cmF0aW9uOiA4MG1zICFkZWZhdWx0O1xuJHN3aWZ0LWxpbmVhci10aW1pbmctZnVuY3Rpb246IGxpbmVhciAhZGVmYXVsdDtcbiRzd2lmdC1saW5lYXI6IGFsbCAkc3dpZnQtbGluZWFyLWR1cmF0aW9uICRzd2lmdC1saW5lYXItdGltaW5nLWZ1bmN0aW9uICFkZWZhdWx0O1xuXG5cblxuLy8gQSBjb2xsZWN0aW9uIG9mIG1peGlucyBhbmQgQ1NTIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseSBlbGV2YXRpb24gdG8gYSBtYXRlcmlhbFxuLy8gZWxlbWVudC5cbi8vIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vZW52aXJvbm1lbnQvZWxldmF0aW9uLmh0bWxcbi8vIEV4YW1wbGVzOlxuLy9cbi8vXG4vLyAubWF0LWZvbyB7XG4vLyAgIEBpbmNsdWRlICRtYXQtZWxldmF0aW9uKDIpO1xuLy9cbi8vICAgJjphY3RpdmUge1xuLy8gICAgIEBpbmNsdWRlICRtYXQtZWxldmF0aW9uKDgpO1xuLy8gICB9XG4vLyB9XG4vL1xuLy8gPGRpdiBpZD1cImV4dGVybmFsLWNhcmRcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejJcIj48cD5Tb21lIGNvbnRlbnQ8L3A+PC9kaXY+XG4vL1xuLy8gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBkZXNpZ24gYmVoaW5kIGhvdyBlbGV2YXRpb24gaXMgaW1wbGVtZW50ZWQsIHNlZSB0aGUgZGVzaWduIGRvYyBhdFxuLy8gaHR0cHM6Ly9nb28uZ2wvS3EwazlaLlxuXG4vLyBDb2xvcnMgZm9yIHVtYnJhLCBwZW51bWJyYSwgYW5kIGFtYmllbnQgc2hhZG93cy4gQXMgZGVzY3JpYmVkIGluIHRoZSBkZXNpZ24gZG9jLCBlYWNoIGVsZXZhdGlvblxuLy8gbGV2ZWwgaXMgY3JlYXRlZCB1c2luZyBhIHNldCBvZiAzIHNoYWRvdyB2YWx1ZXMsIG9uZSBmb3IgdW1icmEgKHRoZSBzaGFkb3cgcmVwcmVzZW50aW5nIHRoZVxuLy8gc3BhY2UgY29tcGxldGVseSBvYnNjdXJlZCBieSBhbiBvYmplY3QgcmVsYXRpdmUgdG8gaXRzIGxpZ2h0IHNvdXJjZSksIG9uZSBmb3IgcGVudW1icmEgKHRoZVxuLy8gc3BhY2UgcGFydGlhbGx5IG9ic2N1cmVkIGJ5IGFuIG9iamVjdCksIGFuZCBvbmUgZm9yIGFtYmllbnQgKHRoZSBzcGFjZSB3aGljaCBjb250YWlucyB0aGUgb2JqZWN0XG4vLyBpdHNlbGYpLiBGb3IgYSBmdXJ0aGVyIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRlcm1zIGFuZCB0aGVpciBtZWFuaW5ncywgc2VlXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VbWJyYSxfcGVudW1icmFfYW5kX2FudHVtYnJhLlxuXG4vLyBNYXBzIGZvciB0aGUgZGlmZmVyZW50IHNoYWRvdyBzZXRzIGFuZCB0aGVpciB2YWx1ZXMgd2l0aGluIGVhY2ggei1zcGFjZS4gVGhlc2UgdmFsdWVzIHdlcmVcbi8vIGNyZWF0ZWQgYnkgdGFraW5nIGEgZmV3IHJlZmVyZW5jZSBzaGFkb3cgc2V0cyBjcmVhdGVkIGJ5IEdvb2dsZSdzIERlc2lnbmVycyBhbmQgaW50ZXJwb2xhdGluZ1xuLy8gYWxsIG9mIHRoZSB2YWx1ZXMgYmV0d2VlbiB0aGVtLlxuXG5AZnVuY3Rpb24gX2dldC11bWJyYS1tYXAoJGNvbG9yLCAkb3BhY2l0eSkge1xuICAkc2hhZG93LWNvbG9yOiBpZih0eXBlLW9mKCRjb2xvcikgPT0gY29sb3IsIHJnYmEoJGNvbG9yLCAkb3BhY2l0eSAqIDAuMiksICRjb2xvcik7XG5cbiAgQHJldHVybiAoXG4gICAgMDogJzBweCAwcHggMHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOiAnMHB4IDJweCAxcHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyOiAnMHB4IDNweCAxcHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAzOiAnMHB4IDNweCAzcHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA0OiAnMHB4IDJweCA0cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA1OiAnMHB4IDNweCA1cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA2OiAnMHB4IDNweCA1cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA3OiAnMHB4IDRweCA1cHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA4OiAnMHB4IDVweCA1cHggLTNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA5OiAnMHB4IDVweCA2cHggLTNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMDogJzBweCA2cHggNnB4IC0zcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTE6ICcwcHggNnB4IDdweCAtNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDEyOiAnMHB4IDdweCA4cHggLTRweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMzogJzBweCA3cHggOHB4IC00cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTQ6ICcwcHggN3B4IDlweCAtNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE1OiAnMHB4IDhweCA5cHggLTVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNjogJzBweCA4cHggMTBweCAtNXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE3OiAnMHB4IDhweCAxMXB4IC01cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTg6ICcwcHggOXB4IDExcHggLTVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOTogJzBweCA5cHggMTJweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIwOiAnMHB4IDEwcHggMTNweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIxOiAnMHB4IDEwcHggMTNweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIyOiAnMHB4IDEwcHggMTRweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIzOiAnMHB4IDExcHggMTRweCAtN3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI0OiAnMHB4IDExcHggMTVweCAtN3B4ICN7JHNoYWRvdy1jb2xvcn0nXG4gICk7XG59XG5cbkBmdW5jdGlvbiBfZ2V0LXBlbnVtYnJhLW1hcCgkY29sb3IsICRvcGFjaXR5KSB7XG4gICRzaGFkb3ctY29sb3I6IGlmKHR5cGUtb2YoJGNvbG9yKSA9PSBjb2xvciwgcmdiYSgkY29sb3IsICRvcGFjaXR5ICogMC4xNCksICRjb2xvcik7XG5cbiAgQHJldHVybiAoXG4gICAgMDogJzBweCAwcHggMHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOiAnMHB4IDFweCAxcHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI6ICcwcHggMnB4IDJweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMzogJzBweCAzcHggNHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA0OiAnMHB4IDRweCA1cHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDU6ICcwcHggNXB4IDhweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNjogJzBweCA2cHggMTBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNzogJzBweCA3cHggMTBweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgODogJzBweCA4cHggMTBweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgOTogJzBweCA5cHggMTJweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTA6ICcwcHggMTBweCAxNHB4IDFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMTogJzBweCAxMXB4IDE1cHggMXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDEyOiAnMHB4IDEycHggMTdweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTM6ICcwcHggMTNweCAxOXB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNDogJzBweCAxNHB4IDIxcHggMnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE1OiAnMHB4IDE1cHggMjJweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTY6ICcwcHggMTZweCAyNHB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNzogJzBweCAxN3B4IDI2cHggMnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE4OiAnMHB4IDE4cHggMjhweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTk6ICcwcHggMTlweCAyOXB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMDogJzBweCAyMHB4IDMxcHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIxOiAnMHB4IDIxcHggMzNweCAzcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMjI6ICcwcHggMjJweCAzNXB4IDNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMzogJzBweCAyM3B4IDM2cHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI0OiAnMHB4IDI0cHggMzhweCAzcHggI3skc2hhZG93LWNvbG9yfSdcbiAgKTtcbn1cblxuQGZ1bmN0aW9uIF9nZXQtYW1iaWVudC1tYXAoJGNvbG9yLCAkb3BhY2l0eSkge1xuICAkc2hhZG93LWNvbG9yOiBpZih0eXBlLW9mKCRjb2xvcikgPT0gY29sb3IsIHJnYmEoJGNvbG9yLCAkb3BhY2l0eSAqIDAuMTIpLCAkY29sb3IpO1xuXG4gIEByZXR1cm4gKFxuICAgIDA6ICcwcHggMHB4IDBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTogJzBweCAxcHggM3B4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyOiAnMHB4IDFweCA1cHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDM6ICcwcHggMXB4IDhweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNDogJzBweCAxcHggMTBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNTogJzBweCAxcHggMTRweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNjogJzBweCAxcHggMThweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNzogJzBweCAycHggMTZweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgODogJzBweCAzcHggMTRweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgOTogJzBweCAzcHggMTZweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTA6ICcwcHggNHB4IDE4cHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDExOiAnMHB4IDRweCAyMHB4IDNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMjogJzBweCA1cHggMjJweCA0cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTM6ICcwcHggNXB4IDI0cHggNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE0OiAnMHB4IDVweCAyNnB4IDRweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNTogJzBweCA2cHggMjhweCA1cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTY6ICcwcHggNnB4IDMwcHggNXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE3OiAnMHB4IDZweCAzMnB4IDVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxODogJzBweCA3cHggMzRweCA2cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTk6ICcwcHggN3B4IDM2cHggNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIwOiAnMHB4IDhweCAzOHB4IDdweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMTogJzBweCA4cHggNDBweCA3cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMjI6ICcwcHggOHB4IDQycHggN3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIzOiAnMHB4IDlweCA0NHB4IDhweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyNDogJzBweCA5cHggNDZweCA4cHggI3skc2hhZG93LWNvbG9yfSdcbiAgKTtcbn1cblxuLy8gVGhlIGRlZmF1bHQgZHVyYXRpb24gdmFsdWUgZm9yIGVsZXZhdGlvbiB0cmFuc2l0aW9ucy5cbiRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb246IDI4MG1zICFkZWZhdWx0O1xuXG4vLyBUaGUgZGVmYXVsdCBlYXNpbmcgdmFsdWUgZm9yIGVsZXZhdGlvbiB0cmFuc2l0aW9ucy5cbiRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkbWF0LWZhc3Qtb3V0LXNsb3ctaW4tdGltaW5nLWZ1bmN0aW9uO1xuXG4vLyBUaGUgZGVmYXVsdCBjb2xvciBmb3IgZWxldmF0aW9uIHNoYWRvd3MuXG4kbWF0LWVsZXZhdGlvbi1jb2xvcjogYmxhY2sgIWRlZmF1bHQ7XG5cbi8vIFRoZSBkZWZhdWx0IG9wYWNpdHkgc2NhbGluZyB2YWx1ZSBmb3IgZWxldmF0aW9uIHNoYWRvd3MuXG4kbWF0LWVsZXZhdGlvbi1vcGFjaXR5OiAxICFkZWZhdWx0O1xuXG4vLyBQcmVmaXggZm9yIGVsZXZhdGlvbi1yZWxhdGVkIHNlbGVjdG9ycy5cbiRfbWF0LWVsZXZhdGlvbi1wcmVmaXg6ICdtYXQtZWxldmF0aW9uLXonO1xuXG4vLyBBcHBsaWVzIHRoZSBjb3JyZWN0IGNzcyBydWxlcyB0byBhbiBlbGVtZW50IHRvIGdpdmUgaXQgdGhlIGVsZXZhdGlvbiBzcGVjaWZpZWQgYnkgJHpWYWx1ZS5cbi8vIFRoZSAkelZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNC5cbkBtaXhpbiBtYXQtZWxldmF0aW9uKCR6VmFsdWUsICRjb2xvcjogJG1hdC1lbGV2YXRpb24tY29sb3IsICRvcGFjaXR5OiAkbWF0LWVsZXZhdGlvbi1vcGFjaXR5KSB7XG4gIEBpZiB0eXBlLW9mKCR6VmFsdWUpICE9IG51bWJlciBvciBub3QgdW5pdGxlc3MoJHpWYWx1ZSkge1xuICAgIEBlcnJvciAnJHpWYWx1ZSBtdXN0IGJlIGEgdW5pdGxlc3MgbnVtYmVyJztcbiAgfVxuICBAaWYgJHpWYWx1ZSA8IDAgb3IgJHpWYWx1ZSA+IDI0IHtcbiAgICBAZXJyb3IgJyR6VmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI0JztcbiAgfVxuXG4gIGJveC1zaGFkb3c6ICN7bWFwLWdldChfZ2V0LXVtYnJhLW1hcCgkY29sb3IsICRvcGFjaXR5KSwgJHpWYWx1ZSl9LFxuICAgICAgICAgICAgICAje21hcC1nZXQoX2dldC1wZW51bWJyYS1tYXAoJGNvbG9yLCAkb3BhY2l0eSksICR6VmFsdWUpfSxcbiAgICAgICAgICAgICAgI3ttYXAtZ2V0KF9nZXQtYW1iaWVudC1tYXAoJGNvbG9yLCAkb3BhY2l0eSksICR6VmFsdWUpfTtcbn1cblxuQG1peGluIF9tYXQtdGhlbWUtZWxldmF0aW9uKCR6VmFsdWUsICR0aGVtZSwgJG9wYWNpdHk6ICRtYXQtZWxldmF0aW9uLW9wYWNpdHkpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGVsZXZhdGlvbi1jb2xvcjogbWFwLWdldCgkZm9yZWdyb3VuZCwgZWxldmF0aW9uKTtcbiAgJGVsZXZhdGlvbi1jb2xvci1vci1kZWZhdWx0OiBpZigkZWxldmF0aW9uLWNvbG9yID09IG51bGwsICRtYXQtZWxldmF0aW9uLWNvbG9yLCAkZWxldmF0aW9uLWNvbG9yKTtcblxuICBAaW5jbHVkZSBtYXQtZWxldmF0aW9uKCR6VmFsdWUsICRlbGV2YXRpb24tY29sb3Itb3ItZGVmYXVsdCwgJG9wYWNpdHkpO1xufVxuXG4vLyBBcHBsaWVzIHRoZSBlbGV2YXRpb24gdG8gYW4gZWxlbWVudCBpbiBhIG1hbm5lciB0aGF0IGFsbG93c1xuLy8gY29uc3VtZXJzIHRvIG92ZXJyaWRlIGl0IHZpYSB0aGUgTWF0ZXJpYWwgZWxldmF0aW9uIGNsYXNzZXMuXG5AbWl4aW4gbWF0LW92ZXJyaWRhYmxlLWVsZXZhdGlvbihcbiAgICAkelZhbHVlLFxuICAgICRjb2xvcjogJG1hdC1lbGV2YXRpb24tY29sb3IsXG4gICAgJG9wYWNpdHk6ICRtYXQtZWxldmF0aW9uLW9wYWNpdHkpIHtcbiAgJjpub3QoW2NsYXNzKj0nI3skX21hdC1lbGV2YXRpb24tcHJlZml4fSddKSB7XG4gICAgQGluY2x1ZGUgbWF0LWVsZXZhdGlvbigkelZhbHVlLCAkY29sb3IsICRvcGFjaXR5KTtcbiAgfVxufVxuXG5AbWl4aW4gX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oJHpWYWx1ZSwgJHRoZW1lLCAkb3BhY2l0eTogJG1hdC1lbGV2YXRpb24tb3BhY2l0eSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkZWxldmF0aW9uLWNvbG9yOiBtYXAtZ2V0KCRmb3JlZ3JvdW5kLCBlbGV2YXRpb24pO1xuICAkZWxldmF0aW9uLWNvbG9yLW9yLWRlZmF1bHQ6IGlmKCRlbGV2YXRpb24tY29sb3IgPT0gbnVsbCwgJG1hdC1lbGV2YXRpb24tY29sb3IsICRlbGV2YXRpb24tY29sb3IpO1xuXG4gIEBpbmNsdWRlIG1hdC1vdmVycmlkYWJsZS1lbGV2YXRpb24oJHpWYWx1ZSwgJGVsZXZhdGlvbi1jb2xvci1vci1kZWZhdWx0LCAkb3BhY2l0eSk7XG59XG5cbi8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgdHJhbnNpdGlvbiBwcm9wZXJ0eSBmb3IgZWxldmF0aW9uLlxuLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIGEgY29tcG9uZW50IG5lZWRzIHRvIHRyYW5zaXRpb25cbi8vIG1vcmUgdGhhbiBvbmUgcHJvcGVydHkuXG4vL1xuLy8gLmZvbyB7XG4vLyAgIHRyYW5zaXRpb246IG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi1wcm9wZXJ0eS12YWx1ZSgpLCBvcGFjaXR5IDEwMG1zIGVhc2U7XG4vLyB9XG5AZnVuY3Rpb24gbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXByb3BlcnR5LXZhbHVlKFxuICAgICRkdXJhdGlvbjogJG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi1kdXJhdGlvbixcbiAgICAkZWFzaW5nOiAkbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikge1xuICBAcmV0dXJuIGJveC1zaGFkb3cgI3skZHVyYXRpb259ICN7JGVhc2luZ307XG59XG5cbi8vIEFwcGxpZXMgdGhlIGNvcnJlY3QgY3NzIHJ1bGVzIG5lZWRlZCB0byBoYXZlIGFuIGVsZW1lbnQgdHJhbnNpdGlvbiBiZXR3ZWVuIGVsZXZhdGlvbnMuXG4vLyBUaGlzIG1peGluIHNob3VsZCBiZSBhcHBsaWVkIHRvIGVsZW1lbnRzIHdob3NlIGVsZXZhdGlvbiB2YWx1ZXMgd2lsbCBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZWlyXG4vLyBjb250ZXh0IChlLmcuIHdoZW4gYWN0aXZlIG9yIGRpc2FibGVkKS5cbi8vXG4vLyBOT1RFKHRyYXZpc2thdWZtYW4pOiBCb3RoIHRoaXMgbWl4aW4gYW5kIHRoZSBhYm92ZSBmdW5jdGlvbiB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzIHNvIHRoZXkgY2FuXG4vLyBiZSB1c2VkIGluIHRoZSBzYW1lIHdheSBieSBjbGllbnRzLlxuQG1peGluIG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbihcbiAgICAkZHVyYXRpb246ICRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb24sXG4gICAgJGVhc2luZzogJG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24pIHtcbiAgdHJhbnNpdGlvbjogbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXByb3BlcnR5LXZhbHVlKCRkdXJhdGlvbiwgJGVhc2luZyk7XG59XG5cbi8vIENvbG9yIHBhbGV0dGVzIGZyb20gdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLlxuLy8gU2VlIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduL2NvbG9yL1xuLy9cbi8vIENvbnRyYXN0IGNvbG9ycyBhcmUgaGFyZC1jb2RlZCBiZWNhdXNlIGl0IGlzIHRvbyBkaWZmaWN1bHQgKHByb2JhYmx5IGltcG9zc2libGUpIHRvXG4vLyBjYWxjdWxhdGUgdGhlbS4gVGhlc2UgY29udHJhc3QgY29sb3JzIGFyZSBwdWxsZWQgZnJvbSB0aGUgcHVibGljIE1hdGVyaWFsIERlc2lnbiBzcGVjIHN3YXRjaGVzLlxuLy8gV2hpbGUgdGhlIGNvbnRyYXN0IGNvbG9ycyBpbiB0aGUgc3BlYyBhcmUgbm90IHByZXNjcmlwdGl2ZSwgd2UgdXNlIHRoZW0gZm9yIGNvbnZlbmllbmNlLlxuXG5cbi8vIEBkZXByZWNhdGVkIHJlbmFtZWQgdG8gJGRhcmstcHJpbWFyeS10ZXh0LlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJGJsYWNrLTg3LW9wYWNpdHk6IHJnYmEoYmxhY2ssIDAuODcpO1xuLy8gQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byAkbGlnaHQtcHJpbWFyeS10ZXh0LlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJHdoaXRlLTg3LW9wYWNpdHk6IHJnYmEod2hpdGUsIDAuODcpO1xuLy8gQGRlcHJlY2F0ZWQgdXNlICRkYXJrLVtzZWNvbmRhcnktdGV4dCxkaXNhYmxlZC10ZXh0LGRpdmlkZXJzLGZvY3VzZWRdIGluc3RlYWQuXG4vLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wXG4kYmxhY2stMTItb3BhY2l0eTogcmdiYShibGFjaywgMC4xMik7XG4vLyBAZGVwcmVjYXRlZCB1c2UgJGxpZ2h0LVtzZWNvbmRhcnktdGV4dCxkaXNhYmxlZC10ZXh0LGRpdmlkZXJzLGZvY3VzZWRdIGluc3RlYWQuXG4vLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wXG4kd2hpdGUtMTItb3BhY2l0eTogcmdiYSh3aGl0ZSwgMC4xMik7XG4vLyBAZGVwcmVjYXRlZCB1c2UgJGRhcmstW3NlY29uZGFyeS10ZXh0LGRpc2FibGVkLXRleHQsZGl2aWRlcnMsZm9jdXNlZF0gaW5zdGVhZC5cbi8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjBcbiRibGFjay02LW9wYWNpdHk6IHJnYmEoYmxhY2ssIDAuMDYpO1xuLy8gQGRlcHJlY2F0ZWQgdXNlICRsaWdodC1bc2Vjb25kYXJ5LXRleHQsZGlzYWJsZWQtdGV4dCxkaXZpZGVycyxmb2N1c2VkXSBpbnN0ZWFkLlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJHdoaXRlLTYtb3BhY2l0eTogcmdiYSh3aGl0ZSwgMC4wNik7XG5cbiRkYXJrLXByaW1hcnktdGV4dDogcmdiYShibGFjaywgMC44Nyk7XG4kZGFyay1zZWNvbmRhcnktdGV4dDogcmdiYShibGFjaywgMC41NCk7XG4kZGFyay1kaXNhYmxlZC10ZXh0OiByZ2JhKGJsYWNrLCAwLjM4KTtcbiRkYXJrLWRpdmlkZXJzOiByZ2JhKGJsYWNrLCAwLjEyKTtcbiRkYXJrLWZvY3VzZWQ6IHJnYmEoYmxhY2ssIDAuMTIpO1xuJGxpZ2h0LXByaW1hcnktdGV4dDogd2hpdGU7XG4kbGlnaHQtc2Vjb25kYXJ5LXRleHQ6IHJnYmEod2hpdGUsIDAuNyk7XG4kbGlnaHQtZGlzYWJsZWQtdGV4dDogcmdiYSh3aGl0ZSwgMC41KTtcbiRsaWdodC1kaXZpZGVyczogcmdiYSh3aGl0ZSwgMC4xMik7XG4kbGlnaHQtZm9jdXNlZDogcmdiYSh3aGl0ZSwgMC4xMik7XG5cbiRtYXQtcmVkOiAoXG4gIDUwOiAjZmZlYmVlLFxuICAxMDA6ICNmZmNkZDIsXG4gIDIwMDogI2VmOWE5YSxcbiAgMzAwOiAjZTU3MzczLFxuICA0MDA6ICNlZjUzNTAsXG4gIDUwMDogI2Y0NDMzNixcbiAgNjAwOiAjZTUzOTM1LFxuICA3MDA6ICNkMzJmMmYsXG4gIDgwMDogI2M2MjgyOCxcbiAgOTAwOiAjYjcxYzFjLFxuICBBMTAwOiAjZmY4YTgwLFxuICBBMjAwOiAjZmY1MjUyLFxuICBBNDAwOiAjZmYxNzQ0LFxuICBBNzAwOiAjZDUwMDAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtcGluazogKFxuICA1MDogI2ZjZTRlYyxcbiAgMTAwOiAjZjhiYmQwLFxuICAyMDA6ICNmNDhmYjEsXG4gIDMwMDogI2YwNjI5MixcbiAgNDAwOiAjZWM0MDdhLFxuICA1MDA6ICNlOTFlNjMsXG4gIDYwMDogI2Q4MWI2MCxcbiAgNzAwOiAjYzIxODViLFxuICA4MDA6ICNhZDE0NTcsXG4gIDkwMDogIzg4MGU0ZixcbiAgQTEwMDogI2ZmODBhYixcbiAgQTIwMDogI2ZmNDA4MSxcbiAgQTQwMDogI2Y1MDA1NyxcbiAgQTcwMDogI2M1MTE2MixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LXB1cnBsZTogKFxuICA1MDogI2YzZTVmNSxcbiAgMTAwOiAjZTFiZWU3LFxuICAyMDA6ICNjZTkzZDgsXG4gIDMwMDogI2JhNjhjOCxcbiAgNDAwOiAjYWI0N2JjLFxuICA1MDA6ICM5YzI3YjAsXG4gIDYwMDogIzhlMjRhYSxcbiAgNzAwOiAjN2IxZmEyLFxuICA4MDA6ICM2YTFiOWEsXG4gIDkwMDogIzRhMTQ4YyxcbiAgQTEwMDogI2VhODBmYyxcbiAgQTIwMDogI2UwNDBmYixcbiAgQTQwMDogI2Q1MDBmOSxcbiAgQTcwMDogI2FhMDBmZixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtZGVlcC1wdXJwbGU6IChcbiAgNTA6ICNlZGU3ZjYsXG4gIDEwMDogI2QxYzRlOSxcbiAgMjAwOiAjYjM5ZGRiLFxuICAzMDA6ICM5NTc1Y2QsXG4gIDQwMDogIzdlNTdjMixcbiAgNTAwOiAjNjczYWI3LFxuICA2MDA6ICM1ZTM1YjEsXG4gIDcwMDogIzUxMmRhOCxcbiAgODAwOiAjNDUyN2EwLFxuICA5MDA6ICMzMTFiOTIsXG4gIEExMDA6ICNiMzg4ZmYsXG4gIEEyMDA6ICM3YzRkZmYsXG4gIEE0MDA6ICM2NTFmZmYsXG4gIEE3MDA6ICM2MjAwZWEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWluZGlnbzogKFxuICA1MDogI2U4ZWFmNixcbiAgMTAwOiAjYzVjYWU5LFxuICAyMDA6ICM5ZmE4ZGEsXG4gIDMwMDogIzc5ODZjYixcbiAgNDAwOiAjNWM2YmMwLFxuICA1MDA6ICMzZjUxYjUsXG4gIDYwMDogIzM5NDlhYixcbiAgNzAwOiAjMzAzZjlmLFxuICA4MDA6ICMyODM1OTMsXG4gIDkwMDogIzFhMjM3ZSxcbiAgQTEwMDogIzhjOWVmZixcbiAgQTIwMDogIzUzNmRmZSxcbiAgQTQwMDogIzNkNWFmZSxcbiAgQTcwMDogIzMwNGZmZSxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtYmx1ZTogKFxuICA1MDogI2UzZjJmZCxcbiAgMTAwOiAjYmJkZWZiLFxuICAyMDA6ICM5MGNhZjksXG4gIDMwMDogIzY0YjVmNixcbiAgNDAwOiAjNDJhNWY1LFxuICA1MDA6ICMyMTk2ZjMsXG4gIDYwMDogIzFlODhlNSxcbiAgNzAwOiAjMTk3NmQyLFxuICA4MDA6ICMxNTY1YzAsXG4gIDkwMDogIzBkNDdhMSxcbiAgQTEwMDogIzgyYjFmZixcbiAgQTIwMDogIzQ0OGFmZixcbiAgQTQwMDogIzI5NzlmZixcbiAgQTcwMDogIzI5NjJmZixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWxpZ2h0LWJsdWU6IChcbiAgNTA6ICNlMWY1ZmUsXG4gIDEwMDogI2IzZTVmYyxcbiAgMjAwOiAjODFkNGZhLFxuICAzMDA6ICM0ZmMzZjcsXG4gIDQwMDogIzI5YjZmNixcbiAgNTAwOiAjMDNhOWY0LFxuICA2MDA6ICMwMzliZTUsXG4gIDcwMDogIzAyODhkMSxcbiAgODAwOiAjMDI3N2JkLFxuICA5MDA6ICMwMTU3OWIsXG4gIEExMDA6ICM4MGQ4ZmYsXG4gIEEyMDA6ICM0MGM0ZmYsXG4gIEE0MDA6ICMwMGIwZmYsXG4gIEE3MDA6ICMwMDkxZWEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtY3lhbjogKFxuICA1MDogI2UwZjdmYSxcbiAgMTAwOiAjYjJlYmYyLFxuICAyMDA6ICM4MGRlZWEsXG4gIDMwMDogIzRkZDBlMSxcbiAgNDAwOiAjMjZjNmRhLFxuICA1MDA6ICMwMGJjZDQsXG4gIDYwMDogIzAwYWNjMSxcbiAgNzAwOiAjMDA5N2E3LFxuICA4MDA6ICMwMDgzOGYsXG4gIDkwMDogIzAwNjA2NCxcbiAgQTEwMDogIzg0ZmZmZixcbiAgQTIwMDogIzE4ZmZmZixcbiAgQTQwMDogIzAwZTVmZixcbiAgQTcwMDogIzAwYjhkNCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LXRlYWw6IChcbiAgNTA6ICNlMGYyZjEsXG4gIDEwMDogI2IyZGZkYixcbiAgMjAwOiAjODBjYmM0LFxuICAzMDA6ICM0ZGI2YWMsXG4gIDQwMDogIzI2YTY5YSxcbiAgNTAwOiAjMDA5Njg4LFxuICA2MDA6ICMwMDg5N2IsXG4gIDcwMDogIzAwNzk2YixcbiAgODAwOiAjMDA2OTVjLFxuICA5MDA6ICMwMDRkNDAsXG4gIEExMDA6ICNhN2ZmZWIsXG4gIEEyMDA6ICM2NGZmZGEsXG4gIEE0MDA6ICMxZGU5YjYsXG4gIEE3MDA6ICMwMGJmYTUsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgKVxuKTtcblxuJG1hdC1ncmVlbjogKFxuICA1MDogI2U4ZjVlOSxcbiAgMTAwOiAjYzhlNmM5LFxuICAyMDA6ICNhNWQ2YTcsXG4gIDMwMDogIzgxYzc4NCxcbiAgNDAwOiAjNjZiYjZhLFxuICA1MDA6ICM0Y2FmNTAsXG4gIDYwMDogIzQzYTA0NyxcbiAgNzAwOiAjMzg4ZTNjLFxuICA4MDA6ICMyZTdkMzIsXG4gIDkwMDogIzFiNWUyMCxcbiAgQTEwMDogI2I5ZjZjYSxcbiAgQTIwMDogIzY5ZjBhZSxcbiAgQTQwMDogIzAwZTY3NixcbiAgQTcwMDogIzAwYzg1MyxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtbGlnaHQtZ3JlZW46IChcbiAgNTA6ICNmMWY4ZTksXG4gIDEwMDogI2RjZWRjOCxcbiAgMjAwOiAjYzVlMWE1LFxuICAzMDA6ICNhZWQ1ODEsXG4gIDQwMDogIzljY2M2NSxcbiAgNTAwOiAjOGJjMzRhLFxuICA2MDA6ICM3Y2IzNDIsXG4gIDcwMDogIzY4OWYzOCxcbiAgODAwOiAjNTU4YjJmLFxuICA5MDA6ICMzMzY5MWUsXG4gIEExMDA6ICNjY2ZmOTAsXG4gIEEyMDA6ICNiMmZmNTksXG4gIEE0MDA6ICM3NmZmMDMsXG4gIEE3MDA6ICM2NGRkMTcsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtbGltZTogKFxuICA1MDogI2Y5ZmJlNyxcbiAgMTAwOiAjZjBmNGMzLFxuICAyMDA6ICNlNmVlOWMsXG4gIDMwMDogI2RjZTc3NSxcbiAgNDAwOiAjZDRlMTU3LFxuICA1MDA6ICNjZGRjMzksXG4gIDYwMDogI2MwY2EzMyxcbiAgNzAwOiAjYWZiNDJiLFxuICA4MDA6ICM5ZTlkMjQsXG4gIDkwMDogIzgyNzcxNyxcbiAgQTEwMDogI2Y0ZmY4MSxcbiAgQTIwMDogI2VlZmY0MSxcbiAgQTQwMDogI2M2ZmYwMCxcbiAgQTcwMDogI2FlZWEwMCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQteWVsbG93OiAoXG4gIDUwOiAjZmZmZGU3LFxuICAxMDA6ICNmZmY5YzQsXG4gIDIwMDogI2ZmZjU5ZCxcbiAgMzAwOiAjZmZmMTc2LFxuICA0MDA6ICNmZmVlNTgsXG4gIDUwMDogI2ZmZWIzYixcbiAgNjAwOiAjZmRkODM1LFxuICA3MDA6ICNmYmMwMmQsXG4gIDgwMDogI2Y5YTgyNSxcbiAgOTAwOiAjZjU3ZjE3LFxuICBBMTAwOiAjZmZmZjhkLFxuICBBMjAwOiAjZmZmZjAwLFxuICBBNDAwOiAjZmZlYTAwLFxuICBBNzAwOiAjZmZkNjAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWFtYmVyOiAoXG4gIDUwOiAjZmZmOGUxLFxuICAxMDA6ICNmZmVjYjMsXG4gIDIwMDogI2ZmZTA4MixcbiAgMzAwOiAjZmZkNTRmLFxuICA0MDA6ICNmZmNhMjgsXG4gIDUwMDogI2ZmYzEwNyxcbiAgNjAwOiAjZmZiMzAwLFxuICA3MDA6ICNmZmEwMDAsXG4gIDgwMDogI2ZmOGYwMCxcbiAgOTAwOiAjZmY2ZjAwLFxuICBBMTAwOiAjZmZlNTdmLFxuICBBMjAwOiAjZmZkNzQwLFxuICBBNDAwOiAjZmZjNDAwLFxuICBBNzAwOiAjZmZhYjAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LW9yYW5nZTogKFxuICA1MDogI2ZmZjNlMCxcbiAgMTAwOiAjZmZlMGIyLFxuICAyMDA6ICNmZmNjODAsXG4gIDMwMDogI2ZmYjc0ZCxcbiAgNDAwOiAjZmZhNzI2LFxuICA1MDA6ICNmZjk4MDAsXG4gIDYwMDogI2ZiOGMwMCxcbiAgNzAwOiAjZjU3YzAwLFxuICA4MDA6ICNlZjZjMDAsXG4gIDkwMDogI2U2NTEwMCxcbiAgQTEwMDogI2ZmZDE4MCxcbiAgQTIwMDogI2ZmYWI0MCxcbiAgQTQwMDogI2ZmOTEwMCxcbiAgQTcwMDogI2ZmNmQwMCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogYmxhY2ssXG4gIClcbik7XG5cbiRtYXQtZGVlcC1vcmFuZ2U6IChcbiAgNTA6ICNmYmU5ZTcsXG4gIDEwMDogI2ZmY2NiYyxcbiAgMjAwOiAjZmZhYjkxLFxuICAzMDA6ICNmZjhhNjUsXG4gIDQwMDogI2ZmNzA0MyxcbiAgNTAwOiAjZmY1NzIyLFxuICA2MDA6ICNmNDUxMWUsXG4gIDcwMDogI2U2NGExOSxcbiAgODAwOiAjZDg0MzE1LFxuICA5MDA6ICNiZjM2MGMsXG4gIEExMDA6ICNmZjllODAsXG4gIEEyMDA6ICNmZjZlNDAsXG4gIEE0MDA6ICNmZjNkMDAsXG4gIEE3MDA6ICNkZDJjMDAsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWJyb3duOiAoXG4gIDUwOiAjZWZlYmU5LFxuICAxMDA6ICNkN2NjYzgsXG4gIDIwMDogI2JjYWFhNCxcbiAgMzAwOiAjYTE4ODdmLFxuICA0MDA6ICM4ZDZlNjMsXG4gIDUwMDogIzc5NTU0OCxcbiAgNjAwOiAjNmQ0YzQxLFxuICA3MDA6ICM1ZDQwMzcsXG4gIDgwMDogIzRlMzQyZSxcbiAgOTAwOiAjM2UyNzIzLFxuICBBMTAwOiAjZDdjY2M4LFxuICBBMjAwOiAjYmNhYWE0LFxuICBBNDAwOiAjOGQ2ZTYzLFxuICBBNzAwOiAjNWQ0MDM3LFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWdyZXk6IChcbiAgNTA6ICNmYWZhZmEsXG4gIDEwMDogI2Y1ZjVmNSxcbiAgMjAwOiAjZWVlZWVlLFxuICAzMDA6ICNlMGUwZTAsXG4gIDQwMDogI2JkYmRiZCxcbiAgNTAwOiAjOWU5ZTllLFxuICA2MDA6ICM3NTc1NzUsXG4gIDcwMDogIzYxNjE2MSxcbiAgODAwOiAjNDI0MjQyLFxuICA5MDA6ICMyMTIxMjEsXG4gIEExMDA6ICNmZmZmZmYsXG4gIEEyMDA6ICNlZWVlZWUsXG4gIEE0MDA6ICNiZGJkYmQsXG4gIEE3MDA6ICM2MTYxNjEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgKVxuKTtcblxuLy8gQWxpYXMgZm9yIGFsdGVybmF0ZSBzcGVsbGluZy5cbiRtYXQtZ3JheTogJG1hdC1ncmV5O1xuXG4kbWF0LWJsdWUtZ3JleTogKFxuICA1MDogI2VjZWZmMSxcbiAgMTAwOiAjY2ZkOGRjLFxuICAyMDA6ICNiMGJlYzUsXG4gIDMwMDogIzkwYTRhZSxcbiAgNDAwOiAjNzg5MDljLFxuICA1MDA6ICM2MDdkOGIsXG4gIDYwMDogIzU0NmU3YSxcbiAgNzAwOiAjNDU1YTY0LFxuICA4MDA6ICMzNzQ3NGYsXG4gIDkwMDogIzI2MzIzOCxcbiAgQTEwMDogI2NmZDhkYyxcbiAgQTIwMDogI2IwYmVjNSxcbiAgQTQwMDogIzc4OTA5YyxcbiAgQTcwMDogIzQ1NWE2NCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4vLyBBbGlhcyBmb3IgYWx0ZXJuYXRlIHNwZWxsaW5nLlxuJG1hdC1ibHVlLWdyYXk6ICRtYXQtYmx1ZS1ncmV5O1xuXG5cbi8vIEJhY2tncm91bmQgcGFsZXR0ZSBmb3IgbGlnaHQgdGhlbWVzLlxuJG1hdC1saWdodC10aGVtZS1iYWNrZ3JvdW5kOiAoXG4gIHN0YXR1cy1iYXI6IG1hcF9nZXQoJG1hdC1ncmV5LCAzMDApLFxuICBhcHAtYmFyOiAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgMTAwKSxcbiAgYmFja2dyb3VuZDogbWFwX2dldCgkbWF0LWdyZXksIDUwKSxcbiAgaG92ZXI6ICAgICAgcmdiYShibGFjaywgMC4wNCksIC8vIFRPRE8oa2FyYSk6IGNoZWNrIHN0eWxlIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYXG4gIGNhcmQ6ICAgICAgIHdoaXRlLFxuICBkaWFsb2c6ICAgICB3aGl0ZSxcbiAgZGlzYWJsZWQtYnV0dG9uOiByZ2JhKGJsYWNrLCAwLjEyKSxcbiAgcmFpc2VkLWJ1dHRvbjogd2hpdGUsXG4gIGZvY3VzZWQtYnV0dG9uOiAkZGFyay1mb2N1c2VkLFxuICBzZWxlY3RlZC1idXR0b246IG1hcF9nZXQoJG1hdC1ncmV5LCAzMDApLFxuICBzZWxlY3RlZC1kaXNhYmxlZC1idXR0b246IG1hcF9nZXQoJG1hdC1ncmV5LCA0MDApLFxuICBkaXNhYmxlZC1idXR0b24tdG9nZ2xlOiBtYXBfZ2V0KCRtYXQtZ3JleSwgMjAwKSxcbiAgdW5zZWxlY3RlZC1jaGlwOiBtYXBfZ2V0KCRtYXQtZ3JleSwgMzAwKSxcbiAgZGlzYWJsZWQtbGlzdC1vcHRpb246IG1hcF9nZXQoJG1hdC1ncmV5LCAyMDApLFxuKTtcblxuLy8gQmFja2dyb3VuZCBwYWxldHRlIGZvciBkYXJrIHRoZW1lcy5cbiRtYXQtZGFyay10aGVtZS1iYWNrZ3JvdW5kOiAoXG4gIHN0YXR1cy1iYXI6IGJsYWNrLFxuICBhcHAtYmFyOiAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgOTAwKSxcbiAgYmFja2dyb3VuZDogIzMwMzAzMCxcbiAgaG92ZXI6ICAgICAgcmdiYSh3aGl0ZSwgMC4wNCksIC8vIFRPRE8oa2FyYSk6IGNoZWNrIHN0eWxlIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYXG4gIGNhcmQ6ICAgICAgIG1hcF9nZXQoJG1hdC1ncmV5LCA4MDApLFxuICBkaWFsb2c6ICAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgODAwKSxcbiAgZGlzYWJsZWQtYnV0dG9uOiByZ2JhKHdoaXRlLCAwLjEyKSxcbiAgcmFpc2VkLWJ1dHRvbjogbWFwLWdldCgkbWF0LWdyZXksIDgwMCksXG4gIGZvY3VzZWQtYnV0dG9uOiAkbGlnaHQtZm9jdXNlZCxcbiAgc2VsZWN0ZWQtYnV0dG9uOiBtYXBfZ2V0KCRtYXQtZ3JleSwgOTAwKSxcbiAgc2VsZWN0ZWQtZGlzYWJsZWQtYnV0dG9uOiBtYXBfZ2V0KCRtYXQtZ3JleSwgODAwKSxcbiAgZGlzYWJsZWQtYnV0dG9uLXRvZ2dsZTogYmxhY2ssXG4gIHVuc2VsZWN0ZWQtY2hpcDogbWFwX2dldCgkbWF0LWdyZXksIDcwMCksXG4gIGRpc2FibGVkLWxpc3Qtb3B0aW9uOiBibGFjayxcbik7XG5cbi8vIEZvcmVncm91bmQgcGFsZXR0ZSBmb3IgbGlnaHQgdGhlbWVzLlxuJG1hdC1saWdodC10aGVtZS1mb3JlZ3JvdW5kOiAoXG4gIGJhc2U6ICAgICAgICAgICAgICBibGFjayxcbiAgZGl2aWRlcjogICAgICAgICAgICRkYXJrLWRpdmlkZXJzLFxuICBkaXZpZGVyczogICAgICAgICAgJGRhcmstZGl2aWRlcnMsXG4gIGRpc2FibGVkOiAgICAgICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBkaXNhYmxlZC1idXR0b246ICAgcmdiYShibGFjaywgMC4yNiksXG4gIGRpc2FibGVkLXRleHQ6ICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBlbGV2YXRpb246ICAgICAgICAgYmxhY2ssXG4gIGhpbnQtdGV4dDogICAgICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBzZWNvbmRhcnktdGV4dDogICAgJGRhcmstc2Vjb25kYXJ5LXRleHQsXG4gIGljb246ICAgICAgICAgICAgICByZ2JhKGJsYWNrLCAwLjU0KSxcbiAgaWNvbnM6ICAgICAgICAgICAgIHJnYmEoYmxhY2ssIDAuNTQpLFxuICB0ZXh0OiAgICAgICAgICAgICAgcmdiYShibGFjaywgMC44NyksXG4gIHNsaWRlci1taW46ICAgICAgICByZ2JhKGJsYWNrLCAwLjg3KSxcbiAgc2xpZGVyLW9mZjogICAgICAgIHJnYmEoYmxhY2ssIDAuMjYpLFxuICBzbGlkZXItb2ZmLWFjdGl2ZTogcmdiYShibGFjaywgMC4zOCksXG4pO1xuXG4vLyBGb3JlZ3JvdW5kIHBhbGV0dGUgZm9yIGRhcmsgdGhlbWVzLlxuJG1hdC1kYXJrLXRoZW1lLWZvcmVncm91bmQ6IChcbiAgYmFzZTogICAgICAgICAgICAgIHdoaXRlLFxuICBkaXZpZGVyOiAgICAgICAgICAgJGxpZ2h0LWRpdmlkZXJzLFxuICBkaXZpZGVyczogICAgICAgICAgJGxpZ2h0LWRpdmlkZXJzLFxuICBkaXNhYmxlZDogICAgICAgICAgJGxpZ2h0LWRpc2FibGVkLXRleHQsXG4gIGRpc2FibGVkLWJ1dHRvbjogICByZ2JhKHdoaXRlLCAwLjMpLFxuICBkaXNhYmxlZC10ZXh0OiAgICAgJGxpZ2h0LWRpc2FibGVkLXRleHQsXG4gIGVsZXZhdGlvbjogICAgICAgICBibGFjayxcbiAgaGludC10ZXh0OiAgICAgICAgICRsaWdodC1kaXNhYmxlZC10ZXh0LFxuICBzZWNvbmRhcnktdGV4dDogICAgJGxpZ2h0LXNlY29uZGFyeS10ZXh0LFxuICBpY29uOiAgICAgICAgICAgICAgd2hpdGUsXG4gIGljb25zOiAgICAgICAgICAgICB3aGl0ZSxcbiAgdGV4dDogICAgICAgICAgICAgIHdoaXRlLFxuICBzbGlkZXItbWluOiAgICAgICAgd2hpdGUsXG4gIHNsaWRlci1vZmY6ICAgICAgICByZ2JhKHdoaXRlLCAwLjMpLFxuICBzbGlkZXItb2ZmLWFjdGl2ZTogcmdiYSh3aGl0ZSwgMC4zKSxcbik7XG5cblxuXG4vLyBGb3IgYSBnaXZlbiBodWUgaW4gYSBwYWxldHRlLCByZXR1cm4gdGhlIGNvbnRyYXN0IGNvbG9yIGZyb20gdGhlIG1hcCBvZiBjb250cmFzdCBwYWxldHRlcy5cbi8vIEBwYXJhbSAkY29sb3ItbWFwXG4vLyBAcGFyYW0gJGh1ZVxuQGZ1bmN0aW9uIG1hdC1jb250cmFzdCgkcGFsZXR0ZSwgJGh1ZSkge1xuICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkcGFsZXR0ZSwgY29udHJhc3QpLCAkaHVlKTtcbn1cblxuXG4vLyBDcmVhdGVzIGEgbWFwIG9mIGh1ZXMgdG8gY29sb3JzIGZvciBhIHRoZW1lLiBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIGEgdGhlbWUgcGFsZXR0ZSBpbiB0ZXJtc1xuLy8gb2YgdGhlIE1hdGVyaWFsIERlc2lnbiBodWVzLlxuLy8gQHBhcmFtICRjb2xvci1tYXBcbi8vIEBwYXJhbSAkcHJpbWFyeVxuLy8gQHBhcmFtICRsaWdodGVyXG5AZnVuY3Rpb24gbWF0LXBhbGV0dGUoJGJhc2UtcGFsZXR0ZSwgJGRlZmF1bHQ6IDUwMCwgJGxpZ2h0ZXI6IDEwMCwgJGRhcmtlcjogNzAwKSB7XG4gICRyZXN1bHQ6IG1hcF9tZXJnZSgkYmFzZS1wYWxldHRlLCAoXG4gICAgZGVmYXVsdDogbWFwLWdldCgkYmFzZS1wYWxldHRlLCAkZGVmYXVsdCksXG4gICAgbGlnaHRlcjogbWFwLWdldCgkYmFzZS1wYWxldHRlLCAkbGlnaHRlciksXG4gICAgZGFya2VyOiBtYXAtZ2V0KCRiYXNlLXBhbGV0dGUsICRkYXJrZXIpLFxuXG4gICAgZGVmYXVsdC1jb250cmFzdDogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRkZWZhdWx0KSxcbiAgICBsaWdodGVyLWNvbnRyYXN0OiBtYXQtY29udHJhc3QoJGJhc2UtcGFsZXR0ZSwgJGxpZ2h0ZXIpLFxuICAgIGRhcmtlci1jb250cmFzdDogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRkYXJrZXIpXG4gICkpO1xuXG4gIC8vIEZvciBlYWNoIGh1ZSBpbiB0aGUgcGFsZXR0ZSwgYWRkIGEgXCItY29udHJhc3RcIiBjb2xvciB0byB0aGUgbWFwLlxuICBAZWFjaCAkaHVlLCAkY29sb3IgaW4gJGJhc2UtcGFsZXR0ZSB7XG4gICAgJHJlc3VsdDogbWFwX21lcmdlKCRyZXN1bHQsIChcbiAgICAgICcjeyRodWV9LWNvbnRyYXN0JzogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRodWUpXG4gICAgKSk7XG4gIH1cblxuICBAcmV0dXJuICRyZXN1bHQ7XG59XG5cblxuLy8gR2V0cyBhIGNvbG9yIGZyb20gYSB0aGVtZSBwYWxldHRlICh0aGUgb3V0cHV0IG9mIG1hdC1wYWxldHRlKS5cbi8vIFRoZSBodWUgY2FuIGJlIG9uZSBvZiB0aGUgc3RhbmRhcmQgdmFsdWVzICg1MDAsIEE0MDAsIGV0Yy4pLCBvbmUgb2YgdGhlIHRocmVlIHByZWNvbmZpZ3VyZWRcbi8vIGh1ZXMgKGRlZmF1bHQsIGxpZ2h0ZXIsIGRhcmtlciksIG9yIGFueSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgcHJlZml4ZWQgd2l0aCBcIi1jb250cmFzdFwiLlxuLy9cbi8vIEBwYXJhbSAkY29sb3ItbWFwIFRoZSB0aGVtZSBwYWxldHRlIChvdXRwdXQgb2YgbWF0LXBhbGV0dGUpLlxuLy8gQHBhcmFtICRodWUgVGhlIGh1ZSBmcm9tIHRoZSBwYWxldHRlIHRvIHVzZS4gSWYgdGhpcyBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgaXQgd2lsbFxuLy8gICAgIGJlIHRyZWF0ZWQgYXMgb3BhY2l0eS5cbi8vIEBwYXJhbSAkb3BhY2l0eSBUaGUgYWxwaGEgY2hhbm5lbCB2YWx1ZSBmb3IgdGhlIGNvbG9yLlxuQGZ1bmN0aW9uIG1hdC1jb2xvcigkcGFsZXR0ZSwgJGh1ZTogZGVmYXVsdCwgJG9wYWNpdHk6IG51bGwpIHtcbiAgLy8gSWYgaHVlS2V5IGlzIGEgbnVtYmVyIGJldHdlZW4gemVybyBhbmQgb25lLCB0aGVuIGl0IGFjdHVhbGx5IGNvbnRhaW5zIGFuXG4gIC8vIG9wYWNpdHkgdmFsdWUsIHNvIHJlY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGRlZmF1bHQgaHVlIGFuZCB0aGF0IGdpdmVuIG9wYWNpdHkuXG4gIEBpZiB0eXBlLW9mKCRodWUpID09IG51bWJlciBhbmQgJGh1ZSA+PSAwIGFuZCAkaHVlIDw9IDEge1xuICAgIEByZXR1cm4gbWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LCAkaHVlKTtcbiAgfVxuXG4gICRjb2xvcjogbWFwLWdldCgkcGFsZXR0ZSwgJGh1ZSk7XG5cbiAgQGlmICh0eXBlLW9mKCRjb2xvcikgIT0gY29sb3IpIHtcbiAgICAvLyBJZiB0aGUgJGNvbG9yIHJlc29sdmVkIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSBhIGNvbG9yIChlLmcuIGEgQ1NTIHZhcmlhYmxlKSxcbiAgICAvLyB3ZSBjYW4ndCBhcHBseSB0aGUgb3BhY2l0eSBhbnl3YXkgc28gd2UgcmV0dXJuIHRoZSB2YWx1ZSBhcyBpcywgb3RoZXJ3aXNlIFNhc3MgY2FuXG4gICAgLy8gdGhyb3cgYW4gZXJyb3Igb3Igb3V0cHV0IHNvbWV0aGluZyBpbnZhbGlkLlxuICAgIEByZXR1cm4gJGNvbG9yO1xuICB9XG5cbiAgQHJldHVybiByZ2JhKCRjb2xvciwgaWYoJG9wYWNpdHkgPT0gbnVsbCwgb3BhY2l0eSgkY29sb3IpLCAkb3BhY2l0eSkpO1xufVxuXG5cbi8vIENyZWF0ZXMgYSBjb250YWluZXIgb2JqZWN0IGZvciBhIGxpZ2h0IHRoZW1lIHRvIGJlIGdpdmVuIHRvIGluZGl2aWR1YWwgY29tcG9uZW50IHRoZW1lIG1peGlucy5cbkBmdW5jdGlvbiBtYXQtbGlnaHQtdGhlbWUoJHByaW1hcnksICRhY2NlbnQsICR3YXJuOiBtYXQtcGFsZXR0ZSgkbWF0LXJlZCkpIHtcbiAgQHJldHVybiAoXG4gICAgcHJpbWFyeTogJHByaW1hcnksXG4gICAgYWNjZW50OiAkYWNjZW50LFxuICAgIHdhcm46ICR3YXJuLFxuICAgIGlzLWRhcms6IGZhbHNlLFxuICAgIGZvcmVncm91bmQ6ICRtYXQtbGlnaHQtdGhlbWUtZm9yZWdyb3VuZCxcbiAgICBiYWNrZ3JvdW5kOiAkbWF0LWxpZ2h0LXRoZW1lLWJhY2tncm91bmQsXG4gICk7XG59XG5cblxuLy8gQ3JlYXRlcyBhIGNvbnRhaW5lciBvYmplY3QgZm9yIGEgZGFyayB0aGVtZSB0byBiZSBnaXZlbiB0byBpbmRpdmlkdWFsIGNvbXBvbmVudCB0aGVtZSBtaXhpbnMuXG5AZnVuY3Rpb24gbWF0LWRhcmstdGhlbWUoJHByaW1hcnksICRhY2NlbnQsICR3YXJuOiBtYXQtcGFsZXR0ZSgkbWF0LXJlZCkpIHtcbiAgQHJldHVybiAoXG4gICAgcHJpbWFyeTogJHByaW1hcnksXG4gICAgYWNjZW50OiAkYWNjZW50LFxuICAgIHdhcm46ICR3YXJuLFxuICAgIGlzLWRhcms6IHRydWUsXG4gICAgZm9yZWdyb3VuZDogJG1hdC1kYXJrLXRoZW1lLWZvcmVncm91bmQsXG4gICAgYmFja2dyb3VuZDogJG1hdC1kYXJrLXRoZW1lLWJhY2tncm91bmQsXG4gICk7XG59XG5cblxuXG4kbWF0LXJpcHBsZS1jb2xvci1vcGFjaXR5OiAwLjE7XG5cbkBtaXhpbiBtYXQtcmlwcGxlKCkge1xuXG4gIC8vIFRoZSBob3N0IGVsZW1lbnQgb2YgYW4gbWF0LXJpcHBsZSBkaXJlY3RpdmUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgcG9zaXRpb24gb2YgXCJhYnNvbHV0ZVwiIG9yXG4gIC8vIFwicmVsYXRpdmVcIiBzbyB0aGF0IHRoZSByaXBwbGVzIGluc2lkZSBhcmUgY29ycmVjdGx5IHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGUgY29udGFpbmVyLlxuICAubWF0LXJpcHBsZSB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAgIC8vIEJ5IGRlZmF1bHQsIGV2ZXJ5IHJpcHBsZSBjb250YWluZXIgc2hvdWxkIGhhdmUgcG9zaXRpb246IHJlbGF0aXZlIGluIGZhdm9yIG9mIGNyZWF0aW5nIGFuXG4gICAgLy8gZWFzeSBBUEkgZm9yIGRldmVsb3BlcnMgdXNpbmcgdGhlIE1hdFJpcHBsZSBkaXJlY3RpdmUuXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5cbiAgLm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWQge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG5cbiAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgIHRyYW5zaXRpb246IG9wYWNpdHksIHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcblxuICAgIC8vIEluIGhpZ2ggY29udHJhc3QgbW9kZSB0aGUgcmlwcGxlIGlzIG9wYXF1ZSwgY2F1c2luZyBpdCB0byBvYnN0cnVjdCB0aGUgY29udGVudC5cbiAgICBAaW5jbHVkZSBjZGstaGlnaC1jb250cmFzdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBUaGVtZSBmb3IgdGhlIHJpcHBsZSBlbGVtZW50cy4qL1xuQG1peGluIG1hdC1yaXBwbGUtdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXBfZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRmb3JlZ3JvdW5kLWJhc2U6IG1hcF9nZXQoJGZvcmVncm91bmQsIGJhc2UpO1xuXG4gIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIC8vIElmIHRoZSByaXBwbGUgY29sb3IgaXMgcmVzb2x2ZXMgdG8gYSBjb2xvciAqdHlwZSosIHdlIGNhbiB1c2UgaXQgZGlyZWN0bHksIG90aGVyd2lzZVxuICAgIC8vIChlLmcuIGl0IHJlc29sdmVzIHRvIGEgQ1NTIHZhcmlhYmxlKSB3ZSBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIGNvbG9yIGFuZCBzZXR0aW5nIGFuIG9wYWNpdHkuXG4gICAgQGlmICh0eXBlLW9mKCRmb3JlZ3JvdW5kLWJhc2UpID09IGNvbG9yKSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRmb3JlZ3JvdW5kLWJhc2UsICRtYXQtcmlwcGxlLWNvbG9yLW9wYWNpdHkpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZm9yZWdyb3VuZC1iYXNlO1xuICAgICAgb3BhY2l0eTogJG1hdC1yaXBwbGUtY29sb3Itb3BhY2l0eTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFV0aWxpdHkgZm9yIGZldGNoaW5nIGEgbmVzdGVkIHZhbHVlIGZyb20gYSB0eXBvZ3JhcGh5IGNvbmZpZy5cbkBmdW5jdGlvbiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgJG5hbWUpIHtcbiAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbmZpZywgJGxldmVsKSwgJG5hbWUpO1xufVxuXG4vLyBHZXRzIHRoZSBmb250IHNpemUgZm9yIGEgbGV2ZWwgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb25maWcuXG5AZnVuY3Rpb24gbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCAkbGV2ZWwpIHtcbiAgQHJldHVybiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgZm9udC1zaXplKTtcbn1cblxuLy8gR2V0cyB0aGUgbGluZSBoZWlnaHQgZm9yIGEgbGV2ZWwgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb25maWcuXG5AZnVuY3Rpb24gbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsICRsZXZlbCkge1xuICBAcmV0dXJuIF9tYXQtZ2V0LXR5cGUtdmFsdWUoJGNvbmZpZywgJGxldmVsLCBsaW5lLWhlaWdodCk7XG59XG5cbi8vIEdldHMgdGhlIGZvbnQgd2VpZ2h0IGZvciBhIGxldmVsIGluc2lkZSBhIHR5cG9ncmFwaHkgY29uZmlnLlxuQGZ1bmN0aW9uIG1hdC1mb250LXdlaWdodCgkY29uZmlnLCAkbGV2ZWwpIHtcbiAgQHJldHVybiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgZm9udC13ZWlnaHQpO1xufVxuXG4vLyBHZXRzIHRoZSBsZXR0ZXIgc3BhY2luZyBmb3IgYSBsZXZlbCBpbnNpZGUgYSB0eXBvZ3JhcGh5IGNvbmZpZy5cbkBmdW5jdGlvbiBtYXQtbGV0dGVyLXNwYWNpbmcoJGNvbmZpZywgJGxldmVsKSB7XG4gIEByZXR1cm4gX21hdC1nZXQtdHlwZS12YWx1ZSgkY29uZmlnLCAkbGV2ZWwsIGxldHRlci1zcGFjaW5nKTtcbn1cblxuLy8gR2V0cyB0aGUgZm9udC1mYW1pbHkgZnJvbSBhIHR5cG9ncmFwaHkgY29uZmlnIGFuZCByZW1vdmVzIHRoZSBxdW90ZXMgYXJvdW5kIGl0LlxuQGZ1bmN0aW9uIG1hdC1mb250LWZhbWlseSgkY29uZmlnLCAkbGV2ZWw6IG51bGwpIHtcbiAgJGZvbnQtZmFtaWx5OiBtYXAtZ2V0KCRjb25maWcsIGZvbnQtZmFtaWx5KTtcblxuICBAaWYgJGxldmVsICE9IG51bGwge1xuICAgICRmb250LWZhbWlseTogX21hdC1nZXQtdHlwZS12YWx1ZSgkY29uZmlnLCAkbGV2ZWwsIGZvbnQtZmFtaWx5KTtcbiAgfVxuXG4gIC8vIEd1YXJkIGFnYWluc3QgdW5xdW90aW5nIG5vbi1zdHJpbmcgdmFsdWVzLCBiZWNhdXNlIGl0J3MgZGVwcmVjYXRlZC5cbiAgQHJldHVybiBpZih0eXBlLW9mKCRmb250LWZhbWlseSkgPT0gc3RyaW5nLCB1bnF1b3RlKCRmb250LWZhbWlseSksICRmb250LWZhbWlseSk7XG59XG5cbi8vIE91dHB1dHMgdGhlIHNob3J0aGFuZCBgZm9udGAgQ1NTIHByb3BlcnR5LCBiYXNlZCBvbiBhIHNldCBvZiB0eXBvZ3JhcGh5IHZhbHVlcy4gRmFsbHMgYmFjayB0b1xuLy8gdGhlIGluZGl2aWR1YWwgcHJvcGVydGllcyBpZiBhIHZhbHVlIHRoYXQgaXNuJ3QgYWxsb3dlZCBpbiB0aGUgc2hvcnRoYW5kIGlzIHBhc3NlZCBpbi5cbkBtaXhpbiBtYXQtdHlwb2dyYXBoeS1mb250LXNob3J0aGFuZCgkZm9udC1zaXplLCAkZm9udC13ZWlnaHQsICRsaW5lLWhlaWdodCwgJGZvbnQtZmFtaWx5KSB7XG4gIC8vIElmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSBzZXQgdG8gYGluaGVyaXRgLCB3ZSBjYW4ndCB1c2UgdGhlIHNob3J0aGFuZFxuICAvLyBzbyB3ZSBmYWxsIGJhY2sgdG8gcGFzc2luZyBpbiB0aGUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzLlxuICBAaWYgKCRmb250LXNpemUgPT0gaW5oZXJpdCBvclxuICAgICAgICRmb250LXdlaWdodCA9PSBpbmhlcml0IG9yXG4gICAgICAgJGxpbmUtaGVpZ2h0ID09IGluaGVyaXQgb3JcbiAgICAgICAkZm9udC1mYW1pbHkgPT0gaW5oZXJpdCBvclxuICAgICAgICRmb250LXNpemUgPT0gbnVsbCBvclxuICAgICAgICRmb250LXdlaWdodCA9PSBudWxsIG9yXG4gICAgICAgJGxpbmUtaGVpZ2h0ID09IG51bGwgb3JcbiAgICAgICAkZm9udC1mYW1pbHkgPT0gbnVsbCkge1xuXG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICAgIGZvbnQtd2VpZ2h0OiAkZm9udC13ZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5O1xuICB9XG4gIEBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBzaG9ydGhhbmQgYGZvbnRgLCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGFtb3VudCBvZiBieXRlcy4gTm90ZVxuICAgIC8vIHRoYXQgd2UgbmVlZCB0byB1c2UgaW50ZXJwb2xhdGlvbiBmb3IgYGZvbnQtc2l6ZS9saW5lLWhlaWdodGAgaW4gb3JkZXIgdG8gcHJldmVudFxuICAgIC8vIFNhc3MgZnJvbSBkaXZpZGluZyB0aGUgdHdvIHZhbHVlcy5cbiAgICBmb250OiAkZm9udC13ZWlnaHQgI3skZm9udC1zaXplfS8jeyRsaW5lLWhlaWdodH0gJGZvbnQtZmFtaWx5O1xuICB9XG59XG5cbi8vIENvbnZlcnRzIGEgdHlwb2dyYXBoeSBsZXZlbCBpbnRvIENTUyBzdHlsZXMuXG5AbWl4aW4gbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsICRsZXZlbCkge1xuICAkZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsICRsZXZlbCk7XG4gICRmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsICRsZXZlbCk7XG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsICRsZXZlbCk7XG4gICRmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsICRsZXZlbCk7XG5cbiAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktZm9udC1zaG9ydGhhbmQoJGZvbnQtc2l6ZSwgJGZvbnQtd2VpZ2h0LCAkbGluZS1oZWlnaHQsICRmb250LWZhbWlseSk7XG4gIGxldHRlci1zcGFjaW5nOiBtYXQtbGV0dGVyLXNwYWNpbmcoJGNvbmZpZywgJGxldmVsKTtcbn1cblxuXG5AbWl4aW4gbWF0LW9wdGlvbi10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1vcHRpb24ge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLFxuICAgICY6Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICB9XG5cbiAgICAvLyBJbiBtdWx0aXBsZSBtb2RlIHRoZXJlIGlzIGEgY2hlY2tib3ggdG8gc2hvdyB0aGF0IHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgJi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIpO1xuICAgIH1cblxuICAgICYubWF0LWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICAgIH1cblxuICAgICYubWF0LW9wdGlvbi1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gIH1cblxuICAubWF0LWFjY2VudCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgfVxuXG4gIC5tYXQtd2FybiAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1vcHRpb24tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtb3B0aW9uIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LW9wdGdyb3VwLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtb3B0Z3JvdXAtbGFiZWwge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LW9wdGdyb3VwLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LW9wdGdyb3VwLWxhYmVsIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgYm9keS0yKTtcbiAgfVxufVxuXG5cblxuQG1peGluIG1hdC1wc2V1ZG8tY2hlY2tib3gtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC8vIE5PVEUodHJhdmlza2F1Zm1hbik6IFdoaWxlIHRoZSBzcGVjIGNhbGxzIGZvciB0cmFuc2x1Y2VudCBibGFja3Mvd2hpdGVzIGZvciBkaXNhYmxlZCBjb2xvcnMsXG4gIC8vIHRoaXMgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggZWxlbWVudHMgbGF5ZXJlZCBvbiB0b3Agb2Ygb25lIGFub3RoZXIuIFRvIGdldCBhcm91bmQgdGhpcyB3ZVxuICAvLyBibGVuZCB0aGUgY29sb3JzIHRvZ2V0aGVyIGJhc2VkIG9uIHRoZSBiYXNlIGNvbG9yIGFuZCB0aGUgdGhlbWUgYmFja2dyb3VuZC5cbiAgJHdoaXRlLTMwcGN0LW9wYWNpdHktb24tZGFyazogIzY4Njg2ODtcbiAgJGJsYWNrLTI2cGN0LW9wYWNpdHktb24tbGlnaHQ6ICNiMGIwYjA7XG4gICRkaXNhYmxlZC1jb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsICR3aGl0ZS0zMHBjdC1vcGFjaXR5LW9uLWRhcmssICRibGFjay0yNnBjdC1vcGFjaXR5LW9uLWxpZ2h0KTtcbiAgJGNvbG9yZWQtYm94LXNlbGVjdG9yOiAnLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSc7XG5cbiAgLm1hdC1wc2V1ZG8tY2hlY2tib3gge1xuICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpLCBzZWNvbmRhcnktdGV4dCk7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKTtcbiAgICB9XG4gIH1cblxuICAubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gICAgY29sb3I6ICRkaXNhYmxlZC1jb2xvcjtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gdGhlIGFjY2VudCBjb2xvci4gTm90ZSB0aGF0IHRoZSBwc2V1ZG8gY2hlY2tib3hlcyBhcmUgbWVhbnQgdG8gaW5oZXJpdCB0aGVcbiAgLy8gdGhlbWUgZnJvbSB0aGVpciBwYXJlbnQsIHJhdGhlciB0aGFuIGltcGxlbWVudGluZyB0aGVpciBvd24gdGhlbWluZywgd2hpY2ggaXMgd2h5IHdlXG4gIC8vIGRvbid0IGF0dGFjaCB0byB0aGUgYG1hdC0qYCBjbGFzc2VzLlxuICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLFxuICAubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIGFjY2VudCkpO1xuICB9XG5cbiAgLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsXG4gIC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHByaW1hcnkpKTtcbiAgfVxuXG4gIC5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKG1hcC1nZXQoJHRoZW1lLCB3YXJuKSk7XG4gIH1cblxuICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICAmLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQge1xuICAgICAgYmFja2dyb3VuZDogJGRpc2FibGVkLWNvbG9yO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gUmVwcmVzZW50cyBhIHR5cG9ncmFwaHkgbGV2ZWwgZnJvbSB0aGUgTWF0ZXJpYWwgZGVzaWduIHNwZWMuXG5AZnVuY3Rpb24gbWF0LXR5cG9ncmFwaHktbGV2ZWwoXG4gICRmb250LXNpemUsXG4gICRsaW5lLWhlaWdodDogJGZvbnQtc2l6ZSxcbiAgJGZvbnQtd2VpZ2h0OiA0MDAsXG4gICRmb250LWZhbWlseTogbnVsbCxcbiAgJGxldHRlci1zcGFjaW5nOiBudWxsKSB7XG5cbiAgQHJldHVybiAoXG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLFxuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQsXG4gICAgZm9udC13ZWlnaHQ6ICRmb250LXdlaWdodCxcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LFxuICAgIGxldHRlci1zcGFjaW5nOiAkbGV0dGVyLXNwYWNpbmdcbiAgKTtcbn1cblxuLy8gUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgdHlwb2dyYXBoeSBsZXZlbHMuXG4vLyBEZWZhdWx0cyBjb21lIGZyb20gaHR0cHM6Ly9tYXRlcmlhbC5pby9ndWlkZWxpbmVzL3N0eWxlL3R5cG9ncmFwaHkuaHRtbFxuQGZ1bmN0aW9uIG1hdC10eXBvZ3JhcGh5LWNvbmZpZyhcbiAgJGZvbnQtZmFtaWx5OiAgICdSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZicsXG4gICRkaXNwbGF5LTQ6ICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxMTJweCwgMTEycHgsIDMwMCksXG4gICRkaXNwbGF5LTM6ICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCg1NnB4LCA1NnB4LCA0MDApLFxuICAkZGlzcGxheS0yOiAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoNDVweCwgNDhweCwgNDAwKSxcbiAgJGRpc3BsYXktMTogICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKDM0cHgsIDQwcHgsIDQwMCksXG4gICRoZWFkbGluZTogICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgyNHB4LCAzMnB4LCA0MDApLFxuICAkdGl0bGU6ICAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMjBweCwgMzJweCwgNTAwKSxcbiAgJHN1YmhlYWRpbmctMjogIG1hdC10eXBvZ3JhcGh5LWxldmVsKDE2cHgsIDI4cHgsIDQwMCksXG4gICRzdWJoZWFkaW5nLTE6ICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxNXB4LCAyNHB4LCA0MDApLFxuICAkYm9keS0yOiAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMTRweCwgMjRweCwgNTAwKSxcbiAgJGJvZHktMTogICAgICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKDE0cHgsIDIwcHgsIDQwMCksXG4gICRjYXB0aW9uOiAgICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxMnB4LCAyMHB4LCA0MDApLFxuICAkYnV0dG9uOiAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMTRweCwgMTRweCwgNTAwKSxcbiAgLy8gTGluZS1oZWlnaHQgbXVzdCBiZSB1bml0LWxlc3MgZnJhY3Rpb24gb2YgdGhlIGZvbnQtc2l6ZS5cbiAgJGlucHV0OiAgICAgICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKGluaGVyaXQsIDEuMTI1LCA0MDApXG4pIHtcblxuICAvLyBEZWNsYXJlIGFuIGluaXRpYWwgbWFwIHdpdGggYWxsIG9mIHRoZSBsZXZlbHMuXG4gICRjb25maWc6IChcbiAgICBkaXNwbGF5LTQ6ICAgICAgJGRpc3BsYXktNCxcbiAgICBkaXNwbGF5LTM6ICAgICAgJGRpc3BsYXktMyxcbiAgICBkaXNwbGF5LTI6ICAgICAgJGRpc3BsYXktMixcbiAgICBkaXNwbGF5LTE6ICAgICAgJGRpc3BsYXktMSxcbiAgICBoZWFkbGluZTogICAgICAgJGhlYWRsaW5lLFxuICAgIHRpdGxlOiAgICAgICAgICAkdGl0bGUsXG4gICAgc3ViaGVhZGluZy0yOiAgICRzdWJoZWFkaW5nLTIsXG4gICAgc3ViaGVhZGluZy0xOiAgICRzdWJoZWFkaW5nLTEsXG4gICAgYm9keS0yOiAgICAgICAgICRib2R5LTIsXG4gICAgYm9keS0xOiAgICAgICAgICRib2R5LTEsXG4gICAgY2FwdGlvbjogICAgICAgICRjYXB0aW9uLFxuICAgIGJ1dHRvbjogICAgICAgICAkYnV0dG9uLFxuICAgIGlucHV0OiAgICAgICAgICAkaW5wdXQsXG4gICk7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsZXZlbHMgYW5kIHNldCB0aGUgYGZvbnQtZmFtaWx5YCBvZiB0aGUgb25lcyB0aGF0IGRvbid0IGhhdmUgb25lIHRvIHRoZSBiYXNlLlxuICAvLyBOb3RlIHRoYXQgU2FzcyBjYW4ndCBtb2RpZnkgbWFwcyBpbiBwbGFjZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG1lcmdlIGFuZCByZS1hc3NpZ24uXG4gIEBlYWNoICRrZXksICRsZXZlbCBpbiAkY29uZmlnIHtcbiAgICBAaWYgbWFwLWdldCgkbGV2ZWwsIGZvbnQtZmFtaWx5KSA9PSBudWxsIHtcbiAgICAgICRuZXctbGV2ZWw6IG1hcC1tZXJnZSgkbGV2ZWwsIChmb250LWZhbWlseTogJGZvbnQtZmFtaWx5KSk7XG4gICAgICAkY29uZmlnOiBtYXAtbWVyZ2UoJGNvbmZpZywgKCRrZXk6ICRuZXctbGV2ZWwpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGJhc2UgZm9udCBmYW1pbHkgdG8gdGhlIGNvbmZpZy5cbiAgQHJldHVybiBtYXAtbWVyZ2UoJGNvbmZpZywgKGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHkpKTtcbn1cblxuLy8gQWRkcyB0aGUgYmFzZSB0eXBvZ3JhcGh5IHN0eWxlcywgYmFzZWQgb24gYSBjb25maWcuXG5AbWl4aW4gbWF0LWJhc2UtdHlwb2dyYXBoeSgkY29uZmlnLCAkc2VsZWN0b3I6ICcubWF0LXR5cG9ncmFwaHknKSB7XG4gIC5tYXQtaDEsIC5tYXQtaGVhZGxpbmUsICN7JHNlbGVjdG9yfSBoMSB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGhlYWRsaW5lKTtcbiAgICBtYXJnaW46IDAgMCAxNnB4O1xuICB9XG5cbiAgLm1hdC1oMiwgLm1hdC10aXRsZSwgI3skc2VsZWN0b3J9IGgyIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgdGl0bGUpO1xuICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gIH1cblxuICAubWF0LWgzLCAubWF0LXN1YmhlYWRpbmctMiwgI3skc2VsZWN0b3J9IGgzIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICBtYXJnaW46IDAgMCAxNnB4O1xuICB9XG5cbiAgLm1hdC1oNCwgLm1hdC1zdWJoZWFkaW5nLTEsICN7JHNlbGVjdG9yfSBoNCB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgfVxuXG4gIC8vIE5vdGU6IHRoZSBzcGVjIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gaDUgYW5kIGg2LCBidXQgd2UgYWRkIHRoZXNlIGZvclxuICAvLyBjb25zaXN0ZW5jeS4gVGhlIGZvbnQgc2l6ZXMgY29tZSBmcm9tIHRoZSBDaHJvbWUgdXNlciBhZ2VudCBzdHlsZXMgd2hpY2ggaGF2ZSBoNSBhdCAwLjgzZW1cbiAgLy8gYW5kIGg2IGF0IDAuNjdlbS5cbiAgLm1hdC1oNSwgI3skc2VsZWN0b3J9IGg1IHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1mb250LXNob3J0aGFuZChcbiAgICAgIG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKSAqIDAuODMsXG4gICAgICBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0xKSxcbiAgICAgIG1hdC1saW5lLWhlaWdodCgkY29uZmlnLCBib2R5LTEpLFxuICAgICAgbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIGJvZHktMSlcbiAgICApO1xuXG4gICAgbWFyZ2luOiAwIDAgMTJweDtcbiAgfVxuXG4gIC5tYXQtaDYsICN7JHNlbGVjdG9yfSBoNiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktZm9udC1zaG9ydGhhbmQoXG4gICAgICBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSkgKiAwLjY3LFxuICAgICAgbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSksXG4gICAgICBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgYm9keS0xKSxcbiAgICAgIG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBib2R5LTEpXG4gICAgKTtcblxuICAgIG1hcmdpbjogMCAwIDEycHg7XG4gIH1cblxuICAubWF0LWJvZHktc3Ryb25nLCAubWF0LWJvZHktMiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGJvZHktMik7XG4gIH1cblxuICAubWF0LWJvZHksIC5tYXQtYm9keS0xLCAjeyRzZWxlY3Rvcn0ge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBib2R5LTEpO1xuXG4gICAgcCB7XG4gICAgICBtYXJnaW46IDAgMCAxMnB4O1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc21hbGwsIC5tYXQtY2FwdGlvbiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGNhcHRpb24pO1xuICB9XG5cbiAgLy8gTm90ZTogVGhlIHNwZWMgZG9lc24ndCBtZW50aW9uIGxldHRlciBzcGFjaW5nLiBUaGUgdmFsdWUgY29tZXMgZnJvbVxuICAvLyBleWViYWxsaW5nIGl0IHVudGlsIGl0IGxvb2tlZCBleGFjdGx5IGxpa2UgdGhlIHNwZWMgZXhhbXBsZXMuXG4gIC5tYXQtZGlzcGxheS00LCAjeyRzZWxlY3Rvcn0gLm1hdC1kaXNwbGF5LTQge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBkaXNwbGF5LTQpO1xuICAgIG1hcmdpbjogMCAwIDU2cHg7XG4gICAgbGV0dGVyLXNwYWNpbmc6IC0wLjA1ZW07XG4gIH1cblxuICAubWF0LWRpc3BsYXktMywgI3skc2VsZWN0b3J9IC5tYXQtZGlzcGxheS0zIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgZGlzcGxheS0zKTtcbiAgICBtYXJnaW46IDAgMCA2NHB4O1xuICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtO1xuICB9XG5cbiAgLm1hdC1kaXNwbGF5LTIsICN7JHNlbGVjdG9yfSAubWF0LWRpc3BsYXktMiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGRpc3BsYXktMik7XG4gICAgbWFyZ2luOiAwIDAgNjRweDtcbiAgICBsZXR0ZXItc3BhY2luZzogLTAuMDA1ZW07XG4gIH1cblxuICAubWF0LWRpc3BsYXktMSwgI3skc2VsZWN0b3J9IC5tYXQtZGlzcGxheS0xIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgZGlzcGxheS0xKTtcbiAgICBtYXJnaW46IDAgMCA2NHB4O1xuICB9XG59XG5cblxuXG5cbkBtaXhpbiBtYXQtYXV0b2NvbXBsZXRlLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLW92ZXJyaWRhYmxlLWVsZXZhdGlvbig0LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG5cbiAgICAvLyBTZWxlY3RlZCBvcHRpb25zIGluIGF1dG9jb21wbGV0ZXMgc2hvdWxkIG5vdCBiZSBncmF5LCBidXQgd2VcbiAgICAvLyBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGJhY2tncm91bmQgZm9yIHNlbGVjdGVkIG9wdGlvbnMgaWZcbiAgICAvLyB0aGV5IGFyZSAqbm90KiBpbiBob3ZlciBvciBmb2N1cyBzdGF0ZS4gVGhpcyBjaGFuZ2UgaGFzIHRvIGJlXG4gICAgLy8gbWFkZSBoZXJlIGJlY2F1c2UgYmFzZSBvcHRpb24gc3R5bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGVcbiAgICAvLyBhdXRvY29tcGxldGUgYW5kIHRoZSBzZWxlY3QuXG4gICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcikge1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcblxuICAgICAgJjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuQG1peGluIG1hdC1hdXRvY29tcGxldGUtdHlwb2dyYXBoeSgkY29uZmlnKSB7IH1cblxuLy8gVGhpcyBjb250YWlucyBhbGwgb2YgdGhlIHN0eWxlcyBmb3IgdGhlIGJhZGdlXG4vLyByYXRoZXIgdGhhbiBqdXN0IHRoZSBjb2xvci90aGVtZSBiZWNhdXNlIG9mXG4vLyBubyBzdHlsZSBzaGVldCBzdXBwb3J0IGZvciBkaXJlY3RpdmVzLlxuXG5cblxuXG5cbiRtYXQtYmFkZ2UtZm9udC1zaXplOiAxMnB4O1xuJG1hdC1iYWRnZS1mb250LXdlaWdodDogNjAwO1xuJG1hdC1iYWRnZS1kZWZhdWx0LXNpemU6IDIycHggIWRlZmF1bHQ7XG4kbWF0LWJhZGdlLXNtYWxsLXNpemU6ICRtYXQtYmFkZ2UtZGVmYXVsdC1zaXplIC0gNjtcbiRtYXQtYmFkZ2UtbGFyZ2Utc2l6ZTogJG1hdC1iYWRnZS1kZWZhdWx0LXNpemUgKyA2O1xuXG4vLyBNaXhpbiBmb3IgYnVpbGRpbmcgb2Zmc2V0IGdpdmVuIGRpZmZlcmVudCBzaXplc1xuQG1peGluIF9tYXQtYmFkZ2Utc2l6ZSgkc2l6ZSkge1xuICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgIHdpZHRoOiAkc2l6ZTtcbiAgICBoZWlnaHQ6ICRzaXplO1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZTtcbiAgfVxuXG4gICYubWF0LWJhZGdlLWFib3ZlIHtcbiAgICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgICAgdG9wOiAtJHNpemUgLyAyO1xuICAgIH1cbiAgfVxuXG4gICYubWF0LWJhZGdlLWJlbG93IHtcbiAgICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgICAgYm90dG9tOiAtJHNpemUgLyAyO1xuICAgIH1cbiAgfVxuXG4gICYubWF0LWJhZGdlLWJlZm9yZSB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGxlZnQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICBbZGlyPSdydGwnXSAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICBsZWZ0OiBhdXRvO1xuICAgICAgcmlnaHQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICAmLm1hdC1iYWRnZS1hZnRlciB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIHJpZ2h0OiAtJHNpemU7XG4gICAgfVxuICB9XG5cbiAgW2Rpcj0ncnRsJ10gJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICByaWdodDogYXV0bztcbiAgICAgIGxlZnQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICAmLm1hdC1iYWRnZS1vdmVybGFwIHtcbiAgICAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgbGVmdDogLSRzaXplIC8gMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBbZGlyPSdydGwnXSAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgbGVmdDogYXV0bztcbiAgICAgICAgcmlnaHQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgcmlnaHQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgW2Rpcj0ncnRsJ10gJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGxlZnQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtYmFkZ2UtdGhlbWUoJHRoZW1lKSB7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkcHJpbWFyeTogbWFwLWdldCgkdGhlbWUsIHByaW1hcnkpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSwgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwcmltYXJ5KTtcblxuICAgIEBpbmNsdWRlIGNkay1oaWdoLWNvbnRyYXN0IHtcbiAgICAgIG91dGxpbmU6IHNvbGlkIDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1iYWRnZS1hY2NlbnQge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQsIGRlZmF1bHQtY29udHJhc3QpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtYmFkZ2Utd2FybiB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJHdhcm4sIGRlZmF1bHQtY29udHJhc3QpO1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJhZGdlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAubWF0LWJhZGdlLWhpZGRlbiB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1iYWRnZS1kaXNhYmxlZCB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICRhcHAtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnYmFja2dyb3VuZCcpO1xuICAgICAgJGJhZGdlLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLWJ1dHRvbik7XG5cbiAgICAgIC8vIFRoZSBkaXNhYmxlZCBjb2xvciB1c3VhbGx5IGhhcyBzb21lIGtpbmQgb2Ygb3BhY2l0eSwgYnV0IGJlY2F1c2UgdGhlIGJhZGdlIGlzIG92ZXJsYXllZFxuICAgICAgLy8gb24gdG9wIG9mIHNvbWV0aGluZyBlbHNlLCBpdCB3b24ndCBsb29rIGdvb2QgaWYgaXQncyBvcGFxdWUuIElmIGl0IGlzIGEgY29sb3IgKnR5cGUqLFxuICAgICAgLy8gd2UgY29udmVydCBpdCBpbnRvIGEgc29saWQgY29sb3IgYnkgdGFraW5nIHRoZSBvcGFjaXR5IGZyb20gdGhlIHJnYmEgdmFsdWUgYW5kIHVzaW5nXG4gICAgICAvLyB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBiYWNrZ3JvdW5kIHRvIHB1dCBpbnRvIGZvcmVncm91bmQgd2hlblxuICAgICAgLy8gbWl4aW5nIHRoZSBjb2xvcnMgdG9nZXRoZXIuXG4gICAgICBAaWYgKHR5cGUtb2YoJGJhZGdlLWNvbG9yKSA9PSBjb2xvciBhbmQgdHlwZS1vZigkYXBwLWJhY2tncm91bmQpID09IGNvbG9yKSB7XG4gICAgICAgICRiYWRnZS1vcGFjaXR5OiBvcGFjaXR5KCRiYWRnZS1jb2xvcik7XG4gICAgICAgIGJhY2tncm91bmQ6IG1peCgkYXBwLWJhY2tncm91bmQsIHJnYmEoJGJhZGdlLWNvbG9yLCAxKSwgKDEgLSAkYmFkZ2Utb3BhY2l0eSkgKiAxMDAlKTtcbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGJhZGdlLWNvbG9yO1xuICAgICAgfVxuXG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgY2xhc3MgaXMgYWRkZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgYWRkZWRcbiAgLy8gc28gaXQgY2FuIGFuaW1hdGUgc2NhbGUgdG8gZGVmYXVsdFxuICAubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZSB7XG4gICAgLy8gU2NhbGUgdG8gYG5vbmVgIGluc3RlYWQgb2YgYDFgIHRvIGF2b2lkIGJsdXJyeSB0ZXh0IGluIHNvbWUgYnJvd3NlcnMuXG4gICAgdHJhbnNmb3JtOiBub25lO1xuICB9XG5cbiAgLm1hdC1iYWRnZS1zbWFsbCB7XG4gICAgQGluY2x1ZGUgX21hdC1iYWRnZS1zaXplKCRtYXQtYmFkZ2Utc21hbGwtc2l6ZSk7XG4gIH1cbiAgLm1hdC1iYWRnZS1tZWRpdW0ge1xuICAgIEBpbmNsdWRlIF9tYXQtYmFkZ2Utc2l6ZSgkbWF0LWJhZGdlLWRlZmF1bHQtc2l6ZSk7XG4gIH1cbiAgLm1hdC1iYWRnZS1sYXJnZSB7XG4gICAgQGluY2x1ZGUgX21hdC1iYWRnZS1zaXplKCRtYXQtYmFkZ2UtbGFyZ2Utc2l6ZSk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1iYWRnZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICBmb250LXdlaWdodDogJG1hdC1iYWRnZS1mb250LXdlaWdodDtcbiAgICBmb250LXNpemU6ICRtYXQtYmFkZ2UtZm9udC1zaXplO1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgZm9udC1zaXplOiAkbWF0LWJhZGdlLWZvbnQtc2l6ZSAvIDI7XG4gIH1cblxuICAubWF0LWJhZGdlLWxhcmdlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgZm9udC1zaXplOiAkbWF0LWJhZGdlLWZvbnQtc2l6ZSAqIDI7XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LWJvdHRvbS1zaGVldC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXIge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtZWxldmF0aW9uKDE2LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlhbG9nKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LWJvdHRvbS1zaGVldC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgYm9keS0xKTtcbiAgfVxufVxuXG5cblxuXG5cbiRfbWF0LWJ1dHRvbi1yaXBwbGUtb3BhY2l0eTogMC4xO1xuXG4vLyBBcHBsaWVzIGEgZm9jdXMgc3R5bGUgdG8gYW4gbWF0LWJ1dHRvbiBlbGVtZW50IGZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgcGFsZXR0ZXMuXG5AbWl4aW4gX21hdC1idXR0b24tZm9jdXMtb3ZlcmxheS1jb2xvcigkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgJi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnkpO1xuICB9XG5cbiAgJi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgfVxuXG4gICYubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgfVxuXG4gICZbZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbkBtaXhpbiBfbWF0LWJ1dHRvbi1yaXBwbGUtY29sb3IoJHRoZW1lLCAkaHVlLCAkb3BhY2l0eTogJF9tYXQtYnV0dG9uLXJpcHBsZS1vcGFjaXR5KSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gICYubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5LCAkaHVlLCAkb3BhY2l0eSk7XG4gIH1cblxuICAmLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQsICRodWUsICRvcGFjaXR5KTtcbiAgfVxuXG4gICYubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuLCAkaHVlLCAkb3BhY2l0eSk7XG4gIH1cbn1cblxuLy8gQXBwbGllcyBhIHByb3BlcnR5IHRvIGFuIG1hdC1idXR0b24gZWxlbWVudCBmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIHBhbGV0dGVzLlxuQG1peGluIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJHByb3BlcnR5LCAkaHVlKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICYubWF0LXByaW1hcnkge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRwcmltYXJ5LCAkaHVlKTtcbiAgfVxuICAmLm1hdC1hY2NlbnQge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRhY2NlbnQsICRodWUpO1xuICB9XG4gICYubWF0LXdhcm4ge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCR3YXJuLCAkaHVlKTtcbiAgfVxuXG4gICYubWF0LXByaW1hcnksICYubWF0LWFjY2VudCwgJi5tYXQtd2FybiwgJltkaXNhYmxlZF0ge1xuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgICRwYWxldHRlOiBpZigkcHJvcGVydHkgPT0gJ2NvbG9yJywgJGZvcmVncm91bmQsICRiYWNrZ3JvdW5kKTtcbiAgICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRwYWxldHRlLCBkaXNhYmxlZC1idXR0b24pO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LWJ1dHRvbi10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC1idXR0b24sIC5tYXQtaWNvbi1idXR0b24sIC5tYXQtc3Ryb2tlZC1idXR0b24ge1xuICAgIC8vIEJ1dHRvbnMgd2l0aG91dCBhIGJhY2tncm91bmQgY29sb3Igc2hvdWxkIGluaGVyaXQgdGhlIGZvbnQgY29sb3IuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvXG4gICAgLy8gZW5zdXJlIHRoYXQgdGhlIGJ1dHRvbiBpcyByZWFkYWJsZSBvbiBjdXN0b20gYmFja2dyb3VuZCBjb2xvcnMuIEl0J3Mgd3JvbmcgdG8gYWx3YXlzIGFzc3VtZVxuICAgIC8vIHRoYXQgdGhvc2UgYnV0dG9ucyBhcmUgYWx3YXlzIHBsYWNlZCBpbnNpZGUgb2YgY29udGFpbmVycyB3aXRoIHRoZSBkZWZhdWx0IGJhY2tncm91bmRcbiAgICAvLyBjb2xvciBvZiB0aGUgdGhlbWUgKGUuZy4gdGhlbWVkIHRvb2xiYXJzKS5cbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblxuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJ2NvbG9yJywgZGVmYXVsdCk7XG4gICAgQGluY2x1ZGUgX21hdC1idXR0b24tZm9jdXMtb3ZlcmxheS1jb2xvcigkdGhlbWUpO1xuXG4gICAgLy8gU2V0dXAgdGhlIHJpcHBsZSBjb2xvciB0byBiZSBiYXNlZCBvbiB0aGUgdGV4dCBjb2xvci4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHJpcHBsZXNcbiAgICAvLyBhcmUgbWF0Y2hpbmcgd2l0aCB0aGUgY3VycmVudCB0aGVtZSBwYWxldHRlIGFuZCBhcmUgaW4gY29udHJhc3QgdG8gdGhlIGJhY2tncm91bmQgY29sb3JcbiAgICAvLyAoZS5nIGluIHRoZW1lZCB0b29sYmFycykuXG4gICAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICBvcGFjaXR5OiAkX21hdC1idXR0b24tcmlwcGxlLW9wYWNpdHk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZDogbWFwX2dldCgkZm9yZWdyb3VuZCwgYmFzZSk7XG4gIH1cblxuICAvLyBOb3RlOiB0aGlzIG5lZWRzIGEgYml0IGV4dHJhIHNwZWNpZmljaXR5LCBiZWNhdXNlIHdlJ3JlIG5vdCBndWFyYW50ZWVkIHRoZSBpbmNsdXNpb25cbiAgLy8gb3JkZXIgb2YgdGhlIHRoZW1lIHN0eWxlcyBhbmQgdGhlIGJ1dHRvbiByZXNldCBtYXkgZW5kIHVwIHJlc2V0dGluZyB0aGlzIGFzIHdlbGwuXG4gIC5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG4gIH1cblxuICAubWF0LWZsYXQtYnV0dG9uLCAubWF0LXJhaXNlZC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgICAvLyBEZWZhdWx0IGZvbnQgYW5kIGJhY2tncm91bmQgY29sb3Igd2hlbiBub3QgdXNpbmcgYW55IGNvbG9yIHBhbGV0dGUuXG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCByYWlzZWQtYnV0dG9uKTtcblxuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJ2NvbG9yJywgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgQGluY2x1ZGUgX21hdC1idXR0b24tdGhlbWUtcHJvcGVydHkoJHRoZW1lLCAnYmFja2dyb3VuZC1jb2xvcicsIGRlZmF1bHQpO1xuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXJpcHBsZS1jb2xvcigkdGhlbWUsIGRlZmF1bHQtY29udHJhc3QpO1xuICB9XG5cbiAgLm1hdC1zdHJva2VkLWJ1dHRvbiwgLm1hdC1mbGF0LWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMCwgJHRoZW1lKTtcbiAgfVxuXG4gIC5tYXQtcmFpc2VkLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMiwgJHRoZW1lKTtcblxuICAgICY6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZSB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLW92ZXJyaWRhYmxlLWVsZXZhdGlvbig4LCAkdGhlbWUpO1xuICAgIH1cblxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDAsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1mYWIsIC5tYXQtbWluaS1mYWIge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDYsICR0aGVtZSk7XG5cbiAgICAmOm5vdChbZGlzYWJsZWRdKTphY3RpdmUge1xuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMTIsICR0aGVtZSk7XG4gICAgfVxuXG4gICAgJltkaXNhYmxlZF0ge1xuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMCwgJHRoZW1lKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1idXR0b24tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtYnV0dG9uLCAubWF0LXJhaXNlZC1idXR0b24sIC5tYXQtaWNvbi1idXR0b24sIC5tYXQtc3Ryb2tlZC1idXR0b24sXG4gIC5tYXQtZmxhdC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYnV0dG9uKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtYnV0dG9uLXRvZ2dsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGRpdmlkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMiwgJHRoZW1lKTtcbiAgfVxuXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuXG4gICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBmb2N1c2VkLWJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG5cbiAgICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGZvY3VzZWQtYnV0dG9uLCAxKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggJGRpdmlkZXItY29sb3I7XG4gIH1cblxuICBbZGlyPSdydGwnXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICRkaXZpZGVyLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwge1xuICAgIC5tYXQtYnV0dG9uLXRvZ2dsZSArIC5tYXQtYnV0dG9uLXRvZ2dsZSB7XG4gICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTtcbiAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAkZGl2aWRlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBzZWxlY3RlZC1idXR0b24pO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLWJ1dHRvbik7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaXNhYmxlZC1idXR0b24tdG9nZ2xlKTtcblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGNhcmQpO1xuICAgIH1cblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIHNlbGVjdGVkLWRpc2FibGVkLWJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxcbiAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQge1xuICAgIGJvcmRlcjogc29saWQgMXB4ICRkaXZpZGVyLWNvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtYnV0dG9uLXRvZ2dsZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtY2FyZC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWNhcmQge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDEsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAgIC8vIE5lZWRzIGV4dHJhIHNwZWNpZmljaXR5IHRvIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGVsZXZhdGlvbiBzZWxlY3RvcnMuXG4gICAgJi5tYXQtY2FyZC1mbGF0IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDAsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jYXJkLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1jYXJkLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWNhcmQge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LWNhcmQtdGl0bGUge1xuICAgIGZvbnQ6IHtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgaGVhZGxpbmUpO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgdGl0bGUpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2FyZC1oZWFkZXIgLm1hdC1jYXJkLXRpdGxlIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgdGl0bGUpO1xuICB9XG5cbiAgLm1hdC1jYXJkLXN1YnRpdGxlLFxuICAubWF0LWNhcmQtY29udGVudCB7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtY2hlY2tib3gtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG5cbiAgLy8gVGhlIGNvbG9yIG9mIHRoZSBjaGVja2JveCdzIGNoZWNrbWFyayAvIG1peGVkbWFyay5cbiAgJGNoZWNrYm94LW1hcmstY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgYmFja2dyb3VuZCk7XG5cbiAgLy8gTk9URSh0cmF2aXNrYXVmbWFuKTogV2hpbGUgdGhlIHNwZWMgY2FsbHMgZm9yIHRyYW5zbHVjZW50IGJsYWNrcy93aGl0ZXMgZm9yIGRpc2FibGVkIGNvbG9ycyxcbiAgLy8gdGhpcyBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBlbGVtZW50cyBsYXllcmVkIG9uIHRvcCBvZiBvbmUgYW5vdGhlci4gVG8gZ2V0IGFyb3VuZCB0aGlzIHdlXG4gIC8vIGJsZW5kIHRoZSBjb2xvcnMgdG9nZXRoZXIgYmFzZWQgb24gdGhlIGJhc2UgY29sb3IgYW5kIHRoZSB0aGVtZSBiYWNrZ3JvdW5kLlxuICAkd2hpdGUtMzBwY3Qtb3BhY2l0eS1vbi1kYXJrOiAjNjg2ODY4O1xuICAkYmxhY2stMjZwY3Qtb3BhY2l0eS1vbi1saWdodDogI2IwYjBiMDtcbiAgJGRpc2FibGVkLWNvbG9yOiBpZigkaXMtZGFyay10aGVtZSwgJHdoaXRlLTMwcGN0LW9wYWNpdHktb24tZGFyaywgJGJsYWNrLTI2cGN0LW9wYWNpdHktb24tbGlnaHQpO1xuXG4gIC5tYXQtY2hlY2tib3gtZnJhbWUge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWNoZWNrbWFyayB7XG4gICAgZmlsbDogJGNoZWNrYm94LW1hcmstY29sb3I7XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoIHtcbiAgICAvLyAhaW1wb3J0YW50IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2UgYSBzdHJva2UgbXVzdCBiZSBzZXQgYXMgYW5cbiAgICAvLyBhdHRyaWJ1dGUgb24gdGhlIFNWRyBpbiBvcmRlciBmb3IgbGluZSBhbmltYXRpb24gdG8gd29yayBwcm9wZXJseS5cbiAgICBzdHJva2U6ICRjaGVja2JveC1tYXJrLWNvbG9yICFpbXBvcnRhbnQ7XG5cbiAgICBAaW5jbHVkZSBjZGstaGlnaC1jb250cmFzdChibGFjay1vbi13aGl0ZSkge1xuICAgICAgLy8gSGF2aW5nIHRoZSBvbmUgYWJvdmUgYmUgIWltcG9ydGFudCBlbmRzIHVwIG92ZXJyaWRpbmcgdGhlIGJyb3dzZXIncyBhdXRvbWF0aWNcbiAgICAgIC8vIGNvbG9yIGludmVyc2lvbiBzbyB3ZSBuZWVkIHRvIHJlLWludmVydCBpdCBvdXJzZWx2ZXMgZm9yIGJsYWNrLW9uLXdoaXRlLlxuICAgICAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jaGVja2JveC1taXhlZG1hcmsge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjaGVja2JveC1tYXJrLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLCAubWF0LWNoZWNrYm94LWNoZWNrZWQge1xuICAgICYubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWRpc2FibGVkIHtcbiAgICAmLm1hdC1jaGVja2JveC1jaGVja2VkLFxuICAgICYubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICAgICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgICY6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkge1xuICAgICAgLm1hdC1jaGVja2JveC1mcmFtZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5tYXQtY2hlY2tib3gtbGFiZWwge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICAgIH1cblxuICAgIEBpbmNsdWRlIGNkay1oaWdoLWNvbnRyYXN0IHtcbiAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIG9uZSBpcyBtb3ZlZCBkb3duIGhlcmUgc28gaXQgY2FuIHRhcmdldCBib3RoXG4gIC8vIHRoZSB0aGVtZSBjb2xvcnMgYW5kIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgQGluY2x1ZGUgY2RrLWhpZ2gtY29udHJhc3Qge1xuICAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gICAgICAvLyBOZWVkcyB0byBiZSByZW1vdmVkIGJlY2F1c2UgaXQgaGlkZXMgdGhlIGNoZWNrYm94IG91dGxpbmUuXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2hlY2tib3g6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpIHtcbiAgICAmLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgICB9XG5cbiAgICAmLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtY2hlY2tib3gtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtY2hlY2tib3gge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAvLyBUT0RPKGthcmEpOiBSZW1vdmUgdGhpcyBzdHlsZSB3aGVuIGZpeGluZyB2ZXJ0aWNhbCBiYXNlbGluZVxuICAubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgICBsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGJvZHktMik7XG4gIH1cbn1cblxuXG5cblxuXG5cbiRtYXQtY2hpcC1yZW1vdmUtZm9udC1zaXplOiAxOHB4O1xuXG5AbWl4aW4gbWF0LWNoaXBzLWNvbG9yKCRmb3JlZ3JvdW5kLCAkYmFja2dyb3VuZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgY29sb3I6ICRmb3JlZ3JvdW5kO1xuXG4gIC5tYXQtY2hpcC1yZW1vdmUge1xuICAgIGNvbG9yOiAkZm9yZWdyb3VuZDtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gIH1cbn1cblxuQG1peGluIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkcGFsZXR0ZSkge1xuICBAaW5jbHVkZSBtYXQtY2hpcHMtY29sb3IobWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LWNvbnRyYXN0KSwgbWF0LWNvbG9yKCRwYWxldHRlKSk7XG5cbiAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LWNvbnRyYXN0LCAwLjEpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtY2hpcHMtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICR1bnNlbGVjdGVkLWJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgdW5zZWxlY3RlZC1jaGlwKTtcbiAgJHVuc2VsZWN0ZWQtZm9yZWdyb3VuZDogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAge1xuICAgIEBpbmNsdWRlIG1hdC1jaGlwcy1jb2xvcigkdW5zZWxlY3RlZC1mb3JlZ3JvdW5kLCAkdW5zZWxlY3RlZC1iYWNrZ3JvdW5kKTtcblxuICAgICY6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkge1xuICAgICAgJjphY3RpdmUge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbigzLCAkdGhlbWUpO1xuICAgICAgfVxuXG4gICAgICAubWF0LWNoaXAtcmVtb3ZlOmhvdmVyIHtcbiAgICAgICAgb3BhY2l0eTogMC41NDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLm1hdC1jaGlwLWRpc2FibGVkIHtcbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXBfZ2V0KCRmb3JlZ3JvdW5kLCBiYXNlKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgQGluY2x1ZGUgbWF0LWNoaXBzLXRoZW1lLWNvbG9yKCRwcmltYXJ5KTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkYWNjZW50KTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1jaGlwcy10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1jaGlwIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMik7XG5cbiAgICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbixcbiAgICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogJG1hdC1jaGlwLXJlbW92ZS1mb250LXNpemU7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC10YWJsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LXRhYmxlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdjYXJkJyk7XG4gIH1cblxuICAubWF0LXRhYmxlIHRoZWFkLCAubWF0LXRhYmxlIHRib2R5LCAubWF0LXRhYmxlIHRmb290LFxuICBtYXQtaGVhZGVyLXJvdywgbWF0LXJvdywgbWF0LWZvb3Rlci1yb3csXG4gIFttYXQtaGVhZGVyLXJvd10sIFttYXQtcm93XSwgW21hdC1mb290ZXItcm93XSxcbiAgLm1hdC10YWJsZS1zdGlja3kge1xuICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gIH1cblxuICBtYXQtcm93LCBtYXQtaGVhZGVyLXJvdywgbWF0LWZvb3Rlci1yb3csXG4gIHRoLm1hdC1oZWFkZXItY2VsbCwgdGQubWF0LWNlbGwsIHRkLm1hdC1mb290ZXItY2VsbCB7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtaGVhZGVyLWNlbGwge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtY2VsbCwgLm1hdC1mb290ZXItY2VsbCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC10YWJsZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10YWJsZSB7XG4gICAgZm9udC1mYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgfVxuXG4gIC5tYXQtaGVhZGVyLWNlbGwge1xuICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMik7XG4gIH1cblxuICAubWF0LWNlbGwsIC5tYXQtZm9vdGVyLWNlbGwge1xuICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpO1xuICB9XG59XG5cblxuXG5cblxuXG5cbiRtYXQtZGF0ZXBpY2tlci1zZWxlY3RlZC10b2RheS1ib3gtc2hhZG93LXdpZHRoOiAxcHg7XG4kbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtZmFkZS1hbW91bnQ6IDAuNjtcbiRtYXQtZGF0ZXBpY2tlci10b2RheS1mYWRlLWFtb3VudDogMC4yO1xuJG1hdC1jYWxlbmRhci1ib2R5LWZvbnQtc2l6ZTogMTNweCAhZGVmYXVsdDtcbiRtYXQtY2FsZW5kYXItd2Vla2RheS10YWJsZS1mb250LXNpemU6IDExcHggIWRlZmF1bHQ7XG5cbkBtaXhpbiBfbWF0LWRhdGVwaWNrZXItY29sb3IoJHBhbGV0dGUpIHtcbiAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsIGRlZmF1bHQtY29udHJhc3QpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICAkYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwYWxldHRlKTtcblxuICAgIEBpZiAodHlwZS1vZigkYmFja2dyb3VuZCkgPT0gY29sb3IpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGZhZGUtb3V0KCRiYWNrZ3JvdW5kLCAkbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtZmFkZS1hbW91bnQpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBjb3VsZG4ndCByZXNvbHZlIHRvIGJhY2tncm91bmQgdG8gYSBjb2xvciAoZS5nLiBpdCdzIGEgQ1NTIHZhcmlhYmxlKSxcbiAgICAgIC8vIGZhbGwgYmFjayB0byBmYWRpbmcgdGhlIGNvbnRlbnQgb3V0IHZpYSBgb3BhY2l0eWAuXG4gICAgICBvcGFjaXR5OiAkbWF0LWRhdGVwaWNrZXItdG9kYXktZmFkZS1hbW91bnQ7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAkbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtdG9kYXktYm94LXNoYWRvdy13aWR0aFxuICAgICAgICAgICAgICAgIG1hdC1jb2xvcigkcGFsZXR0ZSwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1kYXRlcGlja2VyLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC5tYXQtY2FsZW5kYXItYXJyb3cge1xuICAgIGJvcmRlci10b3AtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaWNvbik7XG4gIH1cblxuICAvLyBUaGUgcHJldi9uZXh0IGJ1dHRvbnMgbmVlZCBhIGJpdCBtb3JlIHNwZWNpZmljaXR5IHRvXG4gIC8vIGF2b2lkIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHRoZSAubWF0LWljb24tYnV0dG9uLlxuICAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLFxuICAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLFxuICAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaWNvbik7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50IHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlcixcbiAgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUsXG4gIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUge1xuICAgICYgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gICAgLy8gTm90ZTogdGhvdWdoIGl0J3Mgbm90IHRleHQsIHRoZSBib3JkZXIgaXMgYSBoaW50IGFib3V0IHRoZSBmYWN0IHRoYXQgdGhpcyBpcyB0b2RheSdzIGRhdGUsXG4gICAgLy8gc28gd2UgdXNlIHRoZSBoaW50IGNvbG9yLlxuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgICAkY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcblxuICAgIEBpZiAodHlwZS1vZigkY29sb3IpID09IGNvbG9yKSB7XG4gICAgICBib3JkZXItY29sb3I6IGZhZGUtb3V0KCRjb2xvciwgJG1hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50KTtcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGNvbG9yIGRpZG4ndCByZXNvbHZlIHRvIGEgY29sb3IgdmFsdWUsIGJ1dCBzb21ldGhpbmcgbGlrZSBhIENTUyB2YXJpYWJsZSwgd2UgY2FuJ3RcbiAgICAgIC8vIGZhZGUgaXQgb3V0IHNvIHdlIGZhbGwgYmFjayB0byByZWR1Y2luZyB0aGUgZWxlbWVudCBvcGFjaXR5LiBOb3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZVxuICAgICAgLy8gJG1hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50LCBiZWNhdXNlIGhpbnQgdGV4dCB1c3VhbGx5IGhhcyBzb21lIG9wYWNpdHkgYXBwbGllZFxuICAgICAgLy8gdG8gaXQgYWxyZWFkeSBhbmQgd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIHN0YWNrIG9uIHRvcCBvZiBlYWNoIG90aGVyLlxuICAgICAgb3BhY2l0eTogMC41O1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIF9tYXQtZGF0ZXBpY2tlci1jb2xvcihtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSkpO1xuXG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbig0LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG5cbiAgICAmLm1hdC1hY2NlbnQge1xuICAgICAgQGluY2x1ZGUgX21hdC1kYXRlcGlja2VyLWNvbG9yKG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpKTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZGF0ZXBpY2tlci1jb2xvcihtYXAtZ2V0KCR0aGVtZSwgd2FybikpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoIHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbigwLCAkdGhlbWUpO1xuICB9XG5cbiAgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUge1xuICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHByaW1hcnkpKTtcblxuICAgICYubWF0LWFjY2VudCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpKTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHdhcm4pKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1kYXRlcGlja2VyLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWNhbGVuZGFyIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5IHtcbiAgICBmb250LXNpemU6ICRtYXQtY2FsZW5kYXItYm9keS1mb250LXNpemU7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsXG4gIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYnV0dG9uKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aCB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogJG1hdC1jYWxlbmRhci13ZWVrZGF5LXRhYmxlLWZvbnQtc2l6ZTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtZGlhbG9nLXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZGlhbG9nLWNvbnRhaW5lciB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMjQsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaWFsb2cpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtZGlhbG9nLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWRpYWxvZy10aXRsZSB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHRpdGxlKTtcbiAgfVxufVxuXG5cblxuXG5cblxuQG1peGluIG1hdC1leHBhbnNpb24tcGFuZWwtdGhlbWUoJHRoZW1lKSB7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDIsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtYWN0aW9uLXJvdyB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIge1xuICAgICY6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pIHtcbiAgICAgICYuY2RrLWtleWJvYXJkLWZvY3VzZWQsXG4gICAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBob3Zlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzYWJsZSB0aGUgaG92ZXIgb24gdG91Y2ggZGV2aWNlcyBzaW5jZSBpdCBjYW4gYXBwZWFyIGxpa2UgaXQgaXMgc3R1Y2suIFdlIGNhbid0IHVzZVxuICAvLyBgQG1lZGlhIChob3ZlcilgIGFib3ZlLCBiZWNhdXNlIHRoZSBkZXNrdG9wIHN1cHBvcnQgYnJvd3NlciBzdXBwb3J0IGlzbid0IGdyZWF0LlxuICBAbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gICAgLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddKVxuICAgICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbixcbiAgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtYnV0dG9uKTtcblxuICAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSxcbiAgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24ge1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtZXhwYW5zaW9uLXBhbmVsLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIge1xuICAgIGZvbnQ6IHtcbiAgICAgIGZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgICB3ZWlnaHQ6IG1hdC1mb250LXdlaWdodCgkY29uZmlnLCBzdWJoZWFkaW5nLTEpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBib2R5LTEpO1xuICB9XG59XG5cblxuXG5cbi8vIFRoaXMgbWl4aW4gd2lsbCBlbnN1cmUgdGhhdCBsaW5lcyB0aGF0IG92ZXJmbG93IHRoZSBjb250YWluZXIgd2lsbCBoaWRlIHRoZSBvdmVyZmxvdyBhbmRcbi8vIHRydW5jYXRlIG5lYXRseSB3aXRoIGFuIGVsbGlwc2lzLlxuQG1peGluIG1hdC10cnVuY2F0ZS1saW5lKCkge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLy8gTWl4aW4gdG8gcHJvdmlkZSBhbGwgbWF0LWxpbmUgc3R5bGVzLCBjaGFuZ2luZyBzZWNvbmRhcnkgZm9udCBzaXplIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxpc3Rcbi8vIGlzIGluIGRlbnNlIG1vZGUuXG5AbWl4aW4gbWF0LWxpbmUtYmFzZSgkc2Vjb25kYXJ5LWZvbnQtc2l6ZSkge1xuICAubWF0LWxpbmUge1xuICAgIEBpbmNsdWRlIG1hdC10cnVuY2F0ZS1saW5lKCk7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAgIC8vIGFsbCBsaW5lcyBidXQgdGhlIHRvcCBsaW5lIHNob3VsZCBoYXZlIHNtYWxsZXIgdGV4dFxuICAgICY6bnRoLWNoaWxkKG4rMikge1xuICAgICAgZm9udC1zaXplOiAkc2Vjb25kYXJ5LWZvbnQtc2l6ZTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtaXhpbiBub3JtYWxpemVzIGRlZmF1bHQgZWxlbWVudCBzdHlsZXMsIGUuZy4gZm9udCB3ZWlnaHQgZm9yIGhlYWRpbmcgdGV4dC5cbkBtaXhpbiBtYXQtbm9ybWFsaXplLXRleHQoKSB7XG4gICYgPiAqIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBUaGlzIG1peGluIHByb3ZpZGVzIGJhc2Ugc3R5bGVzIGZvciB0aGUgd3JhcHBlciBhcm91bmQgbWF0LWxpbmUgZWxlbWVudHMgaW4gYSBsaXN0LlxuQG1peGluIG1hdC1saW5lLXdyYXBwZXItYmFzZSgpIHtcbiAgQGluY2x1ZGUgbWF0LW5vcm1hbGl6ZS10ZXh0KCk7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgLy8gTXVzdCByZW1vdmUgd3JhcHBlciB3aGVuIGxpbmVzIGFyZSBlbXB0eSBvciBpdCB0YWtlcyB1cCBob3Jpem9udGFsXG4gIC8vIHNwYWNlIGFuZCBwdXNoZXMgb3RoZXIgZWxlbWVudHMgdG8gdGhlIHJpZ2h0LlxuICAmOmVtcHR5IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuXG4vLyBJbmNsdWRlIHRoaXMgZW1wdHkgbWl4aW4gZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGNvbXBvbmVudHMuXG5AbWl4aW4gbWF0LWdyaWQtbGlzdC10aGVtZSgkdGhlbWUpIHsgfVxuXG5AbWl4aW4gbWF0LWdyaWQtbGlzdC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1ncmlkLXRpbGUtaGVhZGVyLFxuICAubWF0LWdyaWQtdGlsZS1mb290ZXIge1xuICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKSk7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cblxuLy8gSW5jbHVkZSB0aGlzIGVtcHR5IG1peGluIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLlxuQG1peGluIG1hdC1pY29uLXRoZW1lKCR0aGVtZSkge1xuICAkcHJpbWFyeTogbWFwLWdldCgkdGhlbWUsIHByaW1hcnkpO1xuICAkYWNjZW50OiBtYXAtZ2V0KCR0aGVtZSwgYWNjZW50KTtcbiAgJHdhcm46IG1hcC1nZXQoJHRoZW1lLCB3YXJuKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWljb24ge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1pY29uLXR5cG9ncmFwaHkoJGNvbmZpZykgeyB9XG5cblxuXG5cblxuLy8gUmVuZGVycyBhIGdyYWRpZW50IGZvciBzaG93aW5nIHRoZSBkYXNoZWQgbGluZSB3aGVuIHRoZSBpbnB1dCBpcyBkaXNhYmxlZC5cbi8vIFVubGlrZSB1c2luZyBhIGJvcmRlciwgYSBncmFkaWVudCBhbGxvd3MgdXMgdG8gYWRqdXN0IHRoZSBzcGFjaW5nIG9mIHRoZSBkb3R0ZWQgbGluZVxuLy8gdG8gbWF0Y2ggdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLlxuQG1peGluIG1hdC1jb250cm9sLWRpc2FibGVkLXVuZGVybGluZSgkY29sb3IpIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAkY29sb3IgMCUsICRjb2xvciAzMyUsIHRyYW5zcGFyZW50IDAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0cHggMTAwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xufVxuXG4vLyBGaWd1cmVzIG91dCB0aGUgY29sb3Igb2YgdGhlIHBsYWNlaG9sZGVyIGZvciBhIGZvcm0gY29udHJvbC5cbi8vIFVzZWQgcHJpbWFyaWx5IHRvIHByZXZlbnQgdGhlIHZhcmlvdXMgZm9ybSBjb250cm9scyBmcm9tXG4vLyBiZWNvbWluZyBvdXQgb2Ygc3luYyBzaW5jZSB0aGVzZSBjb2xvcnMgYXJlbid0IGluIGEgcGFsZXR0ZS5cbkBmdW5jdGlvbiBfbWF0LWNvbnRyb2wtcGxhY2Vob2xkZXItY29sb3IoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gIEByZXR1cm4gbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNSwgMC40MikpO1xufVxuXG5cbi8qIHN0eWxlbGludC1kaXNhYmxlIG1hdGVyaWFsL25vLXByZWZpeGVzICovXG5AbWl4aW4gdXNlci1zZWxlY3QoJHZhbHVlKSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbiAgLW1vei11c2VyLXNlbGVjdDogJHZhbHVlO1xuICAtbXMtdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbiAgdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbn1cblxuQG1peGluIGlucHV0LXBsYWNlaG9sZGVyIHtcbiAgJjo6cGxhY2Vob2xkZXIge1xuICAgIEBjb250ZW50O1xuICB9XG5cbiAgJjo6LW1vei1wbGFjZWhvbGRlciB7XG4gICAgQGNvbnRlbnQ7XG4gIH1cblxuICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICBAY29udGVudDtcbiAgfVxuXG4gICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG5AbWl4aW4gY3Vyc29yLWdyYWIge1xuICBjdXJzb3I6IC13ZWJraXQtZ3JhYjtcbiAgY3Vyc29yOiBncmFiO1xufVxuXG5AbWl4aW4gY3Vyc29yLWdyYWJiaW5nIHtcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nO1xuICBjdXJzb3I6IGdyYWJiaW5nO1xufVxuXG5AbWl4aW4gYmFja2ZhY2UtdmlzaWJpbGl0eSgkdmFsdWUpIHtcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiAkdmFsdWU7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6ICR2YWx1ZTtcbn1cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cblxuXG5cbkBtaXhpbiBtYXQtaW5wdXQtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxcbiAgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LWlucHV0LWVsZW1lbnQge1xuICAgIGNhcmV0LWNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnkpO1xuXG4gICAgQGluY2x1ZGUgaW5wdXQtcGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6IF9tYXQtY29udHJvbC1wbGFjZWhvbGRlci1jb2xvcigkdGhlbWUpO1xuICAgIH1cblxuICAgIC8vIE9uIGRhcmsgdGhlbWVzIHdlIHNldCB0aGUgbmF0aXZlIGBzZWxlY3RgIGNvbG9yIHRvIHNvbWUgc2hhZGUgb2Ygd2hpdGUsXG4gICAgLy8gaG93ZXZlciB0aGUgY29sb3IgcHJvcGFnYXRlcyB0byBhbGwgb2YgdGhlIGBvcHRpb25gIGVsZW1lbnRzLCB3aGljaCBhcmVcbiAgICAvLyBhbHdheXMgb24gYSB3aGl0ZSBiYWNrZ3JvdW5kIGluc2lkZSB0aGUgZHJvcGRvd24sIGNhdXNpbmcgdGhlbSB0byBibGVuZCBpbi5cbiAgICAvLyBTaW5jZSB3ZSBjYW4ndCBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZHJvcGRvd24sIHdlIG5lZWQgdG8gZXhwbGljaXRseVxuICAgIC8vIHJlc2V0IHRoZSBjb2xvciBvZiB0aGUgb3B0aW9ucyB0byBzb21ldGhpbmcgZGFyay5cbiAgICBAaWYgKG1hcC1nZXQoJHRoZW1lLCBpcy1kYXJrKSkge1xuICAgICAgb3B0aW9uIHtcbiAgICAgICAgY29sb3I6ICRkYXJrLXByaW1hcnktdGV4dDtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uOmRpc2FibGVkIHtcbiAgICAgICAgY29sb3I6ICRkYXJrLWRpc2FibGVkLXRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICB9XG5cbiAgLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxcbiAgLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1pbnB1dC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLy8gVGhlIHVuaXQtbGVzcyBsaW5lLWhlaWdodCBmcm9tIHRoZSBmb250IGNvbmZpZy5cbiAgJGxpbmUtaGVpZ2h0OiBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgaW5wdXQpO1xuXG4gIC8vIFRoZSBhbW91bnQgb2Ygc3BhY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBhY3R1YWwgdGV4dFxuICAvLyAoYXMgYSBmcmFjdGlvbiBvZiB0aGUgZm9udC1zaXplKS5cbiAgJGxpbmUtc3BhY2luZzogKCRsaW5lLWhlaWdodCAtIDEpIC8gMjtcblxuICAvLyA8aW5wdXQ+IGVsZW1lbnRzIHNlZW0gdG8gaGF2ZSB0aGVpciBoZWlnaHQgc2V0IHNsaWdodGx5IHRvbyBsYXJnZSBvbiBTYWZhcmkgY2F1c2luZyB0aGUgdGV4dCB0b1xuICAvLyBiZSBtaXNhbGlnbmVkIHcuci50LiB0aGUgcGxhY2Vob2xkZXIuIEFkZGluZyB0aGlzIG1hcmdpbiBjb3JyZWN0cyBpdC5cbiAgaW5wdXQubWF0LWlucHV0LWVsZW1lbnQge1xuICAgIG1hcmdpbi10b3A6IC0kbGluZS1zcGFjaW5nICogMWVtO1xuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtbGlzdC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWxpc3QtYmFzZSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgfVxuXG4gICAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG5cbiAgICAubWF0LXN1YmhlYWRlciB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1saXN0LWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlzYWJsZWQtbGlzdC1vcHRpb24pO1xuICB9XG5cbiAgLm1hdC1saXN0LW9wdGlvbixcbiAgLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSxcbiAgLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSB7XG4gICAgJjpob3ZlciwgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdob3ZlcicpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LWxpc3QtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gICRmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuXG4gIC5tYXQtbGlzdC1pdGVtIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5O1xuICB9XG5cbiAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlzdFxuICAubWF0LWxpc3QtYmFzZSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIHN1YmhlYWRpbmctMik7XG4gICAgICBAaW5jbHVkZSBtYXQtbGluZS1iYXNlKG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKSk7XG4gICAgfVxuXG4gICAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpKTtcbiAgICB9XG5cbiAgICAubWF0LXN1YmhlYWRlciB7XG4gICAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIGJvZHktMik7XG4gICAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cblxuICAvLyBEZW5zZSBsaXN0XG4gIC5tYXQtbGlzdC1iYXNlW2RlbnNlXSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pO1xuICAgICAgQGluY2x1ZGUgbWF0LWxpbmUtYmFzZShtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pKTtcbiAgICB9XG5cbiAgICAubWF0LWxpc3Qtb3B0aW9uIHtcbiAgICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKSk7XG4gICAgfVxuXG4gICAgLm1hdC1zdWJoZWFkZXIge1xuICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseTtcbiAgICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1tZW51LXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtbWVudS1wYW5lbCB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oNCwgJHRoZW1lKTtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdjYXJkJyk7XG4gIH1cblxuICAubWF0LW1lbnUtaXRlbSB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ3RleHQnKTtcblxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgICYsICY6OmFmdGVyIHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLFxuICAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVyIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCAnaWNvbicpO1xuICB9XG5cbiAgLm1hdC1tZW51LWl0ZW06aG92ZXIsXG4gIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkLFxuICAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCB7XG4gICAgJjpub3QoW2Rpc2FibGVkXSkge1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnaG92ZXInKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1tZW51LXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LW1lbnUtaXRlbSB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZywgYm9keS0xKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gbWF0LXBhZ2luYXRvci10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcblxuICAubWF0LXBhZ2luYXRvciB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICB9XG5cbiAgLm1hdC1wYWdpbmF0b3IsXG4gIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsXG4gIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2ljb24nKTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBtYXQtY29sb3IoJGZvcmVncm91bmQsICdpY29uJyk7XG4gIH1cblxuICAubWF0LXBhZ2luYXRvci1maXJzdCxcbiAgLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2ljb24nKTtcbiAgfVxuXG4gIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIHtcbiAgICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsXG4gICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50LFxuICAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuICAgIC5tYXQtcGFnaW5hdG9yLWxhc3Qge1xuICAgICAgYm9yZGVyLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsICdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LXBhZ2luYXRvci10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1wYWdpbmF0b3IsXG4gIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgY2FwdGlvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC1wcm9ncmVzcy1iYXItdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICAgIGZpbGw6IG1hdC1jb2xvcigkcHJpbWFyeSwgbGlnaHRlcik7XG4gIH1cblxuICAubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSwgbGlnaHRlcik7XG4gIH1cblxuICAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgfVxuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQge1xuICAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICAgICAgZmlsbDogbWF0LWNvbG9yKCRhY2NlbnQsIGxpZ2h0ZXIpO1xuICAgIH1cblxuICAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIHtcbiAgICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgICAgIGZpbGw6IG1hdC1jb2xvcigkd2FybiwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkd2FybiwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1wcm9ncmVzcy1iYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7IH1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1wcm9ncmVzcy1zcGlubmVyLCAubWF0LXNwaW5uZXIge1xuICAgIGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cbkBtaXhpbiBfbWF0LXJhZGlvLWNvbG9yKCRwYWxldHRlKSB7XG4gICYubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlKTtcbiAgfVxuXG4gIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuICAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbiAgJi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLFxuICAmOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtcmFkaW8tdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1yYWRpby1idXR0b24ge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgQGluY2x1ZGUgX21hdC1yYWRpby1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtcmFkaW8tY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXJhZGlvLWNvbG9yKCR3YXJuKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG5lZWRzIGV4dHJhIHNwZWNpZmljaXR5LCBiZWNhdXNlIHRoZSBjbGFzc2VzIGFib3ZlIGFyZSBjb21iaW5lZFxuICAgIC8vIChlLmcuIGAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50YCkgd2hpY2ggaW5jcmVhc2VzIHRoZWlyIHNwZWNpZmljaXR5IGEgbG90LlxuICAgIC8vIFRPRE86IGNvbnNpZGVyIG1ha2luZyB0aGUgc2VsZWN0b3JzIGludG8gZGVzY2VuZGFudHMgKGAubWF0LXByaW1hcnkgLm1hdC1yYWRpby1idXR0b25gKS5cbiAgICAmLm1hdC1yYWRpby1kaXNhYmxlZCB7XG4gICAgICAmLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLFxuICAgICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICAgICAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQpO1xuICAgICAgfVxuXG4gICAgICAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50LFxuICAgICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkKTtcbiAgICAgIH1cblxuICAgICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50IHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN3aXRjaCB0aGlzIHRvIGEgc29saWQgY29sb3Igc2luY2Ugd2UncmUgdXNpbmcgYG9wYWNpdHlgXG4gICAgLy8gdG8gY29udHJvbCBob3cgb3BhcXVlIHRoZSByaXBwbGUgc2hvdWxkIGJlLlxuICAgIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWFwX2dldCgkZm9yZWdyb3VuZCwgYmFzZSk7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtcmFkaW8tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtcmFkaW8tYnV0dG9uIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1zZWxlY3QtdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gIC5tYXQtc2VsZWN0LXZhbHVlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogX21hdC1jb250cm9sLXBsYWNlaG9sZGVyLWNvbG9yKCR0aGVtZSk7XG4gIH1cblxuICAubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC12YWx1ZSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1zZWxlY3QtcGFuZWwge1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oNCwgJHRoZW1lKTtcblxuICAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIsIDAuMTIpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZCB7XG4gICAgJi5tYXQtZm9jdXNlZCB7XG4gICAgICAmLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93IHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgICB9XG5cbiAgICAgICYubWF0LWFjY2VudCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgICB9XG5cbiAgICAgICYubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgICAgICBjb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1zZWxlY3QtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcblxuICAubWF0LXNlbGVjdCB7XG4gICAgZm9udC1mYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgfVxuXG4gIC5tYXQtc2VsZWN0LXRyaWdnZXIge1xuICAgIGhlaWdodDogJGxpbmUtaGVpZ2h0ICogMWVtO1xuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gbWF0LXNpZGVuYXYtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICRkcmF3ZXItYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaWFsb2cpO1xuICAkZHJhd2VyLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yOiAgbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKTtcbiAgJGRyYXdlci1wdXNoLWJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlhbG9nKTtcbiAgJGRyYXdlci1zaWRlLWJvcmRlcjogc29saWQgMXB4IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG5cbiAgLm1hdC1kcmF3ZXItY29udGFpbmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZHJhd2VyLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICB9XG5cbiAgLm1hdC1kcmF3ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRkcmF3ZXItYmFja2dyb3VuZC1jb2xvcjtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAgICYubWF0LWRyYXdlci1wdXNoIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRkcmF3ZXItcHVzaC1iYWNrZ3JvdW5kLWNvbG9yO1xuICAgIH1cblxuICAgICY6bm90KC5tYXQtZHJhd2VyLXNpZGUpIHtcbiAgICAgIC8vIFRoZSBlbGV2YXRpb24gb2Ygei0xNiBpcyBub3RlZCBpbiB0aGUgZGVzaWduIHNwZWNpZmljYXRpb25zLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1kcmF3ZXIuaHRtbFxuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMTYsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1kcmF3ZXItc2lkZSB7XG4gICAgYm9yZGVyLXJpZ2h0OiAkZHJhd2VyLXNpZGUtYm9yZGVyO1xuXG4gICAgJi5tYXQtZHJhd2VyLWVuZCB7XG4gICAgICBib3JkZXItbGVmdDogJGRyYXdlci1zaWRlLWJvcmRlcjtcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTtcbiAgICB9XG4gIH1cblxuICBbZGlyPSdydGwnXSAubWF0LWRyYXdlci1zaWRlIHtcbiAgICBib3JkZXItbGVmdDogJGRyYXdlci1zaWRlLWJvcmRlcjtcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG5cbiAgICAmLm1hdC1kcmF3ZXItZW5kIHtcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgICAgYm9yZGVyLXJpZ2h0OiAkZHJhd2VyLXNpZGUtYm9yZGVyO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd24ge1xuICAgICRvcGFjaXR5OiAwLjY7XG4gICAgJGJhY2tkcm9wLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGNhcmQsICRvcGFjaXR5KTtcblxuICAgIEBpZiAodHlwZS1vZigkYmFja2Ryb3AtY29sb3IpID09IGNvbG9yKSB7XG4gICAgICAvLyBXZSB1c2UgaW52ZXJ0KCkgaGVyZSB0byBoYXZlIHRoZSBkYXJrZW4gdGhlIGJhY2tncm91bmQgY29sb3IgZXhwZWN0ZWQgdG8gYmUgdXNlZC4gSWYgdGhlXG4gICAgICAvLyBiYWNrZ3JvdW5kIGlzIGxpZ2h0LCB3ZSB1c2UgYSBkYXJrIGJhY2tkcm9wLiBJZiB0aGUgYmFja2dyb3VuZCBpcyBkYXJrLFxuICAgICAgLy8gd2UgdXNlIGEgbGlnaHQgYmFja2Ryb3AuXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbnZlcnQoJGJhY2tkcm9wLWNvbG9yKTtcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgLy8gSWYgd2UgY291bGRuJ3QgcmVzb2x2ZSB0aGUgYmFja2Ryb3AgY29sb3IgdG8gYSBjb2xvciB2YWx1ZSwgZmFsbCBiYWNrIHRvIHVzaW5nXG4gICAgICAvLyBgb3BhY2l0eWAgdG8gbWFrZSBpdCBvcGFxdWUgc2luY2UgaXRzIGVuZCB2YWx1ZSBjb3VsZCBiZSBhIHNvbGlkIGNvbG9yLlxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tkcm9wLWNvbG9yO1xuICAgICAgb3BhY2l0eTogJG9wYWNpdHk7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtc2lkZW5hdi10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cblxuQG1peGluIF9tYXQtc2xpZGUtdG9nZ2xlLWNoZWNrZWQoJHBhbGV0dGUsICR0aHVtYi1jaGVja2VkLWh1ZSkge1xuICAmLm1hdC1jaGVja2VkIHtcbiAgICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsICR0aHVtYi1jaGVja2VkLWh1ZSk7XG4gICAgfVxuXG4gICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgICAgIC8vIE9wYWNpdHkgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzcGVjcyBmb3IgdGhlIHNlbGVjdGlvbiBjb250cm9scy5cbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vY29tcG9uZW50cy9zZWxlY3Rpb24tY29udHJvbHMuaHRtbCNzcGVjc1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlLCAkdGh1bWItY2hlY2tlZC1odWUsIDAuNTQpO1xuICAgIH1cblxuICAgIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgLy8gU2V0IG5vIG9wYWNpdHkgZm9yIHRoZSByaXBwbGVzIGJlY2F1c2UgdGhlIHJpcHBsZSBvcGFjaXR5IHdpbGwgYmUgYWRqdXN0ZWQgZHluYW1pY2FsbHlcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGludGVyYWN0aW9uIHdpdGggdGhlIHNsaWRlLXRvZ2dsZSAoZS5nLiBmb3IgaG92ZXIsIGZvY3VzKVxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlLCAkdGh1bWItY2hlY2tlZC1odWUpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LXNsaWRlLXRvZ2dsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGlzLWRhcms6IG1hcF9nZXQoJHRoZW1lLCBpcy1kYXJrKTtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLy8gQ29sb3IgaHVlcyBhcmUgYmFzZWQgb24gdGhlIHNwZWNzIHdoaWNoIGJyaWVmbHkgc2hvdyB0aGUgaHVlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIGEgc3dpdGNoLlxuICAvLyBUaGUgMjAxOCBzcGVjcyBubyBsb25nZXIgZGVzY3JpYmUgaG93IGRhcmsgc3dpdGNoZXMgc2hvdWxkIGxvb2sgbGlrZS4gRHVlIHRvIHRoZSBsYWNrIG9mXG4gIC8vIGluZm9ybWF0aW9uIGZvciBkYXJrIHRoZW1lZCBzd2l0Y2hlcywgd2UgcGFydGlhbGx5IGtlZXAgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGlzIGJhc2VkIG9uXG4gIC8vIHRoZSBwcmV2aW91cyBzcGVjaWZpY2F0aW9ucy4gRm9yIHRoZSBjaGVja2VkIGNvbG9yIHdlIGFsd2F5cyB1c2UgdGhlIGBkZWZhdWx0YCBodWUgYmVjYXVzZVxuICAvLyB0aGF0IGZvbGxvd3MgTURDIGFuZCBhbHNvIG1ha2VzIGl0IGVhc2llciBmb3IgcGVvcGxlIHRvIGNyZWF0ZSBhIGN1c3RvbSB0aGVtZSB3aXRob3V0IG5lZWRpbmdcbiAgLy8gdG8gc3BlY2lmeSBlYWNoIGh1ZSBpbmRpdmlkdWFsbHkuXG4gICR0aHVtYi11bmNoZWNrZWQtaHVlOiBpZigkaXMtZGFyaywgNDAwLCA1MCk7XG4gICR0aHVtYi1jaGVja2VkLWh1ZTogZGVmYXVsdDtcblxuICAkYmFyLXVuY2hlY2tlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZCk7XG4gICRyaXBwbGUtdW5jaGVja2VkLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGJhc2UpO1xuXG4gIC5tYXQtc2xpZGUtdG9nZ2xlIHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlLXRvZ2dsZS1jaGVja2VkKCRhY2NlbnQsICR0aHVtYi1jaGVja2VkLWh1ZSk7XG5cbiAgICAmLm1hdC1wcmltYXJ5IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtc2xpZGUtdG9nZ2xlLWNoZWNrZWQoJHByaW1hcnksICR0aHVtYi1jaGVja2VkLWh1ZSk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXNsaWRlLXRvZ2dsZS1jaGVja2VkKCR3YXJuLCAkdGh1bWItY2hlY2tlZC1odWUpO1xuICAgIH1cblxuICAgICY6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICAvLyBTZXQgbm8gb3BhY2l0eSBmb3IgdGhlIHJpcHBsZXMgYmVjYXVzZSB0aGUgcmlwcGxlIG9wYWNpdHkgd2lsbCBiZSBhZGp1c3RlZCBkeW5hbWljYWxseVxuICAgICAgLy8gYmFzZWQgb24gdGhlIHR5cGUgb2YgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc2xpZGUtdG9nZ2xlIChlLmcuIGZvciBob3ZlciwgZm9jdXMpXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcmlwcGxlLXVuY2hlY2tlZC1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMSwgJHRoZW1lKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJG1hdC1ncmV5LCAkdGh1bWItdW5jaGVja2VkLWh1ZSk7XG4gIH1cblxuICAubWF0LXNsaWRlLXRvZ2dsZS1iYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRiYXItdW5jaGVja2VkLWNvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtc2xpZGUtdG9nZ2xlLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuQG1peGluIF9tYXQtc2xpZGVyLWlubmVyLWNvbnRlbnQtdGhlbWUoJHBhbGV0dGUpIHtcbiAgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbiAgLm1hdC1zbGlkZXItdGh1bWIsXG4gIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICB9XG5cbiAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcGFsZXR0ZSwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zbGlkZXItdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICRtYXQtc2xpZGVyLW9mZi1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzbGlkZXItb2ZmKTtcbiAgJG1hdC1zbGlkZXItb2ZmLWZvY3VzZWQtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2xpZGVyLW9mZi1hY3RpdmUpO1xuICAkbWF0LXNsaWRlci1kaXNhYmxlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzbGlkZXItb2ZmKTtcbiAgJG1hdC1zbGlkZXItbGFiZWxlZC1taW4tdmFsdWUtdGh1bWItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2xpZGVyLW1pbik7XG4gICRtYXQtc2xpZGVyLWxhYmVsZWQtbWluLXZhbHVlLXRodW1iLWxhYmVsLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNsaWRlci1vZmYpO1xuICAkbWF0LXNsaWRlci1mb2N1cy1yaW5nLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCwgZGVmYXVsdCwgMC4yKTtcbiAgJG1hdC1zbGlkZXItZm9jdXMtcmluZy1taW4tdmFsdWUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgYmFzZSwgMC4xMik7XG4gICRtYXQtc2xpZGVyLXRpY2stY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgYmFzZSwgMC43KTtcbiAgJG1hdC1zbGlkZXItdGljay1zaXplOiAycHg7XG5cbiAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItb2ZmLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1wcmltYXJ5IHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCRwcmltYXJ5KTtcbiAgfVxuXG4gIC5tYXQtYWNjZW50IHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCRhY2NlbnQpO1xuICB9XG5cbiAgLm1hdC13YXJuIHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCR3YXJuKTtcbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLWZvY3VzLXJpbmctY29sb3I7XG4gIH1cblxuICAubWF0LXNsaWRlcjpob3ZlcixcbiAgLmNkay1mb2N1c2VkIHtcbiAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLW9mZi1mb2N1c2VkLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWRpc2FibGVkIHtcbiAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLFxuICAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4gICAgLm1hdC1zbGlkZXItdGh1bWIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItZGlzYWJsZWQtY29sb3I7XG4gICAgfVxuXG4gICAgJjpob3ZlciB7XG4gICAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItZGlzYWJsZWQtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1zbGlkZXItbWluLXZhbHVlIHtcbiAgICAubWF0LXNsaWRlci1mb2N1cy1yaW5nIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLWZvY3VzLXJpbmctbWluLXZhbHVlLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIHtcbiAgICAgIC5tYXQtc2xpZGVyLXRodW1iLFxuICAgICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWF0LXNsaWRlci1sYWJlbGVkLW1pbi12YWx1ZS10aHVtYi1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgJi5jZGstZm9jdXNlZCB7XG4gICAgICAgIC5tYXQtc2xpZGVyLXRodW1iLFxuICAgICAgICAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItbGFiZWxlZC1taW4tdmFsdWUtdGh1bWItbGFiZWwtY29sb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSB7XG4gICAgICAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJG1hdC1zbGlkZXItb2ZmLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlcixcbiAgICAgICYuY2RrLWZvY3VzZWQge1xuICAgICAgICAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci1vZmYtZm9jdXNlZC1jb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgICYubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci10aWNrLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrcyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgICAvLyBGaXJlZm94IGRvZXNuJ3QgZHJhdyB0aGUgZ3JhZGllbnQgY29ycmVjdGx5IHdpdGggJ3RvIHJpZ2h0J1xuICAgIC8vIChzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNDMxOSkuXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgfVxuXG4gIC5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LXNsaWRlci10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LXN0ZXBwZXItdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1zdGVwLWhlYWRlciB7XG4gICAgJi5jZGsta2V5Ym9hcmQtZm9jdXNlZCxcbiAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICB9XG5cbiAgICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSA6aG92ZXIgc3RhdGUgd2lsbCBsaW5nZXIgb24gdGhlIGVsZW1lbnQgYWZ0ZXIgYSB0YXAuXG4gICAgLy8gUmVzZXQgaXQgdmlhIGBAbWVkaWFgIGFmdGVyIHRoZSBkZWNsYXJhdGlvbiwgYmVjYXVzZSB0aGUgbWVkaWEgcXVlcnkgaXNuJ3RcbiAgICAvLyBzdXBwb3J0ZWQgYnkgYWxsIGJyb3dzZXJzIHlldC5cbiAgICBAbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtbGFiZWwsXG4gICAgLm1hdC1zdGVwLW9wdGlvbmFsIHtcbiAgICAgIC8vIFRPRE8oam9zZXBocGVycm90dCk6IFVwZGF0ZSB0byB1c2luZyBhIGNvcnJlY3RlZCBkaXNhYmxlZC10ZXh0IGNvbnRyYXN0XG4gICAgICAvLyBpbnN0ZWFkIG9mIHNlY29uZGFyeS10ZXh0LlxuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICAgIH1cblxuICAgIC5tYXQtc3RlcC1pY29uIHtcbiAgICAgIC8vIFRPRE8oam9zZXBocGVycm90dCk6IFVwZGF0ZSB0byB1c2luZyBhIGNvcnJlY3RlZCBkaXNhYmxlZC10ZXh0IGNvbnRyYXN0XG4gICAgICAvLyBpbnN0ZWFkIG9mIHNlY29uZGFyeS10ZXh0LlxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5LCBkZWZhdWx0LWNvbnRyYXN0KTtcbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCxcbiAgICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLFxuICAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnksIGRlZmF1bHQtY29udHJhc3QpO1xuICAgIH1cblxuICAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZSB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3Ige1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1zdGVwcGVyLWhvcml6b250YWwsIC5tYXQtc3RlcHBlci12ZXJ0aWNhbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgfVxuXG4gIC5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lOjpiZWZvcmUge1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG5cbiAgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsXG4gIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YWZ0ZXIsXG4gIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmUge1xuICAgIGJvcmRlci10b3AtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zdGVwcGVyLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXN0ZXBwZXItdmVydGljYWwsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG5cbiAgLm1hdC1zdGVwLWxhYmVsIHtcbiAgICBmb250OiB7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gICAgICB3ZWlnaHQ6IG1hdC1mb250LXdlaWdodCgkY29uZmlnLCBib2R5LTEpO1xuICAgIH07XG4gIH1cblxuICAubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICB9XG5cbiAgLm1hdC1zdGVwLWxhYmVsLWVycm9yIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgfVxuXG4gIC5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZCB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTIpO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9O1xuICB9XG59XG5cbkBtaXhpbiBtYXQtc29ydC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LXNvcnQtaGVhZGVyLWFycm93IHtcbiAgICAkdGFibGUtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICAgICR0ZXh0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcblxuICAgIC8vIEJlY2F1c2UgdGhlIGFycm93IGlzIG1hZGUgdXAgb2YgbXVsdGlwbGUgZWxlbWVudHMgdGhhdCBhcmUgc3RhY2tlZCBvbiB0b3Agb2YgZWFjaCBvdGhlcixcbiAgICAvLyB3ZSBjYW4ndCB1c2UgdGhlIHNlbWktdHJhc3BhcmVudCBjb2xvciBmcm9tIHRoZSB0aGVtZSBkaXJlY3RseS4gSWYgdGhlIHZhbHVlIGlzIGEgY29sb3JcbiAgICAvLyAqdHlwZSosIHdlIGNvbnZlcnQgaXQgaW50byBhIHNvbGlkIGNvbG9yIGJ5IHRha2luZyB0aGUgb3BhY2l0eSBmcm9tIHRoZSByZ2JhIHZhbHVlIGFuZFxuICAgIC8vIHVzaW5nIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGJhY2tncm91bmQgdG8gcHV0IGludG8gZm9yZWdyb3VuZFxuICAgIC8vIHdoZW4gbWl4aW5nIHRoZSBjb2xvcnMgdG9nZXRoZXIuIE90aGVyd2lzZSwgaWYgaXQgcmVzb2x2ZXMgdG8gc29tZXRoaW5nIGRpZmZlcmVudFxuICAgIC8vIChlLmcuIGl0IHJlc29sdmVzIHRvIGEgQ1NTIHZhcmlhYmxlKSwgd2UgdXNlIHRoZSBjb2xvciBkaXJlY3RseS5cbiAgICBAaWYgKHR5cGUtb2YoJHRhYmxlLWJhY2tncm91bmQpID09IGNvbG9yIGFuZCB0eXBlLW9mKCR0ZXh0LWNvbG9yKSA9PSBjb2xvcikge1xuICAgICAgJHRleHQtb3BhY2l0eTogb3BhY2l0eSgkdGV4dC1jb2xvcik7XG4gICAgICBjb2xvcjogbWl4KCR0YWJsZS1iYWNrZ3JvdW5kLCByZ2JhKCR0ZXh0LWNvbG9yLCAxKSwgKDEgLSAkdGV4dC1vcGFjaXR5KSAqIDEwMCUpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICBjb2xvcjogJHRleHQtY29sb3I7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtc29ydC10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cbkBtaXhpbiBtYXQtdGFicy10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRoZWFkZXItYm9yZGVyOiAxcHggc29saWQgbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcblxuICAubWF0LXRhYi1uYXYtYmFyLFxuICAubWF0LXRhYi1oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206ICRoZWFkZXItYm9yZGVyO1xuICB9XG5cbiAgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIHtcbiAgICAubWF0LXRhYi1uYXYtYmFyLFxuICAgIC5tYXQtdGFiLWhlYWRlciB7XG4gICAgICBib3JkZXItdG9wOiAkaGVhZGVyLWJvcmRlcjtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWxpbmsge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJi5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLXRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBoZWFkZXIgYm9yZGVyIHdoZW4gdGhlcmUgaXMgYSBiYWNrZ3JvdW5kIGNvbG9yXG4gIC5tYXQtdGFiLWdyb3VwW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10gLm1hdC10YWItaGVhZGVyLFxuICAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10ge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgfVxuXG4gIC5tYXQtdGFiLWdyb3VwLCAubWF0LXRhYi1uYXYtYmFyIHtcbiAgICAkdGhlbWUtY29sb3JzOiAoXG4gICAgICBwcmltYXJ5OiAkcHJpbWFyeSxcbiAgICAgIGFjY2VudDogJGFjY2VudCxcbiAgICAgIHdhcm46ICR3YXJuXG4gICAgKTtcblxuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJHRoZW1lLWNvbG9ycyB7XG4gICAgICAvLyBTZXQgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHRhYnNcbiAgICAgICYubWF0LSN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWItbGFiZWwtZm9jdXMoJGNvbG9yKTtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1pbmstYmFyKCRjb2xvcik7XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgaW5rIGJhciB3aGVuIGJhY2tncm91bmQgY29sb3IgaXMgdGhlIHNhbWVcbiAgICAgICAgJi5tYXQtYmFja2dyb3VuZC0jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgX21hdC1pbmstYmFyKCRjb2xvciwgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZWFjaCAkbmFtZSwgJGNvbG9yIGluICR0aGVtZS1jb2xvcnMge1xuICAgICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRhYnMgYW5kIG92ZXJyaWRlIGZvY3VzIGNvbG9yXG4gICAgICAmLm1hdC1iYWNrZ3JvdW5kLSN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWItbGFiZWwtZm9jdXMoJGNvbG9yKTtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWJzLWJhY2tncm91bmQoJGNvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuQG1peGluIF9tYXQtaW5rLWJhcigkY29sb3IsICRodWU6IGRlZmF1bHQpIHtcbiAgLm1hdC1pbmstYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGNvbG9yLCAkaHVlKTtcbiAgfVxufVxuXG5AbWl4aW4gX21hdC10YWItbGFiZWwtZm9jdXMoJHRhYi1mb2N1cy1jb2xvcikge1xuICAubWF0LXRhYi1sYWJlbCxcbiAgLm1hdC10YWItbGluayB7XG4gICAgJi5jZGsta2V5Ym9hcmQtZm9jdXNlZCxcbiAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQge1xuICAgICAgJjpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR0YWItZm9jdXMtY29sb3IsIGxpZ2h0ZXIsIDAuMyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBfbWF0LXRhYnMtYmFja2dyb3VuZCgkYmFja2dyb3VuZC1jb2xvcikge1xuICAvLyBTZXQgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIHRhYiBncm91cFxuICAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWxpbmtzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IpO1xuICB9XG5cbiAgLy8gU2V0IGxhYmVscyB0byBjb250cmFzdCBhZ2FpbnN0IGJhY2tncm91bmRcbiAgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWxpbmsge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QpO1xuXG4gICAgJi5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QsIDAuNCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHBhZ2luYXRpb24gY2hldnJvbnMgdG8gY29udHJhc3QgYmFja2dyb3VuZFxuICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZC1jb2xvciwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cblxuICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZC1jb2xvciwgZGVmYXVsdC1jb250cmFzdCwgMC40KTtcbiAgfVxuXG4gIC8vIFNldCByaXBwbGVzIGNvbG9yIHRvIGJlIHRoZSBjb250cmFzdCBjb2xvciBvZiB0aGUgbmV3IGJhY2tncm91bmQuIE90aGVyd2lzZSB0aGUgcmlwcGxlXG4gIC8vIGNvbG9yIHdpbGwgYmUgYmFzZWQgb24gdGhlIGFwcCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QsIDAuMTIpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdGFicy10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10YWItZ3JvdXAge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LXRhYi1sYWJlbCwgLm1hdC10YWItbGluayB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZywgYnV0dG9uKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYnV0dG9uKTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJ1dHRvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gX21hdC10b29sYmFyLWNvbG9yKCRwYWxldHRlKSB7XG4gIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkcGFsZXR0ZSk7XG4gIGNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsIGRlZmF1bHQtY29udHJhc3QpO1xufVxuXG5AbWl4aW4gX21hdC10b29sYmFyLWZvcm0tZmllbGQtb3ZlcnJpZGVzIHtcbiAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSxcbiAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSxcbiAgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1sYWJlbCxcbiAgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCxcbiAgLm1hdC1zZWxlY3QtdmFsdWUsXG4gIC5tYXQtc2VsZWN0LWFycm93LFxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG5cbiAgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogY3VycmVudENvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdG9vbGJhci10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC10b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGFwcC1iYXIpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJi5tYXQtcHJpbWFyeSB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJHByaW1hcnkpO1xuICAgIH1cblxuICAgICYubWF0LWFjY2VudCB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJHdhcm4pO1xuICAgIH1cblxuICAgIEBpbmNsdWRlIF9tYXQtdG9vbGJhci1mb3JtLWZpZWxkLW92ZXJyaWRlcztcbiAgfVxufVxuXG5AbWl4aW4gbWF0LXRvb2xiYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtdG9vbGJhcixcbiAgLm1hdC10b29sYmFyIGgxLFxuICAubWF0LXRvb2xiYXIgaDIsXG4gIC5tYXQtdG9vbGJhciBoMyxcbiAgLm1hdC10b29sYmFyIGg0LFxuICAubWF0LXRvb2xiYXIgaDUsXG4gIC5tYXQtdG9vbGJhciBoNiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHRpdGxlKTtcbiAgICBtYXJnaW46IDA7XG4gIH1cbn1cblxuXG5cblxuXG4kbWF0LXRvb2x0aXAtdGFyZ2V0LWhlaWdodDogMjJweDtcbiRtYXQtdG9vbHRpcC1mb250LXNpemU6IDEwcHg7XG4kbWF0LXRvb2x0aXAtdmVydGljYWwtcGFkZGluZzogKCRtYXQtdG9vbHRpcC10YXJnZXQtaGVpZ2h0IC0gJG1hdC10b29sdGlwLWZvbnQtc2l6ZSkgLyAyO1xuXG4kbWF0LXRvb2x0aXAtaGFuZHNldC10YXJnZXQtaGVpZ2h0OiAzMHB4O1xuJG1hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplOiAxNHB4O1xuJG1hdC10b29sdGlwLWhhbmRzZXQtdmVydGljYWwtcGFkZGluZzpcbiAgICAoJG1hdC10b29sdGlwLWhhbmRzZXQtdGFyZ2V0LWhlaWdodCAtICRtYXQtdG9vbHRpcC1oYW5kc2V0LWZvbnQtc2l6ZSkgLyAyO1xuXG5AbWl4aW4gbWF0LXRvb2x0aXAtdGhlbWUoJHRoZW1lKSB7XG4gIC5tYXQtdG9vbHRpcCB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRtYXQtZ3JleSwgNzAwLCAwLjkpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdG9vbHRpcC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10b29sdGlwIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICAgIGZvbnQtc2l6ZTogJG1hdC10b29sdGlwLWZvbnQtc2l6ZTtcbiAgICBwYWRkaW5nLXRvcDogJG1hdC10b29sdGlwLXZlcnRpY2FsLXBhZGRpbmc7XG4gICAgcGFkZGluZy1ib3R0b206ICRtYXQtdG9vbHRpcC12ZXJ0aWNhbC1wYWRkaW5nO1xuICB9XG5cbiAgLm1hdC10b29sdGlwLWhhbmRzZXQge1xuICAgIGZvbnQtc2l6ZTogJG1hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplO1xuICAgIHBhZGRpbmctdG9wOiAkbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nO1xuICAgIHBhZGRpbmctYm90dG9tOiAkbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nO1xuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC1zbmFjay1iYXItdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuXG4gIC5tYXQtc25hY2stYmFyLWNvbnRhaW5lciB7XG4gICAgLy8gVXNlIHRoZSBwcmltYXJ5IHRleHQgb24gdGhlIGRhcmsgdGhlbWUsIGV2ZW4gdGhvdWdoIHRoZSBsaWdodGVyIG9uZSB1c2VzXG4gICAgLy8gYSBzZWNvbmRhcnksIGJlY2F1c2UgdGhlIGNvbnRyYXN0IG9uIHRoZSBsaWdodCBwcmltYXJ5IHRleHQgaXMgcG9vci5cbiAgICBjb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsICRkYXJrLXByaW1hcnktdGV4dCwgJGxpZ2h0LXNlY29uZGFyeS10ZXh0KTtcbiAgICBiYWNrZ3JvdW5kOiBpZigkaXMtZGFyay10aGVtZSwgbWFwLWdldCgkbWF0LWdyZXksIDUwKSwgIzMyMzIzMik7XG5cbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbig2LCAkdGhlbWUpO1xuICB9XG5cbiAgLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgICBjb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsIGluaGVyaXQsIG1hdC1jb2xvcigkYWNjZW50KSk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zbmFjay1iYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtc2ltcGxlLXNuYWNrYmFyIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBib2R5LTEpO1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiB7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBpbmhlcml0O1xuICAgICAgc2l6ZTogaW5oZXJpdDtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJ1dHRvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gVGhlbWUgc3R5bGVzIHRoYXQgb25seSBhcHBseSB0byB0aGUgZmlsbCBhcHBlYXJhbmNlIG9mIHRoZSBmb3JtLWZpZWxkLlxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtZmlsbC10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGlzLWRhcmstdGhlbWU6IG1hcC1nZXQoJHRoZW1lLCBpcy1kYXJrKTtcblxuICAkZmlsbC1iYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGJhc2UsIGlmKCRpcy1kYXJrLXRoZW1lLCAwLjEsIDAuMDQpKTtcbiAgJGZpbGwtZGlzYWJsZWQtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBiYXNlLCBpZigkaXMtZGFyay10aGVtZSwgMC4wNSwgMC4wMikpO1xuICAkdW5kZXJsaW5lLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIsIGlmKCRpcy1kYXJrLXRoZW1lLCAwLjUsIDAuNDIpKTtcbiAgJGxhYmVsLWRpc2FibGVkLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLXRleHQpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwge1xuICAgIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRmaWxsLWJhY2tncm91bmQ7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtZmxleCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZmlsbC1kaXNhYmxlZC1iYWNrZ3JvdW5kO1xuICAgIH1cblxuICAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRsYWJlbC1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlOiAwO1xuXG4vLyBBcHBsaWVzIGEgZmxvYXRpbmcgbGFiZWwgYWJvdmUgdGhlIGZvcm0gZmllbGQgY29udHJvbCBpdHNlbGYuXG5AbWl4aW4gX21hdC1mb3JtLWZpZWxkLWZpbGwtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtZmlsbC1kZWR1cGUpXG4gICAgICAgICAgICAgc2NhbGUoJGZvbnQtc2NhbGUpO1xuICB3aWR0aDogMTAwJSAvICRmb250LXNjYWxlICsgJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlO1xuXG4gICRtYXQtZm9ybS1maWVsZC1maWxsLWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlICsgMC4wMDAwMSAhZ2xvYmFsO1xufVxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtZmlsbC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLy8gVGhlIHVuaXQtbGVzcyBsaW5lLWhlaWdodCBmcm9tIHRoZSBmb250IGNvbmZpZy5cbiAgJGxpbmUtaGVpZ2h0OiBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgaW5wdXQpO1xuICAvLyBUaGUgYW1vdW50IHRvIHNjYWxlIHRoZSBmb250IGZvciB0aGUgZmxvYXRpbmcgbGFiZWwgYW5kIHN1YnNjcmlwdC5cbiAgJHN1YnNjcmlwdC1mb250LXNjYWxlOiAwLjc1O1xuICAvLyBUaGUgcGFkZGluZyBvbiB0b3Agb2YgdGhlIGluZml4LlxuICAkaW5maXgtcGFkZGluZy10b3A6IDAuMjVlbTtcbiAgLy8gVGhlIHBhZGRpbmcgYmVsb3cgdGhlIGluZml4LlxuICAkaW5maXgtcGFkZGluZy1ib3R0b206IDAuNzVlbTtcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIGFtb3VudCB3ZSBvZmZzZXQgdGhlIGxhYmVsIGZyb20gdGhlIGlucHV0IHRleHQgaW4gdGhlIGZpbGwgYXBwZWFyYW5jZS5cbiAgJGZpbGwtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ6IC0wLjVlbTtcblxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIHtcbiAgICAubWF0LWZvcm0tZmllbGQtaW5maXgge1xuICAgICAgcGFkZGluZzogJGluZml4LXBhZGRpbmctdG9wIDAgJGluZml4LXBhZGRpbmctYm90dG9tIDA7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZy10b3A7XG4gICAgICBtYXJnaW4tdG9wOiAkZmlsbC1hcHBlYXJhbmNlLWxhYmVsLW9mZnNldDtcbiAgICB9XG5cbiAgICAmLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCB7XG4gICAgICAmLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gICAgICAubWF0LWlucHV0LXNlcnZlcjpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1maWxsLWxhYmVsLWZsb2F0aW5nKFxuICAgICAgICAgICAgICAgICRzdWJzY3JpcHQtZm9udC1zY2FsZSwgJGluZml4LXBhZGRpbmctdG9wICsgJGZpbGwtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQsXG4gICAgICAgICAgICAgICAgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLWZpbGwtbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZy10b3AgKyAkZmlsbC1hcHBlYXJhbmNlLWxhYmVsLW9mZnNldCxcbiAgICAgICAgICAgICAgICAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbi8vIFRoZW1lIHN0eWxlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIGxlZ2FjeSBhcHBlYXJhbmNlIG9mIHRoZSBmb3JtLWZpZWxkLlxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtbGVnYWN5LXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICRsYWJlbC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICR1bmRlcmxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNywgMC40MikpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1oaW50IHtcbiAgICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gICAgICBAaW5jbHVkZSBtYXQtY29udHJvbC1kaXNhYmxlZC11bmRlcmxpbmUoJHVuZGVybGluZS1jb2xvcik7XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGU6IDA7XG5cbi8vIEFwcGxpZXMgYSBmbG9hdGluZyBsYWJlbCBhYm92ZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGl0c2VsZi5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nKCRmb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApIHtcbiAgLy8gV2UgdXNlIHBlcnNwZWN0aXZlIHRvIGZpeCB0aGUgdGV4dCBibHVycmluZXNzIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAvLyBodHRwOi8vd3d3LnVzZXJhZ2VudG1hbi5jb20vYmxvZy8yMDE0LzA1LzA0L2ZpeGluZy10eXBvZ3JhcGh5LWluc2lkZS1vZi0yLWQtY3NzLXRyYW5zZm9ybXMvXG4gIC8vIFRoaXMgcmVzdWx0cyBpbiBhIHNtYWxsIGppdHRlciBhZnRlciB0aGUgbGFiZWwgZmxvYXRzIG9uIEZpcmVmb3gsIHdoaWNoIHRoZVxuICAvLyB0cmFuc2xhdGVaIGZpeGVzLlxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcpIHNjYWxlKCRmb250LXNjYWxlKSBwZXJzcGVjdGl2ZSgxMDBweClcbiAgdHJhbnNsYXRlWigwLjAwMXB4ICsgJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUpO1xuICAvLyBUaGUgdHJpY2tzIGFib3ZlIHVzZWQgdG8gc21vb3RoIG91dCB0aGUgYW5pbWF0aW9uIG9uIGNocm9tZSBhbmQgZmlyZWZveCBhY3R1YWxseSBtYWtlIHRoaW5nc1xuICAvLyB3b3JzZSBvbiBJRSwgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGluIHRoZSBJRSB2ZXJzaW9uLlxuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0kaW5maXgtbWFyZ2luLXRvcCAtICRpbmZpeC1wYWRkaW5nICsgJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUpXG4gICAgICAgICAgICAgICAgICBzY2FsZSgkZm9udC1zY2FsZSk7XG5cbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlO1xuXG4gICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlOiAkbWF0LWZvcm0tZmllbGQtbGVnYWN5LWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuLy8gU2FtZSBhcyBtaXhpbiBhYm92ZSwgYnV0IG9taXRzIHRoZSB0cmFuc2xhdGVaIGZvciBwcmludGluZyBwdXJwb3Nlcy5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KCRmb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApIHtcbiAgLy8gVGhpcyByZXN1bHRzIGluIGEgc21hbGwgaml0dGVyIGFmdGVyIHRoZSBsYWJlbCBmbG9hdHMgb24gRmlyZWZveCwgd2hpY2ggdGhlXG4gIC8vIHRyYW5zbGF0ZVogZml4ZXMuXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtJGluZml4LW1hcmdpbi10b3AgLSAkaW5maXgtcGFkZGluZyArICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlKVxuICAgICAgICAgICAgICAgICAgc2NhbGUoJGZvbnQtc2NhbGUpO1xuICAvLyBUaGUgdHJpY2tzIGFib3ZlIHVzZWQgdG8gc21vb3RoIG91dCB0aGUgYW5pbWF0aW9uIG9uIGNocm9tZSBhbmQgZmlyZWZveCBhY3R1YWxseSBtYWtlIHRoaW5nc1xuICAvLyB3b3JzZSBvbiBJRSwgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGluIHRoZSBJRSB2ZXJzaW9uLlxuICAkbWF0LWZvcm0tZmllbGQtbGVnYWN5LWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUgKyAwLjAwMDAxICFnbG9iYWw7XG59XG5cbkBtaXhpbiBtYXQtZm9ybS1maWVsZC1sZWdhY3ktdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIGFtb3VudCBvZiBzcGFjZSBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhlIGxpbmUgYW5kIHRoZSB0b3Agb2YgdGhlIGFjdHVhbCB0ZXh0XG4gIC8vIChhcyBhIGZyYWN0aW9uIG9mIHRoZSBmb250LXNpemUpLlxuICAkbGluZS1zcGFjaW5nOiAoJGxpbmUtaGVpZ2h0IC0gMSkgLyAyO1xuICAvLyBUaGUgcGFkZGluZyBvbiB0aGUgaW5maXguIE1vY2tzIHNob3cgaGFsZiBvZiB0aGUgdGV4dCBzaXplLCBidXQgc2VlbSB0byBtZWFzdXJlIGZyb20gdGhlIGVkZ2VcbiAgLy8gb2YgdGhlIHRleHQgaXRzZWxmLCBub3QgdGhlIGVkZ2Ugb2YgdGhlIGxpbmU7IHRoZXJlZm9yZSB3ZSBzdWJ0cmFjdCBvZmYgdGhlIGxpbmUgc3BhY2luZy5cbiAgJGluZml4LXBhZGRpbmc6IDAuNWVtIC0gJGxpbmUtc3BhY2luZztcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgLm1hdC1mb3JtLWZpZWxkLWZsZXggYXJlYSBhbmQgdGhlIHN1YnNjcmlwdCB3cmFwcGVyLlxuICAvLyBNb2NrcyBzaG93IGhhbGYgb2YgdGhlIHRleHQgc2l6ZSwgYnV0IHRoaXMgbWFyZ2luIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aXRoIHRoZSBzdWJzY3JpcHRcbiAgLy8gdGV4dCBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBzY2FsZSBmYWN0b3IgdG8gbWFrZSBpdCBoYWxmIG9mIHRoZSBvcmlnaW5hbCB0ZXh0XG4gIC8vIHNpemUuIFdlIGFnYWluIG5lZWQgdG8gc3VidHJhY3Qgb2ZmIHRoZSBsaW5lIHNwYWNpbmcgc2luY2UgdGhlIG1vY2tzIG1lYXN1cmUgdG8gdGhlIGVkZ2Ugb2YgdGhlXG4gIC8vIHRleHQsIG5vdCB0aGUgIGVkZ2Ugb2YgdGhlIGxpbmUuXG4gICRzdWJzY3JpcHQtbWFyZ2luLXRvcDogMC41ZW0gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGUgLSAoJGxpbmUtc3BhY2luZyAqIDIpO1xuICAvLyBUaGUgcGFkZGluZyBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLXdyYXBwZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN1YnNjcmlwdCwgc2luY2UgaXQnc1xuICAvLyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgc3Vic2NyaXB0J3MgbWFyZ2luIGFuZCBsaW5lLWhlaWdodCwgYnV0IHdlXG4gIC8vIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIHN1YnNjcmlwdCBmb250IHNjYWxlIGZhY3RvciBzaW5jZSB0aGUgd3JhcHBlciBoYXMgYSBsYXJnZXIgZm9udCBzaXplLlxuICAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTogKCRzdWJzY3JpcHQtbWFyZ2luLXRvcCArICRsaW5lLWhlaWdodCkgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IHtcbiAgICAubWF0LWZvcm0tZmllbGQtd3JhcHBlciB7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHdyYXBwZXItcGFkZGluZy1ib3R0b207XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgICAgIHBhZGRpbmc6ICRpbmZpeC1wYWRkaW5nIDA7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nKFxuICAgICAgICAgICAgICAgICRzdWJzY3JpcHQtZm9udC1zY2FsZSwgJGluZml4LXBhZGRpbmcsICRpbmZpeC1tYXJnaW4tdG9wKTtcbiAgICAgIH1cblxuICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCB3aWxsIHJlbHkgb24gQXV0b2ZpbGxNb25pdG9yIGluc3RlYWQuXG4gICAgICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbDotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sZWdhY3ktbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLWxlZ2FjeS1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZztcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIHVuZGVybGluZSB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAgIC8vIHNvIHdlIG1vdmUgaXQgdXAgYnkgdGhlIHBhZGRpbmcgYW1vdW50LlxuICAgICAgYm90dG9tOiAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTtcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xuICAgICAgbWFyZ2luLXRvcDogJHN1YnNjcmlwdC1tYXJnaW4tdG9wO1xuXG4gICAgICAvLyBXZSB3YW50IHRoZSBzdWJzY3JpcHQgdG8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudCBib3gsIG5vdCB0aGUgcGFkZGluZyBib3gsXG4gICAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudCAoYWRqdXN0ZWQgZm9yIHRoZSBzbWFsbGVyIGZvbnQgc2l6ZSk7XG4gICAgICB0b3A6IGNhbGMoMTAwJSAtICN7JHdyYXBwZXItcGFkZGluZy1ib3R0b20gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGV9KTtcbiAgICB9XG4gIH1cblxuICAvLyB0cmFuc2xhdGVaIGNhdXNlcyB0aGUgbGFiZWwgdG8gbm90IGFwcGVhciB3aGlsZSBwcmludGluZywgc28gd2Ugb3ZlcnJpZGUgaXQgdG8gbm90XG4gIC8vIGFwcGx5IHRyYW5zbGF0ZVogd2hpbGUgcHJpbnRpbmdcbiAgQG1lZGlhIHByaW50IHtcbiAgICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgICAmLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gICAgICAgIC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KFxuICAgICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCB3aWxsIHJlbHkgb24gQXV0b2ZpbGxNb25pdG9yIGluc3RlYWQuXG4gICAgICAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sZWdhY3ktbGFiZWwtZmxvYXRpbmctcHJpbnQoXG4gICAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgICAgLy8gKHVzZWQgYXMgYSBwdXJlIENTUyBzdGFuZC1pbiBmb3IgbWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0KS5cbiAgICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KFxuICAgICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbi8vIFRoZW1lIHN0eWxlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIG91dGxpbmUgYXBwZWFyYW5jZSBvZiB0aGUgZm9ybS1maWVsZC5cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICRsYWJlbC1kaXNhYmxlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgJG91dGxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuMywgMC4xMikpO1xuICAkb3V0bGluZS1jb2xvci1ob3ZlcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyLCBpZigkaXMtZGFyay10aGVtZSwgMSwgMC44NykpO1xuICAkb3V0bGluZS1jb2xvci1wcmltYXJ5OiBtYXQtY29sb3IoJHByaW1hcnkpO1xuICAkb3V0bGluZS1jb2xvci1hY2NlbnQ6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgJG91dGxpbmUtY29sb3Itd2FybjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgJG91dGxpbmUtY29sb3ItZGlzYWJsZWQ6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuMTUsIDAuMDYpKTtcblxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIHtcbiAgICAubWF0LWZvcm0tZmllbGQtb3V0bGluZSB7XG4gICAgICBjb2xvcjogJG91dGxpbmUtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICAgICAgY29sb3I6ICRvdXRsaW5lLWNvbG9yLWhvdmVyO1xuICAgIH1cblxuICAgICYubWF0LWZvY3VzZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICAgICAgICBjb2xvcjogJG91dGxpbmUtY29sb3ItcHJpbWFyeTtcbiAgICAgIH1cblxuICAgICAgJi5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIHtcbiAgICAgICAgY29sb3I6ICRvdXRsaW5lLWNvbG9yLWFjY2VudDtcbiAgICAgIH1cblxuICAgICAgJi5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gICAgICAgIGNvbG9yOiAkb3V0bGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsYXNzIHJlcGVhdGVkIHNvIHRoYXQgcnVsZSBpcyBzcGVjaWZpYyBlbm91Z2ggdG8gb3ZlcnJpZGUgZm9jdXNlZCBhY2NlbnQgY29sb3IgY2FzZS5cbiAgICAmLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCB7XG4gICAgICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gICAgICAgIGNvbG9yOiAkb3V0bGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRsYWJlbC1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUge1xuICAgICAgICBjb2xvcjogJG91dGxpbmUtY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZGVkdXBlOiAwO1xuXG4vLyBBcHBsaWVzIGEgZmxvYXRpbmcgbGFiZWwgYWJvdmUgdGhlIGZvcm0gZmllbGQgY29udHJvbCBpdHNlbGYuXG5AbWl4aW4gX21hdC1mb3JtLWZpZWxkLW91dGxpbmUtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtb3V0bGluZS1kZWR1cGUpXG4gIHNjYWxlKCRmb250LXNjYWxlKTtcbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWRlZHVwZTtcblxuICAkbWF0LWZvcm0tZmllbGQtb3V0bGluZS1kZWR1cGU6ICRtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIHBhZGRpbmcgYWJvdmUgYW5kIGJlbG93IHRoZSBpbmZpeC5cbiAgJGluZml4LXBhZGRpbmc6IDFlbTtcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgLm1hdC1mb3JtLWZpZWxkLWZsZXggYXJlYSBhbmQgdGhlIHN1YnNjcmlwdCB3cmFwcGVyLlxuICAvLyBNb2NrcyBzaG93IGhhbGYgb2YgdGhlIHRleHQgc2l6ZSwgYnV0IHRoaXMgbWFyZ2luIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aXRoIHRoZSBzdWJzY3JpcHRcbiAgLy8gdGV4dCBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBzY2FsZSBmYWN0b3IgdG8gbWFrZSBpdCBoYWxmIG9mIHRoZSBvcmlnaW5hbCB0ZXh0XG4gIC8vIHNpemUuXG4gICRzdWJzY3JpcHQtbWFyZ2luLXRvcDogMC41ZW0gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG4gIC8vIFRoZSBwYWRkaW5nIGFwcGxpZWQgdG8gdGhlIGZvcm0tZmllbGQtd3JhcHBlciB0byByZXNlcnZlIHNwYWNlIGZvciB0aGUgc3Vic2NyaXB0LCBzaW5jZSBpdCdzXG4gIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZC4gVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJzY3JpcHQncyBtYXJnaW4gYW5kIGxpbmUtaGVpZ2h0LCBidXQgd2VcbiAgLy8gbmVlZCB0byBtdWx0aXBseSBieSB0aGUgc3Vic2NyaXB0IGZvbnQgc2NhbGUgZmFjdG9yIHNpbmNlIHRoZSB3cmFwcGVyIGhhcyBhIGxhcmdlciBmb250IHNpemUuXG4gICR3cmFwcGVyLXBhZGRpbmctYm90dG9tOiAoJHN1YnNjcmlwdC1tYXJnaW4tdG9wICsgJGxpbmUtaGVpZ2h0KSAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIGFtb3VudCB3ZSBvZmZzZXQgdGhlIGxhYmVsIGZyb20gdGhlIGlucHV0IHRleHQgaW4gdGhlIG91dGxpbmUgYXBwZWFyYW5jZS5cbiAgJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ6IC0wLjI1ZW07XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgICAgIHBhZGRpbmc6ICRpbmZpeC1wYWRkaW5nIDAgJGluZml4LXBhZGRpbmcgMDtcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgdG9wOiAkaW5maXgtbWFyZ2luLXRvcCArICRpbmZpeC1wYWRkaW5nO1xuICAgICAgbWFyZ2luLXRvcDogJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtb3V0bGluZS1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nICsgJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQsXG4gICAgICAgICAgICAgICAgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLW91dGxpbmUtbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZyArICRvdXRsaW5lLWFwcGVhcmFuY2UtbGFiZWwtb2Zmc2V0LFxuICAgICAgICAgICAgICAgICRpbmZpeC1tYXJnaW4tdG9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuLy8gVGhlbWUgc3R5bGVzIHRoYXQgb25seSBhcHBseSB0byB0aGUgc3RhbmRhcmQgYXBwZWFyYW5jZSBvZiB0aGUgZm9ybS1maWVsZC5cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICR1bmRlcmxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNywgMC40MikpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3I7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jb250cm9sLWRpc2FibGVkLXVuZGVybGluZSgkdW5kZXJsaW5lLWNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXR5cG9ncmFwaHkoJGNvbmZpZykge31cblxuXG4vLyBUaGVtZSBzdHlsZXMgdGhhdCBhcHBseSB0byBhbGwgYXBwZWFyYW5jZXMgb2YgdGhlIGZvcm0tZmllbGQuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gIC8vIExhYmVsIGNvbG9ycy4gUmVxdWlyZWQgaXMgdXNlZCBmb3IgdGhlIGAqYCBzdGFyIHNob3duIGluIHRoZSBsYWJlbC5cbiAgJGxhYmVsLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0LCBpZigkaXMtZGFyay10aGVtZSwgMC43LCAwLjYpKTtcbiAgJGZvY3VzZWQtbGFiZWwtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICRyZXF1aXJlZC1sYWJlbC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuXG4gIC8vIFVuZGVybGluZSBjb2xvcnMuXG4gICR1bmRlcmxpbmUtY29sb3ItYmFzZTogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyLCBpZigkaXMtZGFyay10aGVtZSwgMSwgMC44NykpO1xuICAkdW5kZXJsaW5lLWNvbG9yLWFjY2VudDogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICAkdW5kZXJsaW5lLWNvbG9yLXdhcm46IG1hdC1jb2xvcigkd2Fybik7XG4gICR1bmRlcmxpbmUtZm9jdXNlZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcblxuICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gIH1cblxuICAubWF0LWhpbnQge1xuICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gIH1cblxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICBjb2xvcjogJGZvY3VzZWQtbGFiZWwtY29sb3I7XG5cbiAgICAmLm1hdC1hY2NlbnQge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYWNjZW50O1xuICAgIH1cblxuICAgICYubWF0LXdhcm4ge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtY29sb3Itd2FybjtcbiAgICB9XG4gIH1cblxuICAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciB7XG4gICAgY29sb3I6ICRyZXF1aXJlZC1sYWJlbC1jb2xvcjtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYmFzZTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWZvY3VzZWQtY29sb3I7XG5cbiAgICAgICYubWF0LWFjY2VudCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYWNjZW50O1xuICAgICAgfVxuXG4gICAgICAmLm1hdC13YXJuIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkge1xuICAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtZm9jdXNlZC1jb2xvcjtcbiAgICB9XG5cbiAgICAmLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci1hY2NlbnQ7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVyIHtcbiAgICAgIGNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yLXdhcm47XG4gICAgfVxuICB9XG5cbiAgLy8gU3R5bGluZyBmb3IgdGhlIGVycm9yIHN0YXRlIG9mIHRoZSBmb3JtIGZpZWxkLiBOb3RlIHRoYXQgd2hpbGUgdGhlIHNhbWUgY2FuIGJlXG4gIC8vIGFjaGlldmVkIHdpdGggdGhlIG5nLSogY2xhc3Nlcywgd2UgdXNlIHRoaXMgYXBwcm9hY2ggaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNhbWVcbiAgLy8gbG9naWMgaXMgdXNlZCB0byBzdHlsZSB0aGUgZXJyb3Igc3RhdGUgYW5kIHRvIHNob3cgdGhlIGVycm9yIG1lc3NhZ2VzLlxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yLXdhcm47XG5cbiAgICAgICYubWF0LWFjY2VudCxcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIge1xuICAgICAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4gICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3Itd2FybjtcbiAgICB9XG4gIH1cblxuICAubWF0LWVycm9yIHtcbiAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICB9XG5cbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtbGVnYWN5LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1mb3JtLWZpZWxkLWZpbGwtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGVtZSgkdGhlbWUpO1xufVxuXG4vLyBVc2VkIHRvIG1ha2UgaW5zdGFuY2VzIG9mIHRoZSBfbWF0LWZvcm0tZmllbGQtbGFiZWwtZmxvYXRpbmcgbWl4aW4gbmVnbGlnaWJseSBkaWZmZXJlbnQsXG4vLyBhbmQgcHJldmVudCBHb29nbGUncyBDU1MgT3B0aW1pemVyIGZyb20gY29sbGFwc2luZyB0aGUgZGVjbGFyYXRpb25zLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWVcbi8vIG9mIHRoZSBzZWxlY3RvcnMgY29udGFpbiBwc2V1ZG8tY2xhc3NlcyBub3QgcmVjb2duaXplZCBpbiBhbGwgYnJvd3NlcnMuIElmIGEgYnJvd3NlciBlbmNvdW50ZXJzXG4vLyBhbiB1bmtub3duIHBzZXVkby1jbGFzcyBpdCB3aWxsIGRpc2NhcmQgdGhlIGVudGlyZSBydWxlIHNldC5cbiRtYXQtZm9ybS1maWVsZC1kZWR1cGU6IDA7XG5cbi8vIEFwcGxpZXMgYSBmbG9hdGluZyBsYWJlbCBhYm92ZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGl0c2VsZi5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtZGVkdXBlKVxuICAgICAgICAgICAgIHNjYWxlKCRmb250LXNjYWxlKTtcbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1kZWR1cGU7XG5cbiAgJG1hdC1mb3JtLWZpZWxkLWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAvLyBUaGUgdW5pdC1sZXNzIGxpbmUtaGVpZ2h0IGZyb20gdGhlIGZvbnQgY29uZmlnLlxuICAkbGluZS1oZWlnaHQ6IG1hdC1saW5lLWhlaWdodCgkY29uZmlnLCBpbnB1dCk7XG5cbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIHByZWZpeCBhbmQgc3VmZml4IGljb25zLlxuICAkcHJlZml4LXN1ZmZpeC1pY29uLWZvbnQtc2NhbGU6IDEuNTtcblxuICAvLyBUaGUgcGFkZGluZyBvbiB0aGUgaW5maXguIE1vY2tzIHNob3cgaGFsZiBvZiB0aGUgdGV4dCBzaXplLlxuICAkaW5maXgtcGFkZGluZzogMC41ZW07XG4gIC8vIFRoZSBtYXJnaW4gYXBwbGllZCB0byB0aGUgZm9ybS1maWVsZC1pbmZpeCB0byByZXNlcnZlIHNwYWNlIGZvciB0aGUgZmxvYXRpbmcgbGFiZWwuXG4gICRpbmZpeC1tYXJnaW4tdG9wOiAxZW0gKiAkbGluZS1oZWlnaHQgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG4gIC8vIEZvbnQgc2l6ZSB0byB1c2UgZm9yIHRoZSBsYWJlbCBhbmQgc3Vic2NyaXB0IHRleHQuXG4gICRzdWJzY3JpcHQtZm9udC1zaXplOiAkc3Vic2NyaXB0LWZvbnQtc2NhbGUgKiAxMDAlO1xuICAvLyBGb250IHNpemUgdG8gdXNlIGZvciB0aGUgZm9yIHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBpY29ucy5cbiAgJHByZWZpeC1zdWZmaXgtaWNvbi1mb250LXNpemU6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zY2FsZSAqIDEwMCU7XG4gIC8vIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBib3R0b20gb2YgdGhlIC5tYXQtZm9ybS1maWVsZC1mbGV4IGFyZWEgYW5kIHRoZSBzdWJzY3JpcHQgd3JhcHBlci5cbiAgLy8gTW9ja3Mgc2hvdyBoYWxmIG9mIHRoZSB0ZXh0IHNpemUsIGJ1dCB0aGlzIG1hcmdpbiBpcyBhcHBsaWVkIHRvIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3Vic2NyaXB0XG4gIC8vIHRleHQgZm9udCBzaXplLCBzbyB3ZSBuZWVkIHRvIGRpdmlkZSBieSB0aGUgc2NhbGUgZmFjdG9yIHRvIG1ha2UgaXQgaGFsZiBvZiB0aGUgb3JpZ2luYWwgdGV4dFxuICAvLyBzaXplLlxuICAkc3Vic2NyaXB0LW1hcmdpbi10b3A6IDAuNWVtIC8gJHN1YnNjcmlwdC1mb250LXNjYWxlO1xuICAvLyBUaGUgcGFkZGluZyBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLXdyYXBwZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN1YnNjcmlwdCwgc2luY2UgaXQnc1xuICAvLyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgc3Vic2NyaXB0J3MgbWFyZ2luIGFuZCBsaW5lLWhlaWdodCwgYnV0IHdlXG4gIC8vIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIHN1YnNjcmlwdCBmb250IHNjYWxlIGZhY3RvciBzaW5jZSB0aGUgd3JhcHBlciBoYXMgYSBsYXJnZXIgZm9udCBzaXplLlxuICAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTogKCRzdWJzY3JpcHQtbWFyZ2luLXRvcCArICRsaW5lLWhlaWdodCkgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG5cbiAgLm1hdC1mb3JtLWZpZWxkIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgaW5wdXQpO1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIge1xuICAgIHBhZGRpbmctYm90dG9tOiAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1wcmVmaXgsXG4gIC5tYXQtZm9ybS1maWVsZC1zdWZmaXgge1xuICAgIC8vIEFsbG93IGljb25zIGluIGEgcHJlZml4IG9yIHN1ZmZpeCB0byBhZGFwdCB0byB0aGUgY29ycmVjdCBzaXplLlxuICAgIC5tYXQtaWNvbiB7XG4gICAgICBmb250LXNpemU6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zaXplO1xuICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBpY29uIGJ1dHRvbnMgaW4gYSBwcmVmaXggb3Igc3VmZml4IHRvIGFkYXB0IHRvIHRoZSBjb3JyZWN0IHNpemUuXG4gICAgLm1hdC1pY29uLWJ1dHRvbiB7XG4gICAgICBoZWlnaHQ6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zY2FsZSAqIDFlbTtcbiAgICAgIHdpZHRoOiAkcHJlZml4LXN1ZmZpeC1pY29uLWZvbnQtc2NhbGUgKiAxZW07XG5cbiAgICAgIC5tYXQtaWNvbiB7XG4gICAgICAgIGhlaWdodDogJGxpbmUtaGVpZ2h0ICogMWVtO1xuICAgICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gICAgcGFkZGluZzogJGluZml4LXBhZGRpbmcgMDtcbiAgICAvLyBUaHJvd3Mgb2ZmIHRoZSBiYXNlbGluZSBpZiB3ZSBkbyBpdCBhcyBhIHJlYWwgbWFyZ2luLCBzbyB3ZSBkbyBpdCBhcyBhIGJvcmRlciBpbnN0ZWFkLlxuICAgIGJvcmRlci10b3A6ICRpbmZpeC1tYXJnaW4tdG9wIHNvbGlkIHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCB7XG4gICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgIC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgIH1cblxuICAgIC8vIFNlcnZlci1zaWRlIHJlbmRlcmVkIG1hdElucHV0IHdpdGggYSBsYWJlbCBhdHRyaWJ1dGUgYnV0IGxhYmVsIG5vdCBzaG93blxuICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIHtcbiAgICB0b3A6IC0kaW5maXgtbWFyZ2luLXRvcDtcbiAgICBwYWRkaW5nLXRvcDogJGluZml4LW1hcmdpbi10b3A7XG4gIH1cblxuICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZztcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICAgIC8vIFdlIHdhbnQgdGhlIHVuZGVybGluZSB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudC5cbiAgICBib3R0b206ICR3cmFwcGVyLXBhZGRpbmctYm90dG9tO1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcbiAgICBmb250LXNpemU6ICRzdWJzY3JpcHQtZm9udC1zaXplO1xuICAgIG1hcmdpbi10b3A6ICRzdWJzY3JpcHQtbWFyZ2luLXRvcDtcblxuICAgIC8vIFdlIHdhbnQgdGhlIHN1YnNjcmlwdCB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudCAoYWRqdXN0ZWQgZm9yIHRoZSBzbWFsbGVyIGZvbnQgc2l6ZSk7XG4gICAgdG9wOiBjYWxjKDEwMCUgLSAjeyR3cmFwcGVyLXBhZGRpbmctYm90dG9tIC8gJHN1YnNjcmlwdC1mb250LXNjYWxlfSk7XG4gIH1cblxuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC1sZWdhY3ktdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtc3RhbmRhcmQtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtZmlsbC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG59XG5cblxuXG5cblxuQG1peGluIG1hdC10cmVlLXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtdHJlZSB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICB9XG5cbiAgLm1hdC10cmVlLW5vZGUsXG4gIC5tYXQtbmVzdGVkLXRyZWUtbm9kZSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC10cmVlLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXRyZWUge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LXRyZWUtbm9kZSxcbiAgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlIHtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cbi8vIEluY2x1ZGVzIGFsbCBvZiB0aGUgdHlwb2dyYXBoaWMgc3R5bGVzLlxuQG1peGluIGFuZ3VsYXItbWF0ZXJpYWwtdHlwb2dyYXBoeSgkY29uZmlnOiBudWxsKSB7XG4gIEBpZiAkY29uZmlnID09IG51bGwge1xuICAgICRjb25maWc6IG1hdC10eXBvZ3JhcGh5LWNvbmZpZygpO1xuICB9XG5cbiAgQGluY2x1ZGUgbWF0LWJhZGdlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1iYXNlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1hdXRvY29tcGxldGUtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWJvdHRvbS1zaGVldC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtYnV0dG9uLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1idXR0b24tdG9nZ2xlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1jYXJkLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1jaGVja2JveC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtY2hpcHMtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXRhYmxlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1kYXRlcGlja2VyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1kaWFsb2ctdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWV4cGFuc2lvbi1wYW5lbC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZ3JpZC1saXN0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1pY29uLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1pbnB1dC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtbWVudS10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtcGFnaW5hdG9yLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1wcm9ncmVzcy1iYXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXByb2dyZXNzLXNwaW5uZXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXJhZGlvLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zZWxlY3QtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXNpZGVuYXYtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXNsaWRlLXRvZ2dsZS10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtc2xpZGVyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zdGVwcGVyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zb3J0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10YWJzLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10b29sYmFyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10b29sdGlwLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1saXN0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1vcHRpb24tdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LW9wdGdyb3VwLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zbmFjay1iYXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXRyZWUtdHlwb2dyYXBoeSgkY29uZmlnKTtcbn1cblxuXG4vLyBNaXhpbiB0aGF0IHJlbmRlcnMgYWxsIG9mIHRoZSBjb3JlIHN0eWxlcyB0aGF0IGFyZSBub3QgdGhlbWUtZGVwZW5kZW50LlxuQG1peGluIG1hdC1jb3JlKCR0eXBvZ3JhcGh5LWNvbmZpZzogbnVsbCkge1xuICBAaW5jbHVkZSBhbmd1bGFyLW1hdGVyaWFsLXR5cG9ncmFwaHkoJHR5cG9ncmFwaHktY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXJpcHBsZSgpO1xuICBAaW5jbHVkZSBjZGstYTExeSgpO1xuICBAaW5jbHVkZSBjZGstb3ZlcmxheSgpO1xuICBAaW5jbHVkZSBjZGstdGV4dC1maWVsZCgpO1xufVxuXG4vLyBNaXhpbiB0aGF0IHJlbmRlcnMgYWxsIG9mIHRoZSBjb3JlIHN0eWxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgdGhlbWUuXG5AbWl4aW4gbWF0LWNvcmUtdGhlbWUoJHRoZW1lKSB7XG4gIEBpbmNsdWRlIG1hdC1yaXBwbGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LW9wdGlvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtb3B0Z3JvdXAtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXBzZXVkby1jaGVja2JveC10aGVtZSgkdGhlbWUpO1xuXG4gIC8vIFByb3ZpZGVzIGV4dGVybmFsIENTUyBjbGFzc2VzIGZvciBlYWNoIGVsZXZhdGlvbiB2YWx1ZS4gRWFjaCBDU1MgY2xhc3MgaXMgZm9ybWF0dGVkIGFzXG4gIC8vIGBtYXQtZWxldmF0aW9uLXokelZhbHVlYCB3aGVyZSBgJHpWYWx1ZWAgY29ycmVzcG9uZHMgdG8gdGhlIHotc3BhY2UgdG8gd2hpY2ggdGhlIGVsZW1lbnQgaXNcbiAgLy8gZWxldmF0ZWQuXG4gIEBmb3IgJHpWYWx1ZSBmcm9tIDAgdGhyb3VnaCAyNCB7XG4gICAgLiN7JF9tYXQtZWxldmF0aW9uLXByZWZpeH0jeyR6VmFsdWV9IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtZWxldmF0aW9uKCR6VmFsdWUsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcHBlciBlbGVtZW50IHRoYXQgcHJvdmlkZXMgdGhlIHRoZW1lIGJhY2tncm91bmQgd2hlbiB0aGUgdXNlcidzIGNvbnRlbnQgaXNuJ3RcbiAgLy8gaW5zaWRlIG9mIGEgYG1hdC1zaWRlbmF2LWNvbnRhaW5lcmAuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlIGFtcGVyc2FuZFxuICAvLyBzZWxlY3RvciBpbiBjYXNlIHRoZSBtaXhpbiBpcyBpbmNsdWRlZCBhdCB0aGUgdG9wIGxldmVsLlxuICAubWF0LWFwcC1iYWNrZ3JvdW5kI3tpZigmLCAnLCAmLm1hdC1hcHAtYmFja2dyb3VuZCcsICcnKX0ge1xuICAgICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgYmFja2dyb3VuZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cblxuICAvLyBNYXJrZXIgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIGhhcyBhZGRlZCBhIHRoZW1lIHRvIHRoZWlyIHBhZ2UuXG4gIEBhdC1yb290IHtcbiAgICAubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1kaXZpZGVyLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZGl2aWRlciB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtZGl2aWRlci12ZXJ0aWNhbCB7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIENyZWF0ZSBhIHRoZW1lLlxuQG1peGluIGFuZ3VsYXItbWF0ZXJpYWwtdGhlbWUoJHRoZW1lKSB7XG4gIEBpbmNsdWRlIG1hdC1jb3JlLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1hdXRvY29tcGxldGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWJhZGdlLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1ib3R0b20tc2hlZXQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWJ1dHRvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtYnV0dG9uLXRvZ2dsZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtY2FyZC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtY2hlY2tib3gtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWNoaXBzLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC10YWJsZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtZGF0ZXBpY2tlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtZGlhbG9nLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1kaXZpZGVyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1leHBhbnNpb24tcGFuZWwtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWdyaWQtbGlzdC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtaWNvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtaW5wdXQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWxpc3QtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LW1lbnUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXBhZ2luYXRvci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtcHJvZ3Jlc3MtYmFyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1wcm9ncmVzcy1zcGlubmVyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1yYWRpby10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc2VsZWN0LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1zaWRlbmF2LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1zbGlkZS10b2dnbGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXNsaWRlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc3RlcHBlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc29ydC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdGFicy10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdG9vbGJhci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdG9vbHRpcC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdHJlZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc25hY2stYmFyLXRoZW1lKCR0aGVtZSk7XG59XG4iLCJAaW1wb3J0ICd+QGFuZ3VsYXIvbWF0ZXJpYWwvdGhlbWluZyc7XG5cbkBpbmNsdWRlIG1hdC1jb3JlKCk7XG5cbi8vIFVzZWQgaHR0cDovL21jZy5tYml0c29uLmNvbSB0byBnZW5lcmF0ZSB0aGUgbWF0ZXJpYWwgcGFsZXR0ZS5cblxuLy8gIzVFMzVCMSAtLSBQUklNQVJZX0NPTE9SXG4kdmVyaWx5LXByaW1hcnk6IChcbiAgICA1MCA6ICNlY2U3ZjYsXG4gICAgMTAwIDogI2NmYzJlOCxcbiAgICAyMDAgOiAjYWY5YWQ4LFxuICAgIDMwMCA6ICM4ZTcyYzgsXG4gICAgNDAwIDogIzc2NTNiZCxcbiAgICA1MDAgOiAjNWUzNWIxLFxuICAgIDYwMCA6ICM1NjMwYWEsXG4gICAgNzAwIDogIzRjMjhhMSxcbiAgICA4MDAgOiAjNDIyMjk4LFxuICAgIDkwMCA6ICMzMTE2ODgsXG4gICAgQTEwMCA6ICNjYmJlZmYsXG4gICAgQTIwMCA6ICNhMzhiZmYsXG4gICAgQTQwMCA6ICM3YTU4ZmYsXG4gICAgQTcwMCA6ICM2NjNlZmYsXG4gICAgY29udHJhc3Q6IChcbiAgICAgICAgNTAgOiAjMDAwMDAwLFxuICAgICAgICAxMDAgOiAjMDAwMDAwLFxuICAgICAgICAyMDAgOiAjMDAwMDAwLFxuICAgICAgICAzMDAgOiAjMDAwMDAwLFxuICAgICAgICA0MDAgOiAjZmZmZmZmLFxuICAgICAgICA1MDAgOiAjZmZmZmZmLFxuICAgICAgICA2MDAgOiAjZmZmZmZmLFxuICAgICAgICA3MDAgOiAjZmZmZmZmLFxuICAgICAgICA4MDAgOiAjZmZmZmZmLFxuICAgICAgICA5MDAgOiAjZmZmZmZmLFxuICAgICAgICBBMTAwIDogIzAwMDAwMCxcbiAgICAgICAgQTIwMCA6ICMwMDAwMDAsXG4gICAgICAgIEE0MDAgOiAjZmZmZmZmLFxuICAgICAgICBBNzAwIDogI2ZmZmZmZixcbiAgICApXG4pO1xuXG5cbi8vICNDNDEwNjEgLS0gU0VDT05EQVJZX0NPTE9SXG4kdmVyaWx5LXNlY29uZGFyeTogKFxuICA1MCA6ICNmOGUyZWMsXG4gIDEwMCA6ICNlZGI3ZDAsXG4gIDIwMCA6ICNlMjg4YjAsXG4gIDMwMCA6ICNkNjU4OTAsXG4gIDQwMCA6ICNjZDM0NzksXG4gIDUwMCA6ICNjNDEwNjEsXG4gIDYwMCA6ICNiZTBlNTksXG4gIDcwMCA6ICNiNjBjNGYsXG4gIDgwMCA6ICNhZjA5NDUsXG4gIDkwMCA6ICNhMjA1MzMsXG4gIEExMDAgOiAjZmZjZGQ5LFxuICBBMjAwIDogI2ZmOWFiMixcbiAgQTQwMCA6ICNmZjY3OGIsXG4gIEE3MDAgOiAjZmY0ZDc3LFxuICBjb250cmFzdDogKFxuICAgICAgNTAgOiAjMDAwMDAwLFxuICAgICAgMTAwIDogIzAwMDAwMCxcbiAgICAgIDIwMCA6ICMwMDAwMDAsXG4gICAgICAzMDAgOiAjMDAwMDAwLFxuICAgICAgNDAwIDogI2ZmZmZmZixcbiAgICAgIDUwMCA6ICNmZmZmZmYsXG4gICAgICA2MDAgOiAjZmZmZmZmLFxuICAgICAgNzAwIDogI2ZmZmZmZixcbiAgICAgIDgwMCA6ICNmZmZmZmYsXG4gICAgICA5MDAgOiAjZmZmZmZmLFxuICAgICAgQTEwMCA6ICMwMDAwMDAsXG4gICAgICBBMjAwIDogIzAwMDAwMCxcbiAgICAgIEE0MDAgOiAjMDAwMDAwLFxuICAgICAgQTcwMCA6ICMwMDAwMDAsXG4gIClcbik7XG5cblxuXG5cbiR2ZXJpbHktYXBwLXByaW1hcnk6IG1hdC1wYWxldHRlKCR2ZXJpbHktcHJpbWFyeSk7XG4kdmVyaWx5LWFwcC1hY2NlbnQ6ICBtYXQtcGFsZXR0ZSgkdmVyaWx5LXNlY29uZGFyeSk7XG5cbiR2ZXJpbHktYXBwLXdhcm46ICAgIG1hdC1wYWxldHRlKCRtYXQtcmVkKTtcblxuJHZlcmlseS1hcHAtdGhlbWU6IG1hdC1saWdodC10aGVtZSgkdmVyaWx5LWFwcC1wcmltYXJ5LCAkdmVyaWx5LWFwcC1hY2NlbnQsICR2ZXJpbHktYXBwLXdhcm4pO1xuXG5AaW5jbHVkZSBhbmd1bGFyLW1hdGVyaWFsLXRoZW1lKCR2ZXJpbHktYXBwLXRoZW1lKTsiLCIvKiBEZWZhdWx0IEFuZ3VsYXIgTWF0ZXJpYWwgcHJlYnVpbHQgdGhlbWUuICovXG4vKiBUaGVtZSBmb3IgdGhlIHJpcHBsZSBlbGVtZW50cy4qL1xuLyogc3R5bGVsaW50LWRpc2FibGUgbWF0ZXJpYWwvbm8tcHJlZml4ZXMgKi9cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vXCIpO1xuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9TW9udHNlcnJhdFwiKTtcbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVdvcmsrU2Fuc1wiKTtcbi5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgZm9udC1zaXplOiA2cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBmb250LXNpemU6IDI0cHg7IH1cblxuLm1hdC1oMSwgLm1hdC1oZWFkbGluZSwgLm1hdC10eXBvZ3JhcGh5IGgxIHtcbiAgZm9udDogNDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwIDAgMTZweDsgfVxuXG4ubWF0LWgyLCAubWF0LXRpdGxlLCAubWF0LXR5cG9ncmFwaHkgaDIge1xuICBmb250OiA1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDMsIC5tYXQtc3ViaGVhZGluZy0yLCAubWF0LXR5cG9ncmFwaHkgaDMge1xuICBmb250OiA0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDQsIC5tYXQtc3ViaGVhZGluZy0xLCAubWF0LXR5cG9ncmFwaHkgaDQge1xuICBmb250OiA0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDUsIC5tYXQtdHlwb2dyYXBoeSBoNSB7XG4gIGZvbnQ6IDQwMCAxMS42MnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIG1hcmdpbjogMCAwIDEycHg7IH1cblxuLm1hdC1oNiwgLm1hdC10eXBvZ3JhcGh5IGg2IHtcbiAgZm9udDogNDAwIDkuMzhweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxMnB4OyB9XG5cbi5tYXQtYm9keS1zdHJvbmcsIC5tYXQtYm9keS0yIHtcbiAgZm9udDogNTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWJvZHksIC5tYXQtYm9keS0xLCAubWF0LXR5cG9ncmFwaHkge1xuICBmb250OiA0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG4gIC5tYXQtYm9keSBwLCAubWF0LWJvZHktMSBwLCAubWF0LXR5cG9ncmFwaHkgcCB7XG4gICAgbWFyZ2luOiAwIDAgMTJweDsgfVxuXG4ubWF0LXNtYWxsLCAubWF0LWNhcHRpb24ge1xuICBmb250OiA0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtZGlzcGxheS00LCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTQge1xuICBmb250OiAzMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIG1hcmdpbjogMCAwIDU2cHg7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wNWVtOyB9XG5cbi5tYXQtZGlzcGxheS0zLCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTMge1xuICBmb250OiA0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCA2NHB4O1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsgfVxuXG4ubWF0LWRpc3BsYXktMiwgLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0yIHtcbiAgZm9udDogNDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwIDAgNjRweDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAwNWVtOyB9XG5cbi5tYXQtZGlzcGxheS0xLCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTEge1xuICBmb250OiA0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCA2NHB4OyB9XG5cbi5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lciB7XG4gIGZvbnQ6IDQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1idXR0b24sIC5tYXQtcmFpc2VkLWJ1dHRvbiwgLm1hdC1pY29uLWJ1dHRvbiwgLm1hdC1zdHJva2VkLWJ1dHRvbixcbi5tYXQtZmxhdC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtY2FyZCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWNhcmQtdGl0bGUge1xuICBmb250LXNpemU6IDI0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1jYXJkLWhlYWRlciAubWF0LWNhcmQtdGl0bGUge1xuICBmb250LXNpemU6IDIwcHg7IH1cblxuLm1hdC1jYXJkLXN1YnRpdGxlLFxuLm1hdC1jYXJkLWNvbnRlbnQge1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1jaGVja2JveCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7IH1cblxuLm1hdC1jaGlwIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNTAwOyB9XG4gIC5tYXQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbixcbiAgLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb24ge1xuICAgIGZvbnQtc2l6ZTogMThweDsgfVxuXG4ubWF0LXRhYmxlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtaGVhZGVyLWNlbGwge1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1jZWxsLCAubWF0LWZvb3Rlci1jZWxsIHtcbiAgZm9udC1zaXplOiAxNHB4OyB9XG5cbi5tYXQtY2FsZW5kYXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5IHtcbiAgZm9udC1zaXplOiAxM3B4OyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCxcbi5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aCB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LWRpYWxvZy10aXRsZSB7XG4gIGZvbnQ6IDUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudCB7XG4gIGZvbnQ6IDQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1mb3JtLWZpZWxkIHtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBmb250LXdlaWdodDogNDAwO1xuICBsaW5lLWhlaWdodDogMS4xMjU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtd3JhcHBlciB7XG4gIHBhZGRpbmctYm90dG9tOiAxLjM0Mzc1ZW07IH1cblxuLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sXG4ubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbiB7XG4gIGZvbnQtc2l6ZTogMTUwJTtcbiAgbGluZS1oZWlnaHQ6IDEuMTI1OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbixcbi5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiB7XG4gIGhlaWdodDogMS41ZW07XG4gIHdpZHRoOiAxLjVlbTsgfVxuICAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLFxuICAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uIHtcbiAgICBoZWlnaHQ6IDEuMTI1ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMTI1OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG4gIGJvcmRlci10b3A6IDAuODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzMzMzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIHtcbiAgdG9wOiAtMC44NDM3NWVtO1xuICBwYWRkaW5nLXRvcDogMC44NDM3NWVtOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gIHRvcDogMS4zNDM3NWVtOyB9XG5cbi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBib3R0b206IDEuMzQzNzVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xuICBmb250LXNpemU6IDc1JTtcbiAgbWFyZ2luLXRvcDogMC42NjY2NjY2N2VtO1xuICB0b3A6IGNhbGMoMTAwJSAtIDEuNzkxNjY2NjdlbSk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVyIHtcbiAgcGFkZGluZy1ib3R0b206IDEuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgcGFkZGluZzogMC40Mzc1ZW0gMDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzMzMzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzM1MzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdG9wOiAxLjI4MTI1ZW07IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBib3R0b206IDEuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcbiAgbWFyZ2luLXRvcDogMC41NDE2NjY2N2VtO1xuICB0b3A6IGNhbGMoMTAwJSAtIDEuNjY2NjY2NjdlbSk7IH1cblxuQG1lZGlhIHByaW50IHtcbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSk7IH1cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbDotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpOyB9XG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSk7IH0gfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gIHBhZGRpbmc6IDAuMjVlbSAwIDAuNzVlbSAwOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdG9wOiAxLjA5Mzc1ZW07XG4gIG1hcmdpbi10b3A6IC0wLjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzMzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgcGFkZGluZzogMWVtIDAgMWVtIDA7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0b3A6IDEuODQzNzVlbTtcbiAgbWFyZ2luLXRvcDogLTAuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzMzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZ3JpZC10aWxlLWhlYWRlcixcbi5tYXQtZ3JpZC10aWxlLWZvb3RlciB7XG4gIGZvbnQtc2l6ZTogMTRweDsgfVxuICAubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lLFxuICAubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIC5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksXG4gICAgLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDEycHg7IH1cblxuaW5wdXQubWF0LWlucHV0LWVsZW1lbnQge1xuICBtYXJnaW4tdG9wOiAtMC4wNjI1ZW07IH1cblxuLm1hdC1tZW51LWl0ZW0ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LXBhZ2luYXRvcixcbi5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEycHg7IH1cblxuLm1hdC1yYWRpby1idXR0b24ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1zZWxlY3Qge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1zZWxlY3QtdHJpZ2dlciB7XG4gIGhlaWdodDogMS4xMjVlbTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LXN0ZXBwZXItdmVydGljYWwsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc3RlcC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yIHtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfVxuXG4ubWF0LXN0ZXAtbGFiZWwtZXJyb3Ige1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNTAwOyB9XG5cbi5tYXQtdGFiLWdyb3VwIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1saW5rIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC10b29sYmFyLFxuLm1hdC10b29sYmFyIGgxLFxuLm1hdC10b29sYmFyIGgyLFxuLm1hdC10b29sYmFyIGgzLFxuLm1hdC10b29sYmFyIGg0LFxuLm1hdC10b29sYmFyIGg1LFxuLm1hdC10b29sYmFyIGg2IHtcbiAgZm9udDogNTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwOyB9XG5cbi5tYXQtdG9vbHRpcCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBwYWRkaW5nLXRvcDogNnB4O1xuICBwYWRkaW5nLWJvdHRvbTogNnB4OyB9XG5cbi5tYXQtdG9vbHRpcC1oYW5kc2V0IHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4OyB9XG5cbi5tYXQtbGlzdC1pdGVtIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtbGlzdC1vcHRpb24ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0ge1xuICBmb250LXNpemU6IDE2cHg7IH1cbiAgLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIC5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTZweDsgfVxuICAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0ge1xuICBmb250LXNpemU6IDEycHg7IH1cbiAgLm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICAubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTJweDsgfVxuICAubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG4gICAgLm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1zdWJoZWFkZXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LW9wdGlvbiB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNnB4OyB9XG5cbi5tYXQtb3B0Z3JvdXAtbGFiZWwge1xuICBmb250OiA1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc2ltcGxlLXNuYWNrYmFyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC10cmVlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtdHJlZS1ub2RlLFxuLm1hdC1uZXN0ZWQtdHJlZS1ub2RlIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zaXplOiAxNHB4OyB9XG5cbi5tYXQtcmlwcGxlIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cblxuLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSwgdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfVxuICBAbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7IH0gfVxuXG4uY2RrLXZpc3VhbGx5LWhpZGRlbiB7XG4gIGJvcmRlcjogMDtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xuICBvdXRsaW5lOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTsgfVxuXG4uY2RrLW92ZXJsYXktY29udGFpbmVyLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlOyB9XG5cbi5jZGstb3ZlcmxheS1jb250YWluZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDEwMDA7IH1cbiAgLmNkay1vdmVybGF5LWNvbnRhaW5lcjplbXB0eSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuXG4uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwMDA7IH1cblxuLmNkay1vdmVybGF5LXBhbmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1heC1oZWlnaHQ6IDEwMCU7IH1cblxuLmNkay1vdmVybGF5LWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO1xuICBvcGFjaXR5OiAwOyB9XG4gIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICBvcGFjaXR5OiAxOyB9XG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICAgICAgb3BhY2l0eTogMC42OyB9IH1cblxuLmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3Age1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOyB9XG5cbi5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcge1xuICBvcGFjaXR5OiAwOyB9XG5cbi5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBtaW4td2lkdGg6IDFweDtcbiAgbWluLWhlaWdodDogMXB4OyB9XG5cbi5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsOyB9XG5cbkBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQge1xuICAvKiEqLyB9XG5cbkBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIHtcbiAgLyohKi8gfVxuXG4uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGwge1xuICBhbmltYXRpb24tbmFtZTogY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7IH1cblxuLmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZDsgfVxuXG50ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUge1xuICByZXNpemU6IG5vbmU7IH1cblxudGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZyB7XG4gIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmc6IDJweCAwICFpbXBvcnRhbnQ7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7IH1cblxuLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKTsgfVxuXG4ubWF0LW9wdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG4gIC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCkge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7IH1cbiAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuICAubWF0LW9wdGlvbi5tYXQtYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG4gIC5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWQge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94IHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cbiAgLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVyIHtcbiAgICBjb2xvcjogI2ZhZmFmYTsgfVxuXG4ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gIGNvbG9yOiAjYjBiMGIwOyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsXG4ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLFxuLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxcbi5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjYzQxMDYxOyB9XG5cbi5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjNWUzNWIxOyB9XG5cbi5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCxcbi5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6ICNiMGIwYjA7IH1cblxuLm1hdC1lbGV2YXRpb24tejAge1xuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejEge1xuICBib3gtc2hhZG93OiAwcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyIHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MyB7XG4gIGJveC1zaGFkb3c6IDBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejQge1xuICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16NSB7XG4gIGJveC1zaGFkb3c6IDBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo2IHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo3IHtcbiAgYm94LXNoYWRvdzogMHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo4IHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo5IHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxMCB7XG4gIGJveC1zaGFkb3c6IDBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejExIHtcbiAgYm94LXNoYWRvdzogMHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MTIge1xuICBib3gtc2hhZG93OiAwcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxMyB7XG4gIGJveC1zaGFkb3c6IDBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejE0IHtcbiAgYm94LXNoYWRvdzogMHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MTUge1xuICBib3gtc2hhZG93OiAwcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxNiB7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxNyB7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxOCB7XG4gIGJveC1zaGFkb3c6IDBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxOSB7XG4gIGJveC1zaGFkb3c6IDBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyMCB7XG4gIGJveC1zaGFkb3c6IDBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MjEge1xuICBib3gtc2hhZG93OiAwcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejIyIHtcbiAgYm94LXNoYWRvdzogMHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyMyB7XG4gIGJveC1zaGFkb3c6IDBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MjQge1xuICBib3gtc2hhZG93OiAwcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1hcHAtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlciB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLm1hdC1hdXRvY29tcGxldGUtcGFuZWwge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcikge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlOyB9XG4gICAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWJhZGdlLWNvbnRlbnQge1xuICBjb2xvcjogd2hpdGU7XG4gIGJhY2tncm91bmQ6ICM1ZTM1YjE7IH1cbiAgQG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIG91dGxpbmU6IHNvbGlkIDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7IH0gfVxuXG4ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjYzQxMDYxO1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgYmFja2dyb3VuZDogI2Y0NDMzNjsgfVxuXG4ubWF0LWJhZGdlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjYjliOWI5O1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWJhZGdlLWNvbnRlbnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTZweDsgfVxuXG4ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB0b3A6IC04cHg7IH1cblxuLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgYm90dG9tOiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiAtMTZweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogYXV0bztcbiAgcmlnaHQ6IC0xNnB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMTZweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnQge1xuICByaWdodDogYXV0bztcbiAgbGVmdDogLTE2cHg7IH1cblxuLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IC04cHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IGF1dG87XG4gIHJpZ2h0OiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtOHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiBhdXRvO1xuICBsZWZ0OiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGxpbmUtaGVpZ2h0OiAyMnB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB0b3A6IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBib3R0b206IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogLTIycHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTIycHg7IH1cblxuLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMjJweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IGF1dG87XG4gIGxlZnQ6IC0yMnB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogLTExcHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTExcHg7IH1cblxuLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMTFweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IGF1dG87XG4gIGxlZnQ6IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgd2lkdGg6IDI4cHg7XG4gIGhlaWdodDogMjhweDtcbiAgbGluZS1oZWlnaHQ6IDI4cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgdG9wOiAtMTRweDsgfVxuXG4ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBib3R0b206IC0xNHB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiAtMjhweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogYXV0bztcbiAgcmlnaHQ6IC0yOHB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMjhweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnQge1xuICByaWdodDogYXV0bztcbiAgbGVmdDogLTI4cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IC0xNHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTE0cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IC0xNHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiBhdXRvO1xuICBsZWZ0OiAtMTRweDsgfVxuXG4ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXIge1xuICBib3gtc2hhZG93OiAwcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtYnV0dG9uLCAubWF0LWljb24tYnV0dG9uLCAubWF0LXN0cm9rZWQtYnV0dG9uIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4gIC5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5IHtcbiAgICBjb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtYWNjZW50LCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCB7XG4gICAgY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1idXR0b24ubWF0LXdhcm4sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4ge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG4gIC5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cbiAgLm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIG9wYWNpdHk6IDAuMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7IH1cblxuLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gIGJhY2tncm91bmQ6IGJsYWNrOyB9XG5cbi5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZmxhdC1idXR0b24sIC5tYXQtcmFpc2VkLWJ1dHRvbiwgLm1hdC1mYWIsIC5tYXQtbWluaS1mYWIge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWZhYi5tYXQtcHJpbWFyeSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSB7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtZmFiLm1hdC1hY2NlbnQsIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCB7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwgLm1hdC1mYWIubWF0LXdhcm4sIC5tYXQtbWluaS1mYWIubWF0LXdhcm4ge1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWZhYi5tYXQtcHJpbWFyeSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LCAubWF0LWZhYi5tYXQtYWNjZW50LCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLCAubWF0LWZhYi5tYXQtd2FybiwgLm1hdC1taW5pLWZhYi5tYXQtd2FybiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyB9XG5cbi5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSwgLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LXJhaXNlZC1idXR0b246bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWZhYjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pLCAubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICBib3gtc2hhZG93OiAwcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pLCAubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gIGJveC1zaGFkb3c6IDBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAge1xuICBib3gtc2hhZG93OiAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gIGJveC1zaGFkb3c6IG5vbmU7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cbiAgLm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7XG4gIGJhY2tncm91bmQ6IHdoaXRlOyB9XG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICBib3JkZXItbGVmdDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlICsgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gIGJvcmRlci1yaWdodDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlICsgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gIGJvcmRlci1yaWdodDogbm9uZTtcbiAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxuICAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsgfVxuICAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7IH1cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxcbi5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgYm9yZGVyOiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWNhcmQge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1jYXJkOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICAgIGJveC1zaGFkb3c6IDBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1jYXJkLm1hdC1jYXJkLWZsYXQ6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtY2FyZC1zdWJ0aXRsZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2hlY2tib3gtZnJhbWUge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1jaGVja2JveC1jaGVja21hcmsge1xuICBmaWxsOiAjZmFmYWZhOyB9XG5cbi5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgge1xuICBzdHJva2U6ICNmYWZhZmEgIWltcG9ydGFudDsgfVxuICBAbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBibGFjay1vbi13aGl0ZSkge1xuICAgIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgge1xuICAgICAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7IH0gfVxuXG4ubWF0LWNoZWNrYm94LW1peGVkbWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7IH1cblxuLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNiMGIwYjA7IH1cblxuLm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1lIHtcbiAgYm9yZGVyLWNvbG9yOiAjYjBiMGIwOyB9XG5cbi5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbkBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSkge1xuICAubWF0LWNoZWNrYm94LWRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7IH0gfVxuXG5AbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lOyB9IH1cblxuLm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWNoZWNrYm94Om5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmUge1xuICAgIGJveC1zaGFkb3c6IDBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuNTQ7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjQ7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlciB7XG4gICAgYmFja2dyb3VuZDogYmxhY2s7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3ZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3ZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxO1xuICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZSB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIG9wYWNpdHk6IDAuNDsgfVxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC10YWJsZSB7XG4gIGJhY2tncm91bmQ6IHdoaXRlOyB9XG5cbi5tYXQtdGFibGUgdGhlYWQsIC5tYXQtdGFibGUgdGJvZHksIC5tYXQtdGFibGUgdGZvb3QsXG5tYXQtaGVhZGVyLXJvdywgbWF0LXJvdywgbWF0LWZvb3Rlci1yb3csXG5bbWF0LWhlYWRlci1yb3ddLCBbbWF0LXJvd10sIFttYXQtZm9vdGVyLXJvd10sXG4ubWF0LXRhYmxlLXN0aWNreSB7XG4gIGJhY2tncm91bmQ6IGluaGVyaXQ7IH1cblxubWF0LXJvdywgbWF0LWhlYWRlci1yb3csIG1hdC1mb290ZXItcm93LFxudGgubWF0LWhlYWRlci1jZWxsLCB0ZC5tYXQtY2VsbCwgdGQubWF0LWZvb3Rlci1jZWxsIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWhlYWRlci1jZWxsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1jZWxsLCAubWF0LWZvb3Rlci1jZWxsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1jYWxlbmRhci1hcnJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1kYXRlcGlja2VyLXRvZ2dsZSxcbi5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b24sXG4ubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXIge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxuXG4ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLFxuLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLFxuLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDQpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCkge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xOCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoOTQsIDUzLCAxNzcsIDAuNCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHdoaXRlOyB9XG5cbi5tYXQtZGF0ZXBpY2tlci1jb250ZW50IHtcbiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTtcbiAgICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTk2LCAxNiwgOTcsIDAuNCk7IH1cbiAgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB3aGl0ZTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDQsIDY3LCA1NCwgMC40KTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB3aGl0ZTsgfVxuXG4ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaCB7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnQge1xuICAgIGNvbG9yOiAjYzQxMDYxOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuIHtcbiAgICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBib3gtc2hhZG93OiAwcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWRpdmlkZXIge1xuICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZGl2aWRlci12ZXJ0aWNhbCB7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbCB7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgICBib3gtc2hhZG93OiAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYWN0aW9uLXJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSkuY2RrLWtleWJvYXJkLWZvY3VzZWQsIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pLmNkay1wcm9ncmFtLWZvY3VzZWQsIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG5AbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSlcbi5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7IH0gfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sXG4ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjYpOyB9XG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPSd0cnVlJ10gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLFxuICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiB7XG4gICAgY29sb3I6IGluaGVyaXQ7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsgfVxuXG4ubWF0LWhpbnQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnQge1xuICAgIGNvbG9yOiAjYzQxMDYxOyB9XG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm4ge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWUzNWIxOyB9XG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVyIHtcbiAgY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudCxcbiAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZXJyb3Ige1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtaGludCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0cHggMTAwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDIpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7XG4gIGJhY2tncm91bmQtc2l6ZTogNHB4IDEwMCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDYpOyB9XG5cbi5tYXQtaWNvbi5tYXQtcHJpbWFyeSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtaWNvbi5tYXQtYWNjZW50IHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC1pY29uLm1hdC13YXJuIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxcbi5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWlucHV0LWVsZW1lbnQge1xuICBjYXJldC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxuICAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDIpOyB9XG4gIC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cbiAgLm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgY2FyZXQtY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxcbi5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudCB7XG4gIGNhcmV0LWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1saXN0LWl0ZW0tZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyB9XG5cbi5tYXQtbGlzdC1vcHRpb246aG92ZXIsIC5tYXQtbGlzdC1vcHRpb246Zm9jdXMsXG4ubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLFxuLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cyxcbi5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsXG4ubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3VzIHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG4ubWF0LW1lbnUtcGFuZWwge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTsgfVxuICAubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1tZW51LWl0ZW0ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVyIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsXG4ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLFxuLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksXG4ubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksXG4ubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSkge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cblxuLm1hdC1wYWdpbmF0b3IsXG4ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlciB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxcbi5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpO1xuICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxcbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCxcbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgZmlsbDogI2NmYzJlODsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2ZjMmU4OyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICBmaWxsOiAjZWRiN2QwOyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VkYjdkMDsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgZmlsbDogI2ZmY2RkMjsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjZGQyOyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLCAubWF0LXNwaW5uZXIgY2lyY2xlIHtcbiAgc3Ryb2tlOiAjNWUzNWIxOyB9XG5cbi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlIHtcbiAgc3Ryb2tlOiAjYzQxMDYxOyB9XG5cbi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGUsIC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGUge1xuICBzdHJva2U6ICNmNDQzMzY7IH1cblxuLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeTphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQ6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlIHtcbiAgYm9yZGVyLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm46YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LXNlbGVjdC12YWx1ZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtdmFsdWUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNlbGVjdC1hcnJvdyB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtc2VsZWN0LXBhbmVsIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cbiAgLm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSkge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93IHtcbiAgY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93IHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWRyYXdlci1jb250YWluZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWRyYXdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2gge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1zaWRlKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1kcmF3ZXItc2lkZSB7XG4gIGJvcmRlci1yaWdodDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZCB7XG4gICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWRyYXdlci1zaWRlIHtcbiAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBib3JkZXItcmlnaHQ6IG5vbmU7IH1cbiAgW2Rpcj0ncnRsJ10gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZCB7XG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5NiwgMTYsIDk3LCAwLjU0KTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg5NCwgNTMsIDE3NywgMC41NCk7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ0LCA2NywgNTQsIDAuNTQpOyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWNoZWNrZWQpIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gIGJveC1zaGFkb3c6IDBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuXG4ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbi5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYixcbi5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbi5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLFxuLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsXG4ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0IHtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5NiwgMTYsIDk3LCAwLjIpOyB9XG5cbi5tYXQtc2xpZGVyOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsXG4uY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCxcbi5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItZGlzYWJsZWQ6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsXG4ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLFxuLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuXG4ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXIge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTsgfVxuXG4ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpOyB9XG5cbi5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCwgLm1hdC1zdGVwLWhlYWRlcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNCk7IH1cblxuQG1lZGlhIChob3Zlcjogbm9uZSkge1xuICAubWF0LXN0ZXAtaGVhZGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lOyB9IH1cblxuLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtbGFiZWwsXG4ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpO1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCxcbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZSxcbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1zdGVwcGVyLWhvcml6b250YWwsIC5tYXQtc3RlcHBlci12ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lOjpiZWZvcmUge1xuICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSxcbi5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YWZ0ZXIsXG4ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LXNvcnQtaGVhZGVyLWFycm93IHtcbiAgY29sb3I6ICM3NTc1NzU7IH1cblxuLm1hdC10YWItbmF2LWJhcixcbi5tYXQtdGFiLWhlYWRlciB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLFxuLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBib3JkZXItYm90dG9tOiBub25lOyB9XG5cbi5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1saW5rIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC10YWItZ3JvdXBbY2xhc3MqPSdtYXQtYmFja2dyb3VuZC0nXSAubWF0LXRhYi1oZWFkZXIsXG4ubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICBib3JkZXItdG9wOiBub25lOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMDcsIDE5NCwgMjMyLCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzcsIDE4MywgMjA4LCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjA1LCAyMTAsIDAuMyk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwNywgMTk0LCAyMzIsIDAuMyk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3MsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rIHtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzcsIDE4MywgMjA4LCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsge1xuICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiB7XG4gIGJvcmRlci1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDIwNSwgMjEwLCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtzLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluaywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluayB7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IH1cblxuLm1hdC10b29sYmFyIHtcbiAgYmFja2dyb3VuZDogd2hpdGVzbW9rZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC10b29sYmFyLm1hdC1wcmltYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiAjNWUzNWIxO1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRvb2xiYXIubWF0LWFjY2VudCB7XG4gICAgYmFja2dyb3VuZDogI2M0MTA2MTtcbiAgICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC10b29sYmFyLm1hdC13YXJuIHtcbiAgICBiYWNrZ3JvdW5kOiAjZjQ0MzM2O1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSxcbiAgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4gIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yOyB9XG4gIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsXG4gIC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC1hcnJvdyxcbiAgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgY29sb3I6IGluaGVyaXQ7IH1cbiAgLm1hdC10b29sYmFyIC5tYXQtaW5wdXQtZWxlbWVudCB7XG4gICAgY2FyZXQtY29sb3I6IGN1cnJlbnRDb2xvcjsgfVxuXG4ubWF0LXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDk3LCA5NywgOTcsIDAuOSk7IH1cblxuLm1hdC10cmVlIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cblxuLm1hdC10cmVlLW5vZGUsXG4ubWF0LW5lc3RlZC10cmVlLW5vZGUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LXNuYWNrLWJhci1jb250YWluZXIge1xuICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICBiYWNrZ3JvdW5kOiAjMzIzMjMyO1xuICBib3gtc2hhZG93OiAwcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLyogVmVyaWx5IGJyYW5kaW5nIGJhc2ljcyAqL1xuKiB7XG4gIGZvbnQtZmFtaWx5OiAnV29yayBTYW5zJywgc2Fucy1zZXJpZjsgfVxuXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucyc7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgc3JjOiBsb2NhbChcIk1hdGVyaWFsIEljb25zXCIpLCBsb2NhbChcIk1hdGVyaWFsSWNvbnMtUmVndWxhclwiKSwgdXJsKC4vYXNzZXRzL21hdGVyaWFsX2ljb25zL01hdGVyaWFsSWNvbnMtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpOyB9XG5cbi5tYXRlcmlhbC1pY29ucyB7XG4gIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgLyogUHJlZmVycmVkIGljb24gc2l6ZSAqL1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgd29yZC13cmFwOiBub3JtYWw7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGRpcmVjdGlvbjogbHRyO1xuICAvKiBTdXBwb3J0IGZvciBhbGwgV2ViS2l0IGJyb3dzZXJzLiAqL1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLyogU3VwcG9ydCBmb3IgU2FmYXJpIGFuZCBDaHJvbWUuICovXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIC8qIFN1cHBvcnQgZm9yIElFLiAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6ICdsaWdhJzsgfVxuXG4vKiBBZGRlZCBmb3IgbmcyLWRyYWd1bGEgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZzItZHJhZ3VsYSAqL1xuLyogaW4tZmxpZ2h0IGNsb25lICovXG4uZ3UtbWlycm9yIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0xMDApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApO1xuICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsgfVxuXG4vKiBoaWdoLXBlcmZvcm1hbmNlIGRpc3BsYXk6bm9uZTsgaGVscGVyICovXG4uZ3UtaGlkZSB7XG4gIGxlZnQ6IC05OTk5cHggIWltcG9ydGFudDsgfVxuXG4vKiBhZGRlZCB0byBtaXJyb3JDb250YWluZXIgKGRlZmF1bHQgPSBib2R5KSB3aGlsZSBkcmFnZ2luZyAqL1xuLmd1LXVuc2VsZWN0YWJsZSB7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgY3Vyc29yOiBncmFiYmluZyAhaW1wb3J0YW50O1xuICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7XG4gIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsgfVxuXG4vKiBhZGRlZCB0byB0aGUgc291cmNlIGVsZW1lbnQgd2hpbGUgaXRzIG1pcnJvciBpcyBkcmFnZ2VkICovXG4uZ3UtdHJhbnNpdCB7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MjApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7XG4gIG9wYWNpdHk6IDAuMjsgfVxuXG4ubWF0LWFwcC1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDtcbiAgLyogR3JleSA5MDAgKi8gfVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwcHg7IH1cbiJdfQ== */", '', '']] +module.exports = [[module.i, "\n@import url(\"https://fonts.googleapis.com/css?family=Roboto+Mono\");\n@import url(\"https://fonts.googleapis.com/css?family=Montserrat\");\n@import url(\"https://fonts.googleapis.com/css?family=Work+Sans\");\n/* Default Angular Material prebuilt theme. */\n/* Theme for the ripple elements.*/\n/* stylelint-disable material/no-prefixes */\n/* stylelint-enable */\n.mat-badge-content {\n font-weight: 600;\n font-size: 12px;\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-badge-small .mat-badge-content {\n font-size: 6px; }\n.mat-badge-large .mat-badge-content {\n font-size: 24px; }\n.mat-h1, .mat-headline, .mat-typography h1 {\n font: 400 24px/32px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h2, .mat-title, .mat-typography h2 {\n font: 500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h3, .mat-subheading-2, .mat-typography h3 {\n font: 400 16px/28px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h4, .mat-subheading-1, .mat-typography h4 {\n font: 400 15px/24px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 16px; }\n.mat-h5, .mat-typography h5 {\n font: 400 11.62px/20px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 12px; }\n.mat-h6, .mat-typography h6 {\n font: 400 9.38px/20px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 12px; }\n.mat-body-strong, .mat-body-2 {\n font: 500 14px/24px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-body, .mat-body-1, .mat-typography {\n font: 400 14px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-body p, .mat-body-1 p, .mat-typography p {\n margin: 0 0 12px; }\n.mat-small, .mat-caption {\n font: 400 12px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-display-4, .mat-typography .mat-display-4 {\n font: 300 112px/112px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 56px;\n letter-spacing: -0.05em; }\n.mat-display-3, .mat-typography .mat-display-3 {\n font: 400 56px/56px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 64px;\n letter-spacing: -0.02em; }\n.mat-display-2, .mat-typography .mat-display-2 {\n font: 400 45px/48px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 64px;\n letter-spacing: -0.005em; }\n.mat-display-1, .mat-typography .mat-display-1 {\n font: 400 34px/40px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0 0 64px; }\n.mat-bottom-sheet-container {\n font: 400 14px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-button, .mat-raised-button, .mat-icon-button, .mat-stroked-button,\n.mat-flat-button, .mat-fab, .mat-mini-fab {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 500; }\n.mat-button-toggle {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-card {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-card-title {\n font-size: 24px;\n font-weight: 500; }\n.mat-card-header .mat-card-title {\n font-size: 20px; }\n.mat-card-subtitle,\n.mat-card-content {\n font-size: 14px; }\n.mat-checkbox {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-checkbox-layout .mat-checkbox-label {\n line-height: 24px; }\n.mat-chip {\n font-size: 14px;\n font-weight: 500; }\n.mat-chip .mat-chip-trailing-icon.mat-icon,\n .mat-chip .mat-chip-remove.mat-icon {\n font-size: 18px; }\n.mat-table {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-header-cell {\n font-size: 12px;\n font-weight: 500; }\n.mat-cell, .mat-footer-cell {\n font-size: 14px; }\n.mat-calendar {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-calendar-body {\n font-size: 13px; }\n.mat-calendar-body-label,\n.mat-calendar-period-button {\n font-size: 14px;\n font-weight: 500; }\n.mat-calendar-table-header th {\n font-size: 11px;\n font-weight: 400; }\n.mat-dialog-title {\n font: 500 20px/32px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-expansion-panel-header {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 15px;\n font-weight: 400; }\n.mat-expansion-panel-content {\n font: 400 14px/20px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-form-field {\n font-size: inherit;\n font-weight: 400;\n line-height: 1.125;\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-form-field-wrapper {\n padding-bottom: 1.34375em; }\n.mat-form-field-prefix .mat-icon,\n.mat-form-field-suffix .mat-icon {\n font-size: 150%;\n line-height: 1.125; }\n.mat-form-field-prefix .mat-icon-button,\n.mat-form-field-suffix .mat-icon-button {\n height: 1.5em;\n width: 1.5em; }\n.mat-form-field-prefix .mat-icon-button .mat-icon,\n .mat-form-field-suffix .mat-icon-button .mat-icon {\n height: 1.125em;\n line-height: 1.125; }\n.mat-form-field-infix {\n padding: 0.5em 0;\n border-top: 0.84375em solid transparent; }\n.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.34375em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.34374em) scale(0.75);\n width: 133.33334333%; }\n.mat-form-field-label-wrapper {\n top: -0.84375em;\n padding-top: 0.84375em; }\n.mat-form-field-label {\n top: 1.34375em; }\n.mat-form-field-underline {\n bottom: 1.34375em; }\n.mat-form-field-subscript-wrapper {\n font-size: 75%;\n margin-top: 0.66666667em;\n top: calc(100% - 1.79166667em); }\n.mat-form-field-appearance-legacy .mat-form-field-wrapper {\n padding-bottom: 1.25em; }\n.mat-form-field-appearance-legacy .mat-form-field-infix {\n padding: 0.4375em 0; }\n.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.001px);\n -ms-transform: translateY(-1.28125em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00101px);\n -ms-transform: translateY(-1.28124em) scale(0.75);\n width: 133.33334333%; }\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00102px);\n -ms-transform: translateY(-1.28123em) scale(0.75);\n width: 133.33335333%; }\n.mat-form-field-appearance-legacy .mat-form-field-label {\n top: 1.28125em; }\n.mat-form-field-appearance-legacy .mat-form-field-underline {\n bottom: 1.25em; }\n.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper {\n margin-top: 0.54166667em;\n top: calc(100% - 1.66666667em); }\n@media print {\n .mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.28122em) scale(0.75); }\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.28121em) scale(0.75); }\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.2812em) scale(0.75); } }\n.mat-form-field-appearance-fill .mat-form-field-infix {\n padding: 0.25em 0 0.75em 0; }\n.mat-form-field-appearance-fill .mat-form-field-label {\n top: 1.09375em;\n margin-top: -0.5em; }\n.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-0.59375em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-0.59374em) scale(0.75);\n width: 133.33334333%; }\n.mat-form-field-appearance-outline .mat-form-field-infix {\n padding: 1em 0 1em 0; }\n.mat-form-field-appearance-outline .mat-form-field-label {\n top: 1.84375em;\n margin-top: -0.25em; }\n.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\n transform: translateY(-1.59375em) scale(0.75);\n width: 133.33333333%; }\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\n.mat-form-field-label {\n transform: translateY(-1.59374em) scale(0.75);\n width: 133.33334333%; }\n.mat-grid-tile-header,\n.mat-grid-tile-footer {\n font-size: 14px; }\n.mat-grid-tile-header .mat-line,\n .mat-grid-tile-footer .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-grid-tile-header .mat-line:nth-child(n+2),\n .mat-grid-tile-footer .mat-line:nth-child(n+2) {\n font-size: 12px; }\ninput.mat-input-element {\n margin-top: -0.0625em; }\n.mat-menu-item {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 400; }\n.mat-paginator,\n.mat-paginator-page-size .mat-select-trigger {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 12px; }\n.mat-radio-button {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-select {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-select-trigger {\n height: 1.125em; }\n.mat-slide-toggle-content {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-slider-thumb-label-text {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 12px;\n font-weight: 500; }\n.mat-stepper-vertical, .mat-stepper-horizontal {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-step-label {\n font-size: 14px;\n font-weight: 400; }\n.mat-step-sub-label-error {\n font-weight: normal; }\n.mat-step-label-error {\n font-size: 14px; }\n.mat-step-label-selected {\n font-size: 14px;\n font-weight: 500; }\n.mat-tab-group {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-tab-label, .mat-tab-link {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 500; }\n.mat-toolbar,\n.mat-toolbar h1,\n.mat-toolbar h2,\n.mat-toolbar h3,\n.mat-toolbar h4,\n.mat-toolbar h5,\n.mat-toolbar h6 {\n font: 500 20px/32px Roboto, \"Helvetica Neue\", sans-serif;\n margin: 0; }\n.mat-tooltip {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 10px;\n padding-top: 6px;\n padding-bottom: 6px; }\n.mat-tooltip-handset {\n font-size: 14px;\n padding-top: 8px;\n padding-bottom: 8px; }\n.mat-list-item {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-list-option {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-list-base .mat-list-item {\n font-size: 16px; }\n.mat-list-base .mat-list-item .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base .mat-list-item .mat-line:nth-child(n+2) {\n font-size: 14px; }\n.mat-list-base .mat-list-option {\n font-size: 16px; }\n.mat-list-base .mat-list-option .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base .mat-list-option .mat-line:nth-child(n+2) {\n font-size: 14px; }\n.mat-list-base .mat-subheader {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px;\n font-weight: 500; }\n.mat-list-base[dense] .mat-list-item {\n font-size: 12px; }\n.mat-list-base[dense] .mat-list-item .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2) {\n font-size: 12px; }\n.mat-list-base[dense] .mat-list-option {\n font-size: 12px; }\n.mat-list-base[dense] .mat-list-option .mat-line {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n box-sizing: border-box; }\n.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2) {\n font-size: 12px; }\n.mat-list-base[dense] .mat-subheader {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 12px;\n font-weight: 500; }\n.mat-option {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 16px; }\n.mat-optgroup-label {\n font: 500 14px/24px Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-simple-snackbar {\n font-family: Roboto, \"Helvetica Neue\", sans-serif;\n font-size: 14px; }\n.mat-simple-snackbar-action {\n line-height: 1;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500; }\n.mat-tree {\n font-family: Roboto, \"Helvetica Neue\", sans-serif; }\n.mat-tree-node,\n.mat-nested-tree-node {\n font-weight: 400;\n font-size: 14px; }\n.mat-ripple {\n overflow: hidden;\n position: relative; }\n.mat-ripple.mat-ripple-unbounded {\n overflow: visible; }\n.mat-ripple-element {\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n transition: opacity, transform 0ms cubic-bezier(0, 0, 0.2, 1);\n transform: scale(0); }\n@media (-ms-high-contrast: active) {\n .mat-ripple-element {\n display: none; } }\n.cdk-visually-hidden {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n outline: 0;\n -webkit-appearance: none;\n -moz-appearance: none; }\n.cdk-overlay-container, .cdk-global-overlay-wrapper {\n pointer-events: none;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%; }\n.cdk-overlay-container {\n position: fixed;\n z-index: 1000; }\n.cdk-overlay-container:empty {\n display: none; }\n.cdk-global-overlay-wrapper {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n z-index: 1000; }\n.cdk-overlay-pane {\n position: absolute;\n pointer-events: auto;\n box-sizing: border-box;\n z-index: 1000;\n display: -ms-flexbox;\n display: flex;\n max-width: 100%;\n max-height: 100%; }\n.cdk-overlay-backdrop {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1000;\n pointer-events: auto;\n -webkit-tap-highlight-color: transparent;\n transition: opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);\n opacity: 0; }\n.cdk-overlay-backdrop.cdk-overlay-backdrop-showing {\n opacity: 1; }\n@media screen and (-ms-high-contrast: active) {\n .cdk-overlay-backdrop.cdk-overlay-backdrop-showing {\n opacity: 0.6; } }\n.cdk-overlay-dark-backdrop {\n background: rgba(0, 0, 0, 0.32); }\n.cdk-overlay-transparent-backdrop, .cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing {\n opacity: 0; }\n.cdk-overlay-connected-position-bounding-box {\n position: absolute;\n z-index: 1000;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 1px;\n min-height: 1px; }\n.cdk-global-scrollblock {\n position: fixed;\n width: 100%;\n overflow-y: scroll; }\n@-webkit-keyframes cdk-text-field-autofill-start {\n /*!*/ }\n@keyframes cdk-text-field-autofill-start {\n /*!*/ }\n@-webkit-keyframes cdk-text-field-autofill-end {\n /*!*/ }\n@keyframes cdk-text-field-autofill-end {\n /*!*/ }\n.cdk-text-field-autofill-monitored:-webkit-autofill {\n -webkit-animation-name: cdk-text-field-autofill-start;\n animation-name: cdk-text-field-autofill-start; }\n.cdk-text-field-autofill-monitored:not(:-webkit-autofill) {\n -webkit-animation-name: cdk-text-field-autofill-end;\n animation-name: cdk-text-field-autofill-end; }\ntextarea.cdk-textarea-autosize {\n resize: none; }\ntextarea.cdk-textarea-autosize-measuring {\n height: auto !important;\n overflow: hidden !important;\n padding: 2px 0 !important;\n box-sizing: content-box !important; }\n.mat-ripple-element {\n background-color: rgba(0, 0, 0, 0.1); }\n.mat-option {\n color: rgba(0, 0, 0, 0.87); }\n.mat-option:hover:not(.mat-option-disabled), .mat-option:focus:not(.mat-option-disabled) {\n background: rgba(0, 0, 0, 0.04); }\n.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled) {\n background: rgba(0, 0, 0, 0.04); }\n.mat-option.mat-active {\n background: rgba(0, 0, 0, 0.04);\n color: rgba(0, 0, 0, 0.87); }\n.mat-option.mat-option-disabled {\n color: rgba(0, 0, 0, 0.38); }\n.mat-primary .mat-option.mat-selected:not(.mat-option-disabled) {\n color: #5e35b1; }\n.mat-accent .mat-option.mat-selected:not(.mat-option-disabled) {\n color: #c41061; }\n.mat-warn .mat-option.mat-selected:not(.mat-option-disabled) {\n color: #f44336; }\n.mat-optgroup-label {\n color: rgba(0, 0, 0, 0.54); }\n.mat-optgroup-disabled .mat-optgroup-label {\n color: rgba(0, 0, 0, 0.38); }\n.mat-pseudo-checkbox {\n color: rgba(0, 0, 0, 0.54); }\n.mat-pseudo-checkbox::after {\n color: #fafafa; }\n.mat-pseudo-checkbox-disabled {\n color: #b0b0b0; }\n.mat-pseudo-checkbox-checked,\n.mat-pseudo-checkbox-indeterminate,\n.mat-accent .mat-pseudo-checkbox-checked,\n.mat-accent .mat-pseudo-checkbox-indeterminate {\n background: #c41061; }\n.mat-primary .mat-pseudo-checkbox-checked,\n.mat-primary .mat-pseudo-checkbox-indeterminate {\n background: #5e35b1; }\n.mat-warn .mat-pseudo-checkbox-checked,\n.mat-warn .mat-pseudo-checkbox-indeterminate {\n background: #f44336; }\n.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,\n.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled {\n background: #b0b0b0; }\n.mat-elevation-z0 {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z1 {\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z2 {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z3 {\n box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z4 {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z5 {\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z6 {\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z7 {\n box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z8 {\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z9 {\n box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z10 {\n box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z11 {\n box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z12 {\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z13 {\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z14 {\n box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z15 {\n box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z16 {\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z17 {\n box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z18 {\n box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z19 {\n box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z20 {\n box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z21 {\n box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z22 {\n box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z23 {\n box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12); }\n.mat-elevation-z24 {\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); }\n.mat-app-background {\n background-color: #fafafa;\n color: rgba(0, 0, 0, 0.87); }\n.mat-theme-loaded-marker {\n display: none; }\n.mat-autocomplete-panel {\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-autocomplete-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover) {\n background: white; }\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled) {\n color: rgba(0, 0, 0, 0.87); }\n.mat-badge-content {\n color: white;\n background: #5e35b1; }\n@media (-ms-high-contrast: active) {\n .mat-badge-content {\n outline: solid 1px;\n border-radius: 0; } }\n.mat-badge-accent .mat-badge-content {\n background: #c41061;\n color: white; }\n.mat-badge-warn .mat-badge-content {\n color: white;\n background: #f44336; }\n.mat-badge {\n position: relative; }\n.mat-badge-hidden .mat-badge-content {\n display: none; }\n.mat-badge-disabled .mat-badge-content {\n background: #b9b9b9;\n color: rgba(0, 0, 0, 0.38); }\n.mat-badge-content {\n position: absolute;\n text-align: center;\n display: inline-block;\n border-radius: 50%;\n transition: transform 200ms ease-in-out;\n transform: scale(0.6);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n pointer-events: none; }\n.mat-badge-content.mat-badge-active {\n transform: none; }\n.mat-badge-small .mat-badge-content {\n width: 16px;\n height: 16px;\n line-height: 16px; }\n.mat-badge-small.mat-badge-above .mat-badge-content {\n top: -8px; }\n.mat-badge-small.mat-badge-below .mat-badge-content {\n bottom: -8px; }\n.mat-badge-small.mat-badge-before .mat-badge-content {\n left: -16px; }\n[dir='rtl'] .mat-badge-small.mat-badge-before .mat-badge-content {\n left: auto;\n right: -16px; }\n.mat-badge-small.mat-badge-after .mat-badge-content {\n right: -16px; }\n[dir='rtl'] .mat-badge-small.mat-badge-after .mat-badge-content {\n right: auto;\n left: -16px; }\n.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: -8px; }\n[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: auto;\n right: -8px; }\n.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: -8px; }\n[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: auto;\n left: -8px; }\n.mat-badge-medium .mat-badge-content {\n width: 22px;\n height: 22px;\n line-height: 22px; }\n.mat-badge-medium.mat-badge-above .mat-badge-content {\n top: -11px; }\n.mat-badge-medium.mat-badge-below .mat-badge-content {\n bottom: -11px; }\n.mat-badge-medium.mat-badge-before .mat-badge-content {\n left: -22px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-before .mat-badge-content {\n left: auto;\n right: -22px; }\n.mat-badge-medium.mat-badge-after .mat-badge-content {\n right: -22px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-after .mat-badge-content {\n right: auto;\n left: -22px; }\n.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: -11px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: auto;\n right: -11px; }\n.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: -11px; }\n[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: auto;\n left: -11px; }\n.mat-badge-large .mat-badge-content {\n width: 28px;\n height: 28px;\n line-height: 28px; }\n.mat-badge-large.mat-badge-above .mat-badge-content {\n top: -14px; }\n.mat-badge-large.mat-badge-below .mat-badge-content {\n bottom: -14px; }\n.mat-badge-large.mat-badge-before .mat-badge-content {\n left: -28px; }\n[dir='rtl'] .mat-badge-large.mat-badge-before .mat-badge-content {\n left: auto;\n right: -28px; }\n.mat-badge-large.mat-badge-after .mat-badge-content {\n right: -28px; }\n[dir='rtl'] .mat-badge-large.mat-badge-after .mat-badge-content {\n right: auto;\n left: -28px; }\n.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: -14px; }\n[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content {\n left: auto;\n right: -14px; }\n.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: -14px; }\n[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content {\n right: auto;\n left: -14px; }\n.mat-bottom-sheet-container {\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-button, .mat-icon-button, .mat-stroked-button {\n color: inherit;\n background: transparent; }\n.mat-button.mat-primary, .mat-icon-button.mat-primary, .mat-stroked-button.mat-primary {\n color: #5e35b1; }\n.mat-button.mat-accent, .mat-icon-button.mat-accent, .mat-stroked-button.mat-accent {\n color: #c41061; }\n.mat-button.mat-warn, .mat-icon-button.mat-warn, .mat-stroked-button.mat-warn {\n color: #f44336; }\n.mat-button.mat-primary[disabled], .mat-button.mat-accent[disabled], .mat-button.mat-warn[disabled], .mat-button[disabled][disabled], .mat-icon-button.mat-primary[disabled], .mat-icon-button.mat-accent[disabled], .mat-icon-button.mat-warn[disabled], .mat-icon-button[disabled][disabled], .mat-stroked-button.mat-primary[disabled], .mat-stroked-button.mat-accent[disabled], .mat-stroked-button.mat-warn[disabled], .mat-stroked-button[disabled][disabled] {\n color: rgba(0, 0, 0, 0.26); }\n.mat-button.mat-primary .mat-button-focus-overlay, .mat-icon-button.mat-primary .mat-button-focus-overlay, .mat-stroked-button.mat-primary .mat-button-focus-overlay {\n background-color: #5e35b1; }\n.mat-button.mat-accent .mat-button-focus-overlay, .mat-icon-button.mat-accent .mat-button-focus-overlay, .mat-stroked-button.mat-accent .mat-button-focus-overlay {\n background-color: #c41061; }\n.mat-button.mat-warn .mat-button-focus-overlay, .mat-icon-button.mat-warn .mat-button-focus-overlay, .mat-stroked-button.mat-warn .mat-button-focus-overlay {\n background-color: #f44336; }\n.mat-button[disabled] .mat-button-focus-overlay, .mat-icon-button[disabled] .mat-button-focus-overlay, .mat-stroked-button[disabled] .mat-button-focus-overlay {\n background-color: transparent; }\n.mat-button .mat-ripple-element, .mat-icon-button .mat-ripple-element, .mat-stroked-button .mat-ripple-element {\n opacity: 0.1;\n background-color: currentColor; }\n.mat-button-focus-overlay {\n background: black; }\n.mat-stroked-button:not([disabled]) {\n border-color: rgba(0, 0, 0, 0.12); }\n.mat-flat-button, .mat-raised-button, .mat-fab, .mat-mini-fab {\n color: rgba(0, 0, 0, 0.87);\n background-color: white; }\n.mat-flat-button.mat-primary, .mat-raised-button.mat-primary, .mat-fab.mat-primary, .mat-mini-fab.mat-primary {\n color: white; }\n.mat-flat-button.mat-accent, .mat-raised-button.mat-accent, .mat-fab.mat-accent, .mat-mini-fab.mat-accent {\n color: white; }\n.mat-flat-button.mat-warn, .mat-raised-button.mat-warn, .mat-fab.mat-warn, .mat-mini-fab.mat-warn {\n color: white; }\n.mat-flat-button.mat-primary[disabled], .mat-flat-button.mat-accent[disabled], .mat-flat-button.mat-warn[disabled], .mat-flat-button[disabled][disabled], .mat-raised-button.mat-primary[disabled], .mat-raised-button.mat-accent[disabled], .mat-raised-button.mat-warn[disabled], .mat-raised-button[disabled][disabled], .mat-fab.mat-primary[disabled], .mat-fab.mat-accent[disabled], .mat-fab.mat-warn[disabled], .mat-fab[disabled][disabled], .mat-mini-fab.mat-primary[disabled], .mat-mini-fab.mat-accent[disabled], .mat-mini-fab.mat-warn[disabled], .mat-mini-fab[disabled][disabled] {\n color: rgba(0, 0, 0, 0.26); }\n.mat-flat-button.mat-primary, .mat-raised-button.mat-primary, .mat-fab.mat-primary, .mat-mini-fab.mat-primary {\n background-color: #5e35b1; }\n.mat-flat-button.mat-accent, .mat-raised-button.mat-accent, .mat-fab.mat-accent, .mat-mini-fab.mat-accent {\n background-color: #c41061; }\n.mat-flat-button.mat-warn, .mat-raised-button.mat-warn, .mat-fab.mat-warn, .mat-mini-fab.mat-warn {\n background-color: #f44336; }\n.mat-flat-button.mat-primary[disabled], .mat-flat-button.mat-accent[disabled], .mat-flat-button.mat-warn[disabled], .mat-flat-button[disabled][disabled], .mat-raised-button.mat-primary[disabled], .mat-raised-button.mat-accent[disabled], .mat-raised-button.mat-warn[disabled], .mat-raised-button[disabled][disabled], .mat-fab.mat-primary[disabled], .mat-fab.mat-accent[disabled], .mat-fab.mat-warn[disabled], .mat-fab[disabled][disabled], .mat-mini-fab.mat-primary[disabled], .mat-mini-fab.mat-accent[disabled], .mat-mini-fab.mat-warn[disabled], .mat-mini-fab[disabled][disabled] {\n background-color: rgba(0, 0, 0, 0.12); }\n.mat-flat-button.mat-primary .mat-ripple-element, .mat-raised-button.mat-primary .mat-ripple-element, .mat-fab.mat-primary .mat-ripple-element, .mat-mini-fab.mat-primary .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.1); }\n.mat-flat-button.mat-accent .mat-ripple-element, .mat-raised-button.mat-accent .mat-ripple-element, .mat-fab.mat-accent .mat-ripple-element, .mat-mini-fab.mat-accent .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.1); }\n.mat-flat-button.mat-warn .mat-ripple-element, .mat-raised-button.mat-warn .mat-ripple-element, .mat-fab.mat-warn .mat-ripple-element, .mat-mini-fab.mat-warn .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.1); }\n.mat-stroked-button:not([class*='mat-elevation-z']), .mat-flat-button:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-raised-button:not([class*='mat-elevation-z']) {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-raised-button:not([disabled]):active:not([class*='mat-elevation-z']) {\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }\n.mat-raised-button[disabled]:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-fab:not([class*='mat-elevation-z']), .mat-mini-fab:not([class*='mat-elevation-z']) {\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\n.mat-fab:not([disabled]):active:not([class*='mat-elevation-z']), .mat-mini-fab:not([disabled]):active:not([class*='mat-elevation-z']) {\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }\n.mat-fab[disabled]:not([class*='mat-elevation-z']), .mat-mini-fab[disabled]:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-standalone,\n.mat-button-toggle-group {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,\n.mat-button-toggle-group-appearance-standard {\n box-shadow: none; }\n.mat-button-toggle {\n color: rgba(0, 0, 0, 0.38); }\n.mat-button-toggle .mat-button-toggle-focus-overlay {\n background-color: rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-appearance-standard {\n color: rgba(0, 0, 0, 0.87);\n background: white; }\n.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay {\n background-color: black; }\n.mat-button-toggle-group-appearance-standard .mat-button-toggle + .mat-button-toggle {\n border-left: solid 1px rgba(0, 0, 0, 0.12); }\n[dir='rtl'] .mat-button-toggle-group-appearance-standard .mat-button-toggle + .mat-button-toggle {\n border-left: none;\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle + .mat-button-toggle {\n border-left: none;\n border-right: none;\n border-top: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-button-toggle-checked {\n background-color: #e0e0e0;\n color: rgba(0, 0, 0, 0.54); }\n.mat-button-toggle-checked.mat-button-toggle-appearance-standard {\n color: rgba(0, 0, 0, 0.87); }\n.mat-button-toggle-disabled {\n color: rgba(0, 0, 0, 0.26);\n background-color: #eeeeee; }\n.mat-button-toggle-disabled.mat-button-toggle-appearance-standard {\n background: white; }\n.mat-button-toggle-disabled.mat-button-toggle-checked {\n background-color: #bdbdbd; }\n.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,\n.mat-button-toggle-group-appearance-standard {\n border: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-card {\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-card:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }\n.mat-card.mat-card-flat:not([class*='mat-elevation-z']) {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-card-subtitle {\n color: rgba(0, 0, 0, 0.54); }\n.mat-checkbox-frame {\n border-color: rgba(0, 0, 0, 0.54); }\n.mat-checkbox-checkmark {\n fill: #fafafa; }\n.mat-checkbox-checkmark-path {\n stroke: #fafafa !important; }\n@media (-ms-high-contrast: black-on-white) {\n .mat-checkbox-checkmark-path {\n stroke: #000 !important; } }\n.mat-checkbox-mixedmark {\n background-color: #fafafa; }\n.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background, .mat-checkbox-checked.mat-primary .mat-checkbox-background {\n background-color: #5e35b1; }\n.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background, .mat-checkbox-checked.mat-accent .mat-checkbox-background {\n background-color: #c41061; }\n.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background, .mat-checkbox-checked.mat-warn .mat-checkbox-background {\n background-color: #f44336; }\n.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background, .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background {\n background-color: #b0b0b0; }\n.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame {\n border-color: #b0b0b0; }\n.mat-checkbox-disabled .mat-checkbox-label {\n color: rgba(0, 0, 0, 0.54); }\n@media (-ms-high-contrast: active) {\n .mat-checkbox-disabled {\n opacity: 0.5; } }\n@media (-ms-high-contrast: active) {\n .mat-checkbox-background {\n background: none; } }\n.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element {\n background-color: #5e35b1; }\n.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element {\n background-color: #c41061; }\n.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element {\n background-color: #f44336; }\n.mat-chip.mat-standard-chip {\n background-color: #e0e0e0;\n color: rgba(0, 0, 0, 0.87); }\n.mat-chip.mat-standard-chip .mat-chip-remove {\n color: rgba(0, 0, 0, 0.87);\n opacity: 0.4; }\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active {\n box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover {\n opacity: 0.54; }\n.mat-chip.mat-standard-chip.mat-chip-disabled {\n opacity: 0.4; }\n.mat-chip.mat-standard-chip::after {\n background: black; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary {\n background-color: #5e35b1;\n color: white; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove {\n color: white;\n opacity: 0.4; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element {\n background: rgba(255, 255, 255, 0.1); }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn {\n background-color: #f44336;\n color: white; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove {\n color: white;\n opacity: 0.4; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element {\n background: rgba(255, 255, 255, 0.1); }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent {\n background-color: #c41061;\n color: white; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove {\n color: white;\n opacity: 0.4; }\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element {\n background: rgba(255, 255, 255, 0.1); }\n.mat-table {\n background: white; }\n.mat-table thead, .mat-table tbody, .mat-table tfoot,\nmat-header-row, mat-row, mat-footer-row,\n[mat-header-row], [mat-row], [mat-footer-row],\n.mat-table-sticky {\n background: inherit; }\nmat-row, mat-header-row, mat-footer-row,\nth.mat-header-cell, td.mat-cell, td.mat-footer-cell {\n border-bottom-color: rgba(0, 0, 0, 0.12); }\n.mat-header-cell {\n color: rgba(0, 0, 0, 0.54); }\n.mat-cell, .mat-footer-cell {\n color: rgba(0, 0, 0, 0.87); }\n.mat-calendar-arrow {\n border-top-color: rgba(0, 0, 0, 0.54); }\n.mat-datepicker-toggle,\n.mat-datepicker-content .mat-calendar-next-button,\n.mat-datepicker-content .mat-calendar-previous-button {\n color: rgba(0, 0, 0, 0.54); }\n.mat-calendar-table-header {\n color: rgba(0, 0, 0, 0.38); }\n.mat-calendar-table-header-divider::after {\n background: rgba(0, 0, 0, 0.12); }\n.mat-calendar-body-label {\n color: rgba(0, 0, 0, 0.54); }\n.mat-calendar-body-cell-content {\n color: rgba(0, 0, 0, 0.87);\n border-color: transparent; }\n.mat-calendar-body-disabled > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected) {\n color: rgba(0, 0, 0, 0.38); }\n.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected),\n.cdk-keyboard-focused .mat-calendar-body-active > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected),\n.cdk-program-focused .mat-calendar-body-active > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected) {\n background-color: rgba(0, 0, 0, 0.04); }\n.mat-calendar-body-today:not(.mat-calendar-body-selected) {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-calendar-body-disabled > .mat-calendar-body-today:not(.mat-calendar-body-selected) {\n border-color: rgba(0, 0, 0, 0.18); }\n.mat-calendar-body-selected {\n background-color: #5e35b1;\n color: white; }\n.mat-calendar-body-disabled > .mat-calendar-body-selected {\n background-color: rgba(94, 53, 177, 0.4); }\n.mat-calendar-body-today.mat-calendar-body-selected {\n box-shadow: inset 0 0 0 1px white; }\n.mat-datepicker-content {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);\n background-color: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-datepicker-content.mat-accent .mat-calendar-body-selected {\n background-color: #c41061;\n color: white; }\n.mat-datepicker-content.mat-accent .mat-calendar-body-disabled > .mat-calendar-body-selected {\n background-color: rgba(196, 16, 97, 0.4); }\n.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected {\n box-shadow: inset 0 0 0 1px white; }\n.mat-datepicker-content.mat-warn .mat-calendar-body-selected {\n background-color: #f44336;\n color: white; }\n.mat-datepicker-content.mat-warn .mat-calendar-body-disabled > .mat-calendar-body-selected {\n background-color: rgba(244, 67, 54, 0.4); }\n.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected {\n box-shadow: inset 0 0 0 1px white; }\n.mat-datepicker-content-touch {\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\n.mat-datepicker-toggle-active {\n color: #5e35b1; }\n.mat-datepicker-toggle-active.mat-accent {\n color: #c41061; }\n.mat-datepicker-toggle-active.mat-warn {\n color: #f44336; }\n.mat-dialog-container {\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-divider {\n border-top-color: rgba(0, 0, 0, 0.12); }\n.mat-divider-vertical {\n border-right-color: rgba(0, 0, 0, 0.12); }\n.mat-expansion-panel {\n background: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-expansion-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\n.mat-action-row {\n border-top-color: rgba(0, 0, 0, 0.12); }\n.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']).cdk-keyboard-focused, .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']).cdk-program-focused, .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']):hover {\n background: rgba(0, 0, 0, 0.04); }\n@media (hover: none) {\n .mat-expansion-panel:not(.mat-expanded):not([aria-disabled='true'])\n.mat-expansion-panel-header:hover {\n background: white; } }\n.mat-expansion-panel-header-title {\n color: rgba(0, 0, 0, 0.87); }\n.mat-expansion-panel-header-description,\n.mat-expansion-indicator::after {\n color: rgba(0, 0, 0, 0.54); }\n.mat-expansion-panel-header[aria-disabled='true'] {\n color: rgba(0, 0, 0, 0.26); }\n.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-title,\n .mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-description {\n color: inherit; }\n.mat-form-field-label {\n color: rgba(0, 0, 0, 0.6); }\n.mat-hint {\n color: rgba(0, 0, 0, 0.6); }\n.mat-form-field.mat-focused .mat-form-field-label {\n color: #5e35b1; }\n.mat-form-field.mat-focused .mat-form-field-label.mat-accent {\n color: #c41061; }\n.mat-form-field.mat-focused .mat-form-field-label.mat-warn {\n color: #f44336; }\n.mat-focused .mat-form-field-required-marker {\n color: #c41061; }\n.mat-form-field-ripple {\n background-color: rgba(0, 0, 0, 0.87); }\n.mat-form-field.mat-focused .mat-form-field-ripple {\n background-color: #5e35b1; }\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent {\n background-color: #c41061; }\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn {\n background-color: #f44336; }\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after {\n color: #5e35b1; }\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after {\n color: #c41061; }\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after {\n color: #f44336; }\n.mat-form-field.mat-form-field-invalid .mat-form-field-label {\n color: #f44336; }\n.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,\n .mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker {\n color: #f44336; }\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent {\n background-color: #f44336; }\n.mat-error {\n color: #f44336; }\n.mat-form-field-appearance-legacy .mat-form-field-label {\n color: rgba(0, 0, 0, 0.54); }\n.mat-form-field-appearance-legacy .mat-hint {\n color: rgba(0, 0, 0, 0.54); }\n.mat-form-field-appearance-legacy .mat-form-field-underline {\n background-color: rgba(0, 0, 0, 0.42); }\n.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline {\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);\n background-size: 4px 100%;\n background-repeat: repeat-x; }\n.mat-form-field-appearance-standard .mat-form-field-underline {\n background-color: rgba(0, 0, 0, 0.42); }\n.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline {\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);\n background-size: 4px 100%;\n background-repeat: repeat-x; }\n.mat-form-field-appearance-fill .mat-form-field-flex {\n background-color: rgba(0, 0, 0, 0.04); }\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex {\n background-color: rgba(0, 0, 0, 0.02); }\n.mat-form-field-appearance-fill .mat-form-field-underline::before {\n background-color: rgba(0, 0, 0, 0.42); }\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label {\n color: rgba(0, 0, 0, 0.38); }\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before {\n background-color: transparent; }\n.mat-form-field-appearance-outline .mat-form-field-outline {\n color: rgba(0, 0, 0, 0.12); }\n.mat-form-field-appearance-outline .mat-form-field-outline-thick {\n color: rgba(0, 0, 0, 0.87); }\n.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick {\n color: #5e35b1; }\n.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick {\n color: #c41061; }\n.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick {\n color: #f44336; }\n.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick {\n color: #f44336; }\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label {\n color: rgba(0, 0, 0, 0.38); }\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline {\n color: rgba(0, 0, 0, 0.06); }\n.mat-icon.mat-primary {\n color: #5e35b1; }\n.mat-icon.mat-accent {\n color: #c41061; }\n.mat-icon.mat-warn {\n color: #f44336; }\n.mat-form-field-type-mat-native-select .mat-form-field-infix::after {\n color: rgba(0, 0, 0, 0.54); }\n.mat-input-element:disabled,\n.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after {\n color: rgba(0, 0, 0, 0.38); }\n.mat-input-element {\n caret-color: #5e35b1; }\n.mat-input-element::-webkit-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-moz-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element:-ms-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-ms-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-moz-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element::-webkit-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-input-element:-ms-input-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-accent .mat-input-element {\n caret-color: #c41061; }\n.mat-warn .mat-input-element,\n.mat-form-field-invalid .mat-input-element {\n caret-color: #f44336; }\n.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after {\n color: #f44336; }\n.mat-list-base .mat-list-item {\n color: rgba(0, 0, 0, 0.87); }\n.mat-list-base .mat-list-option {\n color: rgba(0, 0, 0, 0.87); }\n.mat-list-base .mat-subheader {\n color: rgba(0, 0, 0, 0.54); }\n.mat-list-item-disabled {\n background-color: #eeeeee; }\n.mat-list-option:hover, .mat-list-option:focus,\n.mat-nav-list .mat-list-item:hover,\n.mat-nav-list .mat-list-item:focus,\n.mat-action-list .mat-list-item:hover,\n.mat-action-list .mat-list-item:focus {\n background: rgba(0, 0, 0, 0.04); }\n.mat-menu-panel {\n background: white; }\n.mat-menu-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-menu-item {\n background: transparent;\n color: rgba(0, 0, 0, 0.87); }\n.mat-menu-item[disabled], .mat-menu-item[disabled]::after {\n color: rgba(0, 0, 0, 0.38); }\n.mat-menu-item .mat-icon-no-color,\n.mat-menu-item-submenu-trigger::after {\n color: rgba(0, 0, 0, 0.54); }\n.mat-menu-item:hover:not([disabled]),\n.mat-menu-item.cdk-program-focused:not([disabled]),\n.mat-menu-item.cdk-keyboard-focused:not([disabled]),\n.mat-menu-item-highlighted:not([disabled]) {\n background: rgba(0, 0, 0, 0.04); }\n.mat-paginator {\n background: white; }\n.mat-paginator,\n.mat-paginator-page-size .mat-select-trigger {\n color: rgba(0, 0, 0, 0.54); }\n.mat-paginator-decrement,\n.mat-paginator-increment {\n border-top: 2px solid rgba(0, 0, 0, 0.54);\n border-right: 2px solid rgba(0, 0, 0, 0.54); }\n.mat-paginator-first,\n.mat-paginator-last {\n border-top: 2px solid rgba(0, 0, 0, 0.54); }\n.mat-icon-button[disabled] .mat-paginator-decrement,\n.mat-icon-button[disabled] .mat-paginator-increment,\n.mat-icon-button[disabled] .mat-paginator-first,\n.mat-icon-button[disabled] .mat-paginator-last {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-progress-bar-background {\n fill: #cfc2e8; }\n.mat-progress-bar-buffer {\n background-color: #cfc2e8; }\n.mat-progress-bar-fill::after {\n background-color: #5e35b1; }\n.mat-progress-bar.mat-accent .mat-progress-bar-background {\n fill: #edb7d0; }\n.mat-progress-bar.mat-accent .mat-progress-bar-buffer {\n background-color: #edb7d0; }\n.mat-progress-bar.mat-accent .mat-progress-bar-fill::after {\n background-color: #c41061; }\n.mat-progress-bar.mat-warn .mat-progress-bar-background {\n fill: #ffcdd2; }\n.mat-progress-bar.mat-warn .mat-progress-bar-buffer {\n background-color: #ffcdd2; }\n.mat-progress-bar.mat-warn .mat-progress-bar-fill::after {\n background-color: #f44336; }\n.mat-progress-spinner circle, .mat-spinner circle {\n stroke: #5e35b1; }\n.mat-progress-spinner.mat-accent circle, .mat-spinner.mat-accent circle {\n stroke: #c41061; }\n.mat-progress-spinner.mat-warn circle, .mat-spinner.mat-warn circle {\n stroke: #f44336; }\n.mat-radio-outer-circle {\n border-color: rgba(0, 0, 0, 0.54); }\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle {\n border-color: #5e35b1; }\n.mat-radio-button.mat-primary .mat-radio-inner-circle,\n.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,\n.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple {\n background-color: #5e35b1; }\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle {\n border-color: #c41061; }\n.mat-radio-button.mat-accent .mat-radio-inner-circle,\n.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,\n.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple {\n background-color: #c41061; }\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle {\n border-color: #f44336; }\n.mat-radio-button.mat-warn .mat-radio-inner-circle,\n.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,\n.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple {\n background-color: #f44336; }\n.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,\n.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,\n.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle {\n background-color: rgba(0, 0, 0, 0.38); }\n.mat-radio-button.mat-radio-disabled .mat-radio-label-content {\n color: rgba(0, 0, 0, 0.38); }\n.mat-radio-button .mat-ripple-element {\n background-color: black; }\n.mat-select-value {\n color: rgba(0, 0, 0, 0.87); }\n.mat-select-placeholder {\n color: rgba(0, 0, 0, 0.42); }\n.mat-select-disabled .mat-select-value {\n color: rgba(0, 0, 0, 0.38); }\n.mat-select-arrow {\n color: rgba(0, 0, 0, 0.54); }\n.mat-select-panel {\n background: white; }\n.mat-select-panel:not([class*='mat-elevation-z']) {\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\n.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple) {\n background: rgba(0, 0, 0, 0.12); }\n.mat-form-field.mat-focused.mat-primary .mat-select-arrow {\n color: #5e35b1; }\n.mat-form-field.mat-focused.mat-accent .mat-select-arrow {\n color: #c41061; }\n.mat-form-field.mat-focused.mat-warn .mat-select-arrow {\n color: #f44336; }\n.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow {\n color: #f44336; }\n.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow {\n color: rgba(0, 0, 0, 0.38); }\n.mat-drawer-container {\n background-color: #fafafa;\n color: rgba(0, 0, 0, 0.87); }\n.mat-drawer {\n background-color: white;\n color: rgba(0, 0, 0, 0.87); }\n.mat-drawer.mat-drawer-push {\n background-color: white; }\n.mat-drawer:not(.mat-drawer-side) {\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }\n.mat-drawer-side {\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-drawer-side.mat-drawer-end {\n border-left: solid 1px rgba(0, 0, 0, 0.12);\n border-right: none; }\n[dir='rtl'] .mat-drawer-side {\n border-left: solid 1px rgba(0, 0, 0, 0.12);\n border-right: none; }\n[dir='rtl'] .mat-drawer-side.mat-drawer-end {\n border-left: none;\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\n.mat-drawer-backdrop.mat-drawer-shown {\n background-color: rgba(0, 0, 0, 0.6); }\n.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb {\n background-color: #c41061; }\n.mat-slide-toggle.mat-checked .mat-slide-toggle-bar {\n background-color: rgba(196, 16, 97, 0.54); }\n.mat-slide-toggle.mat-checked .mat-ripple-element {\n background-color: #c41061; }\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb {\n background-color: #5e35b1; }\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar {\n background-color: rgba(94, 53, 177, 0.54); }\n.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element {\n background-color: #5e35b1; }\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb {\n background-color: #f44336; }\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar {\n background-color: rgba(244, 67, 54, 0.54); }\n.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element {\n background-color: #f44336; }\n.mat-slide-toggle:not(.mat-checked) .mat-ripple-element {\n background-color: black; }\n.mat-slide-toggle-thumb {\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12);\n background-color: #fafafa; }\n.mat-slide-toggle-bar {\n background-color: rgba(0, 0, 0, 0.38); }\n.mat-slider-track-background {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-primary .mat-slider-track-fill,\n.mat-primary .mat-slider-thumb,\n.mat-primary .mat-slider-thumb-label {\n background-color: #5e35b1; }\n.mat-primary .mat-slider-thumb-label-text {\n color: white; }\n.mat-accent .mat-slider-track-fill,\n.mat-accent .mat-slider-thumb,\n.mat-accent .mat-slider-thumb-label {\n background-color: #c41061; }\n.mat-accent .mat-slider-thumb-label-text {\n color: white; }\n.mat-warn .mat-slider-track-fill,\n.mat-warn .mat-slider-thumb,\n.mat-warn .mat-slider-thumb-label {\n background-color: #f44336; }\n.mat-warn .mat-slider-thumb-label-text {\n color: white; }\n.mat-slider-focus-ring {\n background-color: rgba(196, 16, 97, 0.2); }\n.mat-slider:hover .mat-slider-track-background,\n.cdk-focused .mat-slider-track-background {\n background-color: rgba(0, 0, 0, 0.38); }\n.mat-slider-disabled .mat-slider-track-background,\n.mat-slider-disabled .mat-slider-track-fill,\n.mat-slider-disabled .mat-slider-thumb {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-disabled:hover .mat-slider-track-background {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-min-value .mat-slider-focus-ring {\n background-color: rgba(0, 0, 0, 0.12); }\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label {\n background-color: rgba(0, 0, 0, 0.87); }\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label {\n background-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb {\n border-color: rgba(0, 0, 0, 0.26);\n background-color: transparent; }\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb, .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb, .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb {\n border-color: rgba(0, 0, 0, 0.26); }\n.mat-slider-has-ticks .mat-slider-wrapper::after {\n border-color: rgba(0, 0, 0, 0.7); }\n.mat-slider-horizontal .mat-slider-ticks {\n background-image: repeating-linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent);\n background-image: -moz-repeating-linear-gradient(0.0001deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent); }\n.mat-slider-vertical .mat-slider-ticks {\n background-image: repeating-linear-gradient(to bottom, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent); }\n.mat-step-header.cdk-keyboard-focused, .mat-step-header.cdk-program-focused, .mat-step-header:hover {\n background-color: rgba(0, 0, 0, 0.04); }\n@media (hover: none) {\n .mat-step-header:hover {\n background: none; } }\n.mat-step-header .mat-step-label,\n.mat-step-header .mat-step-optional {\n color: rgba(0, 0, 0, 0.54); }\n.mat-step-header .mat-step-icon {\n background-color: rgba(0, 0, 0, 0.54);\n color: white; }\n.mat-step-header .mat-step-icon-selected,\n.mat-step-header .mat-step-icon-state-done,\n.mat-step-header .mat-step-icon-state-edit {\n background-color: #5e35b1;\n color: white; }\n.mat-step-header .mat-step-icon-state-error {\n background-color: transparent;\n color: #f44336; }\n.mat-step-header .mat-step-label.mat-step-label-active {\n color: rgba(0, 0, 0, 0.87); }\n.mat-step-header .mat-step-label.mat-step-label-error {\n color: #f44336; }\n.mat-stepper-horizontal, .mat-stepper-vertical {\n background-color: white; }\n.mat-stepper-vertical-line::before {\n border-left-color: rgba(0, 0, 0, 0.12); }\n.mat-horizontal-stepper-header::before,\n.mat-horizontal-stepper-header::after,\n.mat-stepper-horizontal-line {\n border-top-color: rgba(0, 0, 0, 0.12); }\n.mat-sort-header-arrow {\n color: #757575; }\n.mat-tab-nav-bar,\n.mat-tab-header {\n border-bottom: 1px solid rgba(0, 0, 0, 0.12); }\n.mat-tab-group-inverted-header .mat-tab-nav-bar,\n.mat-tab-group-inverted-header .mat-tab-header {\n border-top: 1px solid rgba(0, 0, 0, 0.12);\n border-bottom: none; }\n.mat-tab-label, .mat-tab-link {\n color: rgba(0, 0, 0, 0.87); }\n.mat-tab-label.mat-tab-disabled, .mat-tab-link.mat-tab-disabled {\n color: rgba(0, 0, 0, 0.38); }\n.mat-tab-header-pagination-chevron {\n border-color: rgba(0, 0, 0, 0.87); }\n.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(0, 0, 0, 0.38); }\n.mat-tab-group[class*='mat-background-'] .mat-tab-header,\n.mat-tab-nav-bar[class*='mat-background-'] {\n border-bottom: none;\n border-top: none; }\n.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(207, 194, 232, 0.3); }\n.mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar {\n background-color: #5e35b1; }\n.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar {\n background-color: white; }\n.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(237, 183, 208, 0.3); }\n.mat-tab-group.mat-accent .mat-ink-bar, .mat-tab-nav-bar.mat-accent .mat-ink-bar {\n background-color: #c41061; }\n.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar, .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar {\n background-color: white; }\n.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(255, 205, 210, 0.3); }\n.mat-tab-group.mat-warn .mat-ink-bar, .mat-tab-nav-bar.mat-warn .mat-ink-bar {\n background-color: #f44336; }\n.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar, .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar {\n background-color: white; }\n.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(207, 194, 232, 0.3); }\n.mat-tab-group.mat-background-primary .mat-tab-header, .mat-tab-group.mat-background-primary .mat-tab-links, .mat-tab-nav-bar.mat-background-primary .mat-tab-header, .mat-tab-nav-bar.mat-background-primary .mat-tab-links {\n background-color: #5e35b1; }\n.mat-tab-group.mat-background-primary .mat-tab-label, .mat-tab-group.mat-background-primary .mat-tab-link, .mat-tab-nav-bar.mat-background-primary .mat-tab-label, .mat-tab-nav-bar.mat-background-primary .mat-tab-link {\n color: white; }\n.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled {\n color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron {\n border-color: white; }\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-primary .mat-ripple-element, .mat-tab-nav-bar.mat-background-primary .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.12); }\n.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(237, 183, 208, 0.3); }\n.mat-tab-group.mat-background-accent .mat-tab-header, .mat-tab-group.mat-background-accent .mat-tab-links, .mat-tab-nav-bar.mat-background-accent .mat-tab-header, .mat-tab-nav-bar.mat-background-accent .mat-tab-links {\n background-color: #c41061; }\n.mat-tab-group.mat-background-accent .mat-tab-label, .mat-tab-group.mat-background-accent .mat-tab-link, .mat-tab-nav-bar.mat-background-accent .mat-tab-label, .mat-tab-nav-bar.mat-background-accent .mat-tab-link {\n color: white; }\n.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled {\n color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron {\n border-color: white; }\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-accent .mat-ripple-element, .mat-tab-nav-bar.mat-background-accent .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.12); }\n.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\n.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\n background-color: rgba(255, 205, 210, 0.3); }\n.mat-tab-group.mat-background-warn .mat-tab-header, .mat-tab-group.mat-background-warn .mat-tab-links, .mat-tab-nav-bar.mat-background-warn .mat-tab-header, .mat-tab-nav-bar.mat-background-warn .mat-tab-links {\n background-color: #f44336; }\n.mat-tab-group.mat-background-warn .mat-tab-label, .mat-tab-group.mat-background-warn .mat-tab-link, .mat-tab-nav-bar.mat-background-warn .mat-tab-label, .mat-tab-nav-bar.mat-background-warn .mat-tab-link {\n color: white; }\n.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled {\n color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron {\n border-color: white; }\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\n border-color: rgba(255, 255, 255, 0.4); }\n.mat-tab-group.mat-background-warn .mat-ripple-element, .mat-tab-nav-bar.mat-background-warn .mat-ripple-element {\n background-color: rgba(255, 255, 255, 0.12); }\n.mat-toolbar {\n background: whitesmoke;\n color: rgba(0, 0, 0, 0.87); }\n.mat-toolbar.mat-primary {\n background: #5e35b1;\n color: white; }\n.mat-toolbar.mat-accent {\n background: #c41061;\n color: white; }\n.mat-toolbar.mat-warn {\n background: #f44336;\n color: white; }\n.mat-toolbar .mat-form-field-underline,\n .mat-toolbar .mat-form-field-ripple,\n .mat-toolbar .mat-focused .mat-form-field-ripple {\n background-color: currentColor; }\n.mat-toolbar .mat-form-field-label,\n .mat-toolbar .mat-focused .mat-form-field-label,\n .mat-toolbar .mat-select-value,\n .mat-toolbar .mat-select-arrow,\n .mat-toolbar .mat-form-field.mat-focused .mat-select-arrow {\n color: inherit; }\n.mat-toolbar .mat-input-element {\n caret-color: currentColor; }\n.mat-tooltip {\n background: rgba(97, 97, 97, 0.9); }\n.mat-tree {\n background: white; }\n.mat-tree-node,\n.mat-nested-tree-node {\n color: rgba(0, 0, 0, 0.87); }\n.mat-snack-bar-container {\n color: rgba(255, 255, 255, 0.7);\n background: #323232;\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\n.mat-simple-snackbar-action {\n color: #c41061; }\n/* Verily branding basics */\n* {\n font-family: 'Work Sans', sans-serif; }\n@font-face {\n font-family: 'Material Icons';\n font-style: normal;\n font-weight: 400;\n src: local(\"Material Icons\"), local(\"MaterialIcons-Regular\"), url('MaterialIcons-Regular.woff') format(\"woff\"); }\n.material-icons {\n font-family: 'Material Icons';\n font-weight: normal;\n font-style: normal;\n font-size: 24px;\n /* Preferred icon size */\n display: inline-block;\n line-height: 1;\n text-transform: none;\n letter-spacing: normal;\n word-wrap: normal;\n white-space: nowrap;\n direction: ltr;\n /* Support for all WebKit browsers. */\n -webkit-font-smoothing: antialiased;\n /* Support for Safari and Chrome. */\n text-rendering: optimizeLegibility;\n /* Support for Firefox. */\n -moz-osx-font-smoothing: grayscale;\n /* Support for IE. */\n font-feature-settings: 'liga'; }\n/* Added for ng2-dragula support, see https://github.com/valor-software/ng2-dragula */\n/* in-flight clone */\n.gu-mirror {\n -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n filter: alpha(opacity=100);\n margin: 0 !important;\n opacity: 1 !important;\n pointer-events: none;\n position: fixed !important;\n z-index: 9999 !important; }\n/* high-performance display:none; helper */\n.gu-hide {\n left: -9999px !important; }\n/* added to mirrorContainer (default = body) while dragging */\n.gu-unselectable {\n -ms-user-select: none !important;\n -moz-user-select: none !important;\n -webkit-user-select: none !important;\n user-select: none !important;\n cursor: grabbing !important;\n cursor: -webkit-grabbing; }\n/* added to the source element while its mirror is dragged */\n.gu-transit {\n -ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)\";\n filter: alpha(opacity=20);\n opacity: 0.2; }\n.mat-app-background {\n background-color: #202020;\n /* Grey 900 */ }\nbody {\n margin: 0px; }\n\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvaG11bGhvbGxhbmQvQ29kZS9iY2gvbWVkdGltZWxpbmUvc3JjL3N0eWxlcy5zY3NzIiwiL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9obXVsaG9sbGFuZC9Db2RlL2JjaC9tZWR0aW1lbGluZS9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvbWF0ZXJpYWwvX3RoZW1pbmcuc2NzcyIsIi91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvaG11bGhvbGxhbmQvQ29kZS9iY2gvbWVkdGltZWxpbmUvc3JjL3ZlcmlseS1jb2xvcnMtbWF0ZXJpYWwtdGhlbWUuc2NzcyIsInNyYy9zdHlsZXMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsa0VBQVk7QUFDWixpRUFBWTtBQUNaLGdFQUFZO0FBSlosNkNBQUE7QUN5MUNBLGtDQUFBO0FBb2hEQSwyQ0FBQTtBQXdDQSxxQkFBQTtBQXIrQkU7RUFDRSxnQkFoTHVCO0VBaUx2QixlQWxMc0I7RUFtTHRCLGlEQXBpQitELEVBQUE7QUF1aUJqRTtFQUNFLGNBQW1DLEVBQUE7QUFHckM7RUFDRSxlQUFtQyxFQUFBO0FBeFRyQztFQTFORSx3REExQitEO0VBc1AvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQS9ORSx3REExQitEO0VBMlAvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXBPRSx3REExQitEO0VBZ1EvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXpPRSx3REExQitEO0VBcVEvRCxnQkFBZ0IsRUFBQTtBQU1sQjtFQWpQRSwyREExQitEO0VBbVIvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQTVQRSwwREExQitEO0VBOFIvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXZRRSx3REExQitELEVBQUE7QUFxU2pFO0VBM1FFLHdEQTFCK0QsRUFBQTtBQXFTakU7SUFJSSxnQkFBZ0IsRUFBQTtBQUlwQjtFQW5SRSx3REExQitELEVBQUE7QUFtVGpFO0VBelJFLDBEQTFCK0Q7RUFxVC9ELGdCQUFnQjtFQUNoQix1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RSxFQUFBO0FBbW5IbkU7RUFDRSxjQy8vSFcsRUFBQTtBRjFDZiwyQkFBQTtBQUNBO0VBQ0Usb0NBQW9DLEVBQUE7QUFJdEM7RUFDRSw2QkFBNkI7RUFDN0Isa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQiw4R0FFd0UsRUFBQTtBQUcxRTtFQUNFLDZCQUE2QjtFQUM3QixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFBRyx3QkFBQTtFQUNsQixxQkFBcUI7RUFDckIsY0FBYztFQUNkLG9CQUFvQjtFQUNwQixzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQixjQUFjO0VBRWQscUNBQUE7RUFDQSxtQ0FBbUM7RUFDbkMsbUNBQUE7RUFDQSxrQ0FBa0M7RUFFbEMseUJBQUE7RUFDQSxrQ0FBa0M7RUFFbEMsb0JBQUE7RUFDQSw2QkFBNkIsRUFBQTtBQUcvQixxRkFBQTtBQUNBLG9CQUFBO0FBQ0E7RUFDRSxrRUFBa0U7RUFDbEUsMEJBQTBCO0VBQzFCLG9CQUFvQjtFQUNwQixxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBQTtBQUcxQiwwQ0FBQTtBQUNBO0VBQ0Usd0JBQXdCLEVBQUE7QUFHMUIsNkRBQUE7QUFDQTtFQUNFLGdDQUFnQztFQUNoQyxpQ0FBaUM7RUFDakMsb0NBQW9DO0VBQ3BDLDRCQUE0QjtFQUM1QiwyQkFBMkI7RUFFM0Isd0JBQXdCLEVBQUE7QUFFMUIsNERBQUE7QUFDQTtFQUNFLGlFQUFpRTtFQUNqRSx5QkFBeUI7RUFDekIsWUFBWSxFQUFBO0FBR2Q7RUFDRSx5QkFBeUI7RUFBRSxhQUFBLEVBQWM7QUFHM0M7RUFDRSxXQUFXLEVBQUEiLCJmaWxlIjoic3JjL3N0eWxlcy5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogRGVmYXVsdCBBbmd1bGFyIE1hdGVyaWFsIHByZWJ1aWx0IHRoZW1lLiAqL1xuQGltcG9ydCBcIi4vdmVyaWx5LWNvbG9ycy1tYXRlcmlhbC10aGVtZS5zY3NzXCI7XG5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vJyk7XG5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PU1vbnRzZXJyYXQnKTtcbkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9V29yaytTYW5zJyk7XG5cbi8qIFZlcmlseSBicmFuZGluZyBiYXNpY3MgKi9cbioge1xuICBmb250LWZhbWlseTogJ1dvcmsgU2FucycsIHNhbnMtc2VyaWY7XG59XG5cbi8vIFNlbGYtaG9zdCB0aGUgQW5ndWxhciBNYXRlcmlhbCBpY29ucy5cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBzcmM6IGxvY2FsKCdNYXRlcmlhbCBJY29ucycpLFxuICAgIGxvY2FsKCdNYXRlcmlhbEljb25zLVJlZ3VsYXInKSxcbiAgICB1cmwoLi9hc3NldHMvbWF0ZXJpYWxfaWNvbnMvTWF0ZXJpYWxJY29ucy1SZWd1bGFyLndvZmYpIGZvcm1hdCgnd29mZicpLFxufVxuXG4ubWF0ZXJpYWwtaWNvbnMge1xuICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXNpemU6IDI0cHg7ICAvKiBQcmVmZXJyZWQgaWNvbiBzaXplICovXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgZGlyZWN0aW9uOiBsdHI7XG5cbiAgLyogU3VwcG9ydCBmb3IgYWxsIFdlYktpdCBicm93c2Vycy4gKi9cbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC8qIFN1cHBvcnQgZm9yIFNhZmFyaSBhbmQgQ2hyb21lLiAqL1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuXG4gIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG5cbiAgLyogU3VwcG9ydCBmb3IgSUUuICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xufVxuXG4vKiBBZGRlZCBmb3IgbmcyLWRyYWd1bGEgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZzItZHJhZ3VsYSAqL1xuLyogaW4tZmxpZ2h0IGNsb25lICovXG4uZ3UtbWlycm9yIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0xMDApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApO1xuICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDtcbn1cblxuLyogaGlnaC1wZXJmb3JtYW5jZSBkaXNwbGF5Om5vbmU7IGhlbHBlciAqL1xuLmd1LWhpZGUge1xuICBsZWZ0OiAtOTk5OXB4ICFpbXBvcnRhbnQ7XG59XG5cbi8qIGFkZGVkIHRvIG1pcnJvckNvbnRhaW5lciAoZGVmYXVsdCA9IGJvZHkpIHdoaWxlIGRyYWdnaW5nICovXG4uZ3UtdW5zZWxlY3RhYmxlIHtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICBjdXJzb3I6IGdyYWJiaW5nICFpbXBvcnRhbnQ7XG4gIGN1cnNvcjogLW1vei1ncmFiYmluZztcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nO1xufVxuLyogYWRkZWQgdG8gdGhlIHNvdXJjZSBlbGVtZW50IHdoaWxlIGl0cyBtaXJyb3IgaXMgZHJhZ2dlZCAqL1xuLmd1LXRyYW5zaXQge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTIwKVwiO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjApO1xuICBvcGFjaXR5OiAwLjI7XG59XG5cbi5tYXQtYXBwLWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOyAvKiBHcmV5IDkwMCAqL1xufVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwcHg7XG59XG4iLCIvLyBJbXBvcnQgYWxsIHRoZSB0aGVtaW5nIGZ1bmN0aW9uYWxpdHkuXG4vLyBXZSBjYW4gdXNlIHJlbGF0aXZlIGltcG9ydHMgZm9yIGltcG9ydHMgZnJvbSB0aGUgY2RrIGJlY2F1c2Ugd2UgYnVuZGxlIGV2ZXJ5dGhpbmdcbi8vIHVwIGludG8gYSBzaW5nbGUgZmxhdCBzY3NzIGZpbGUgZm9yIG1hdGVyaWFsLlxuLy8gV2Ugd2FudCBvdmVybGF5cyB0byBhbHdheXMgYXBwZWFyIG92ZXIgdXNlciBjb250ZW50LCBzbyBzZXQgYSBiYXNlbGluZVxuLy8gdmVyeSBoaWdoIHotaW5kZXggZm9yIHRoZSBvdmVybGF5IGNvbnRhaW5lciwgd2hpY2ggaXMgd2hlcmUgd2UgY3JlYXRlIHRoZSBuZXdcbi8vIHN0YWNraW5nIGNvbnRleHQgZm9yIGFsbCBvdmVybGF5cy5cbiRjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcjogMTAwMDtcbiRjZGstei1pbmRleC1vdmVybGF5OiAxMDAwO1xuJGNkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3A6IDEwMDA7XG5cbi8vIEJhY2tncm91bmQgY29sb3IgZm9yIGFsbCBvZiB0aGUgYmFja2Ryb3BzXG4kY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcC1iYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpO1xuXG4vLyBEZWZhdWx0IGJhY2tkcm9wIGFuaW1hdGlvbiBpcyBiYXNlZCBvbiB0aGUgTWF0ZXJpYWwgRGVzaWduIHN3aWZ0LWVhc2Utb3V0LlxuJGJhY2tkcm9wLWFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXMgIWRlZmF1bHQ7XG4kYmFja2Ryb3AtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSkgIWRlZmF1bHQ7XG5cblxuQG1peGluIGNkay1vdmVybGF5KCkge1xuICAuY2RrLW92ZXJsYXktY29udGFpbmVyLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICAgIC8vIERpc2FibGUgZXZlbnRzIGZyb20gYmVpbmcgY2FwdHVyZWQgb24gdGhlIG92ZXJsYXkgY29udGFpbmVyLlxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBzaG91bGQgYmUgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0LlxuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC8vIFRoZSBvdmVybGF5LWNvbnRhaW5lciBpcyBhbiBpbnZpc2libGUgZWxlbWVudCB3aGljaCBjb250YWlucyBhbGwgaW5kaXZpZHVhbCBvdmVybGF5cy5cbiAgLmNkay1vdmVybGF5LWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcjtcblxuICAgICY6ZW1wdHkge1xuICAgICAgLy8gSGlkZSB0aGUgZWxlbWVudCB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGQgbm9kZXMuIFRoaXMgZG9lc24ndFxuICAgICAgLy8gaW5jbHVkZSBvdmVybGF5cyB0aGF0IGhhdmUgYmVlbiBkZXRhY2hlZCwgcmF0aGVyIHRoYW4gZGlzcG9zZWQuXG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIHVzZSBhbiBleHRyYSB3cmFwcGVyIGVsZW1lbnQgaW4gb3JkZXIgdG8gdXNlIG1ha2UgdGhlIG92ZXJsYXkgaXRzZWxmIGEgZmxleCBpdGVtLlxuICAvLyBUaGlzIG1ha2VzIGNlbnRlcmluZyB0aGUgb3ZlcmxheSBlYXN5IHdpdGhvdXQgcnVubmluZyBpbnRvIHRoZSBzdWJwaXhlbCByZW5kZXJpbmdcbiAgLy8gcHJvYmxlbXMgdGllZCB0byB1c2luZyBgdHJhbnNmb3JtYCBhbmQgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBvdGhlciBwb3NpdGlvblxuICAvLyBzdHJhdGVnaWVzLlxuICAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5O1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgb3ZlcmxheSBwYW5lLlxuICAuY2RrLW92ZXJsYXktcGFuZSB7XG4gICAgLy8gTm90ZTogaXQncyBpbXBvcnRhbnQgZm9yIHRoaXMgb25lIHRvIHN0YXJ0IG9mZiBgYWJzb2x1dGVgLFxuICAgIC8vIGluIG9yZGVyIGZvciB1cyB0byBiZSBhYmxlIHRvIG1lYXN1cmUgaXQgY29ycmVjdGx5LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5O1xuXG4gICAgLy8gRm9yIGNvbm5lY3RlZC1wb3NpdGlvbiBvdmVybGF5cywgd2Ugc2V0IGBkaXNwbGF5OiBmbGV4YCBpblxuICAgIC8vIG9yZGVyIHRvIGZvcmNlIGBtYXgtd2lkdGhgIGFuZCBgbWF4LWhlaWdodGAgdG8gdGFrZSBlZmZlY3QuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgfVxuXG4gIC5jZGstb3ZlcmxheS1iYWNrZHJvcCB7XG4gICAgLy8gVE9ETyhqZWxib3Vybik6IHJldXNlIHNpZGVuYXYgZnVsbHNjcmVlbiBtaXhpbi5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgei1pbmRleDogJGNkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3A7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5ICRiYWNrZHJvcC1hbmltYXRpb24tZHVyYXRpb24gJGJhY2tkcm9wLWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb247XG4gICAgb3BhY2l0eTogMDtcblxuICAgICYuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyB7XG4gICAgICBvcGFjaXR5OiAxO1xuXG4gICAgICAvLyBJbiBoaWdoIGNvbnRyYXN0IG1vZGUgdGhlIHJnYmEgYmFja2dyb3VuZCB3aWxsIGJlY29tZSBzb2xpZCBzbyB3ZSBuZWVkIHRvIGZhbGwgYmFja1xuICAgICAgLy8gdG8gbWFraW5nIGl0IG9wYXF1ZSB1c2luZyBgb3BhY2l0eWAuIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGBjZGstaGlnaC1jb250cmFzdGBcbiAgICAgIC8vIG1peGluLCBiZWNhdXNlIHdlIGNhbid0IG5vcm1hbGl6ZSB0aGUgaW1wb3J0IHBhdGggdG8gdGhlIF9hMTF5LnNjc3MgYm90aCBmb3IgdGhlXG4gICAgICAvLyBzb3VyY2UgYW5kIHdoZW4gdGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkLiBTZWUgIzEwOTA4LlxuICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wIHtcbiAgICBiYWNrZ3JvdW5kOiAkY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcC1iYWNrZ3JvdW5kO1xuICB9XG5cbiAgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIHtcbiAgICAvLyBOb3RlOiBhcyBvZiBGaXJlZm94IDU3LCBoYXZpbmcgdGhlIGJhY2tkcm9wIGJlIGBiYWNrZ3JvdW5kOiBub25lYCB3aWxsIHByZXZlbnQgaXQgZnJvbVxuICAgIC8vIGNhcHR1cmluZyB0aGUgdXNlcidzIG1vdXNlIHNjcm9sbCBldmVudHMuIFNpbmNlIHdlIGFsc28gY2FuJ3QgdXNlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gYHJnYmEoMCwgMCwgMCwgMClgLCB3ZSB3b3JrIGFyb3VuZCB0aGUgaW5jb25zaXN0ZW5jeSBieSBub3Qgc2V0dGluZyB0aGUgYmFja2dyb3VuZCBhdFxuICAgIC8vIGFsbCBhbmQgdXNpbmcgYG9wYWNpdHlgIHRvIG1ha2UgdGhlIGVsZW1lbnQgdHJhbnNwYXJlbnQuXG4gICAgJiwgJi5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcmxheSBwYXJlbnQgZWxlbWVudCB1c2VkIHdpdGggdGhlIGNvbm5lY3RlZCBwb3NpdGlvbiBzdHJhdGVneS4gVXNlZCB0byBjb25zdHJhaW4gdGhlXG4gIC8vIG92ZXJsYXkgZWxlbWVudCdzIHNpemUgdG8gZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuXG4gIC5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogJGNkay16LWluZGV4LW92ZXJsYXk7XG5cbiAgICAvLyBXZSB1c2UgYGRpc3BsYXk6IGZsZXhgIG9uIHRoaXMgZWxlbWVudCBleGNsdXNpdmVseSBmb3IgY2VudGVyaW5nIGNvbm5lY3RlZCBvdmVybGF5cy5cbiAgICAvLyBXaGVuICpub3QqIGNlbnRlcmluZywgYSB0b3AvbGVmdC9ib3R0b20vcmlnaHQgd2lsbCBiZSBzZXQgd2hpY2ggb3ZlcnJpZGVzIHRoZSBub3JtYWxcbiAgICAvLyBmbGV4IGxheW91dC5cbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLy8gV2UgdXNlIHRoZSBgY29sdW1uYCBkaXJlY3Rpb24gaGVyZSB0byBhdm9pZCBzb21lIGZsZXhib3ggaXNzdWVzIGluIEVkZ2VcbiAgICAvLyB3aGVuIHVzaW5nIHRoZSBcImdyb3cgYWZ0ZXIgb3BlblwiIG9wdGlvbnMuXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgIC8vIEFkZCBzb21lIGRpbWVuc2lvbnMgc28gdGhlIGVsZW1lbnQgaGFzIGFuIGBpbm5lclRleHRgIHdoaWNoIHNvbWUgcGVvcGxlIGRlcGVuZCBvbiBpbiB0ZXN0cy5cbiAgICBtaW4td2lkdGg6IDFweDtcbiAgICBtaW4taGVpZ2h0OiAxcHg7XG4gIH1cblxuICAvLyBVc2VkIHdoZW4gZGlzYWJsaW5nIGdsb2JhbCBzY3JvbGxpbmcuXG4gIC5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG5cbiAgICAvLyBOZWNlc3NhcnkgZm9yIHRoZSBjb250ZW50IG5vdCB0byBsb3NlIGl0cyB3aWR0aC4gTm90ZSB0aGF0IHdlJ3JlIHVzaW5nIDEwMCUsIGluc3RlYWQgb2ZcbiAgICAvLyAxMDB2dywgYmVjYXVzZSAxMDB2dyBpbmNsdWRlcyB0aGUgd2lkdGggcGx1cyB0aGUgc2Nyb2xsYmFyLCB3aGVyZWFzIDEwMCUgaXMgdGhlIHdpZHRoXG4gICAgLy8gdGhhdCB0aGUgZWxlbWVudCBoYWQgYmVmb3JlIHdlIG1hZGUgaXQgYGZpeGVkYC5cbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC8vIE5vdGU6IHRoaXMgd2lsbCBhbHdheXMgYWRkIGEgc2Nyb2xsYmFyIHRvIHdoYXRldmVyIGVsZW1lbnQgaXQgaXMgb24sIHdoaWNoIGNhblxuICAgIC8vIHBvdGVudGlhbGx5IHJlc3VsdCBpbiBkb3VibGUgc2Nyb2xsYmFycy4gSXQgc2hvdWxkbid0IGJlIGFuIGlzc3VlLCBiZWNhdXNlIHdlIHdvbid0XG4gICAgLy8gYmxvY2sgc2Nyb2xsaW5nIG9uIGEgcGFnZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNjcm9sbGJhciBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICB9XG59XG5cbkBtaXhpbiBjZGstYTExeSB7XG4gIC5jZGstdmlzdWFsbHktaGlkZGVuIHtcbiAgICBib3JkZXI6IDA7XG4gICAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgICBoZWlnaHQ6IDFweDtcbiAgICBtYXJnaW46IC0xcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMXB4O1xuXG4gICAgLy8gQXZvaWQgYnJvd3NlcnMgcmVuZGVyaW5nIHRoZSBmb2N1cyByaW5nIGluIHNvbWUgY2FzZXMuXG4gICAgb3V0bGluZTogMDtcblxuICAgIC8vIEF2b2lkIHNvbWUgY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIgd2lsbCBzdGlsbCByZW5kZXIgdGhlIG5hdGl2ZSBjb250cm9scyAoc2VlICM5MDQ5KS5cbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICB9XG59XG5cbi8vIEFwcGxpZXMgc3R5bGVzIGZvciB1c2VycyBpbiBoaWdoIGNvbnRyYXN0IG1vZGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgYXBwbGllc1xuLy8gdG8gTWljcm9zb2Z0IGJyb3dzZXJzLiBDaHJvbWUgY2FuIGJlIGluY2x1ZGVkIGJ5IGNoZWNraW5nIGZvciB0aGUgYGh0bWxbaGNdYFxuLy8gYXR0cmlidXRlLCBob3dldmVyIENocm9tZSBoYW5kbGVzIGhpZ2ggY29udHJhc3QgZGlmZmVyZW50bHkuXG4vL1xuLy8gQHBhcmFtIHRhcmdldCBXaGljaCBraW5kIG9mIGhpZ2ggY29udHJhc3Qgc2V0dGluZyB0byB0YXJnZXQuIERlZmF1bHRzIHRvIGBhY3RpdmVgLCBjYW4gYmVcbi8vICAgIGB3aGl0ZS1vbi1ibGFja2Agb3IgYGJsYWNrLW9uLXdoaXRlYC5cbkBtaXhpbiBjZGstaGlnaC1jb250cmFzdCgkdGFyZ2V0OiBhY3RpdmUpIHtcbiAgQG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDogJHRhcmdldCkge1xuICAgIEBjb250ZW50O1xuICB9XG59XG5cbi8vIENvcmUgc3R5bGVzIHRoYXQgZW5hYmxlIG1vbml0b3JpbmcgYXV0b2ZpbGwgc3RhdGUgb2YgdGV4dCBmaWVsZHMuXG5AbWl4aW4gY2RrLXRleHQtZmllbGQge1xuICAvLyBLZXlmcmFtZXMgdGhhdCBhcHBseSBubyBzdHlsZXMsIGJ1dCBhbGxvdyB1cyB0byBtb25pdG9yIHdoZW4gYW4gdGV4dCBmaWVsZCBiZWNvbWVzIGF1dG9maWxsZWRcbiAgLy8gYnkgd2F0Y2hpbmcgZm9yIHRoZSBhbmltYXRpb24gZXZlbnRzIHRoYXQgYXJlIGZpcmVkIHdoZW4gdGhleSBzdGFydC4gTm90ZTogdGhlIC8qISovIGNvbW1lbnQgaXNcbiAgLy8gbmVlZGVkIHRvIHByZXZlbnQgTGliU2FzcyBmcm9tIHN0cmlwcGluZyB0aGUga2V5ZnJhbWVzIG91dC5cbiAgLy8gQmFzZWQgb246IGh0dHBzOi8vbWVkaXVtLmNvbS9AYnJ1bm4vZGV0ZWN0aW5nLWF1dG9maWxsZWQtZmllbGRzLWluLWphdmFzY3JpcHQtYWVkNTk4ZDI1ZGE3XG4gIEBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgey8qISovfVxuICBAa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCB7LyohKi99XG5cbiAgLmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxsIHtcbiAgICBhbmltYXRpb24tbmFtZTogY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7XG4gIH1cblxuICAuY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCkge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQ7XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHJlc2l6ZSBoYW5kbGUgb24gYXV0b3NpemluZyB0ZXh0YXJlYXMsIGJlY2F1c2Ugd2hhdGV2ZXIgaGVpZ2h0XG4gIC8vIHRoZSB1c2VyIHJlc2l6ZWQgdG8gd2lsbCBiZSBvdmVyd3JpdHRlbiBvbmNlIHRoZXkgc3RhcnQgdHlwaW5nIGFnYWluLlxuICB0ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUge1xuICAgIHJlc2l6ZTogbm9uZTtcbiAgfVxuXG4gIC8vIFRoaXMgY2xhc3MgaXMgdGVtcG9yYXJpbHkgYXBwbGllZCB0byB0aGUgdGV4dGFyZWEgd2hlbiBpdCBpcyBiZWluZyBtZWFzdXJlZC4gSXQgaXMgaW1tZWRpYXRlbHlcbiAgLy8gcmVtb3ZlZCB3aGVuIG1lYXN1cmluZyBpcyBjb21wbGV0ZS4gV2UgdXNlIGAhaW1wb3J0YW50YCBydWxlcyBoZXJlIHRvIG1ha2Ugc3VyZSB1c2VyLXNwZWNpZmllZFxuICAvLyBydWxlcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIG1lYXN1cmVtZW50LlxuICB0ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nIHtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgLy8gSGF2aW5nIDJweCB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nIHNlZW1zIHRvIGZpeCBhIGJ1ZyB3aGVyZSBDaHJvbWUgZ2V0cyBhbiBpbmNvcnJlY3RcbiAgICAvLyBtZWFzdXJlbWVudC4gV2UganVzdCBoYXZlIHRvIGFjY291bnQgZm9yIGl0IGxhdGVyIGFuZCBzdWJ0cmFjdCBpdCBvZmYgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICBwYWRkaW5nOiAycHggMCAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLy8gVXNlZCB0byBnZW5lcmF0ZSBVSURzIGZvciBrZXlmcmFtZXMgdXNlZCB0byBjaGFuZ2UgdGhlIHRleHQgZmllbGQgYXV0b2ZpbGwgc3R5bGVzLlxuJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50OiAwO1xuXG4vLyBNaXhpbiB1c2VkIHRvIGFwcGx5IGN1c3RvbSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycyB0byBhbiBhdXRvZmlsbGVkIHRleHQgZmllbGQuXG4vLyBCYXNlZCBvbjogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc4MTU0OS9cbi8vIHJlbW92aW5nLWlucHV0LWJhY2tncm91bmQtY29sb3VyLWZvci1jaHJvbWUtYXV0b2NvbXBsZXRlI2Fuc3dlci0zNzQzMjI2MFxuQG1peGluIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yKCRiYWNrZ3JvdW5kLCAkZm9yZWdyb3VuZDonJykge1xuICBAa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLSN7JGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50fSB7XG4gICAgdG8ge1xuICAgICAgYmFja2dyb3VuZDogJGJhY2tncm91bmQ7XG4gICAgICBAaWYgJGZvcmVncm91bmQgIT0gJycgeyBjb2xvcjogJGZvcmVncm91bmQ7IH1cbiAgICB9XG4gIH1cblxuICAmOi13ZWJraXQtYXV0b2ZpbGwge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvci0jeyRjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvci1mcmFtZS1jb3VudH07XG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgfVxuXG4gICYuY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGwge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3ItI3skY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3ItZnJhbWUtY291bnR9O1xuICB9XG5cbiAgJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50OlxuICAgICAgJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50ICsgMSAhZ2xvYmFsO1xufVxuXG5cbi8vIENvcmUgc3R5bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgbWF0ZXJpYWwgZGVzaWduIHRyZWF0bWVudHMgdG8gYW55IGVsZW1lbnQuXG4vLyBNZWRpYSBxdWVyaWVzXG4vLyBUT0RPKGpvc2VwaHBlcnJvdHQpOiBDaGFuZ2UgJG1hdC14c21hbGwgYW5kICRtYXQtc21hbGwgdXNhZ2VzIHRvIHJlbHkgb24gQnJlYWtwb2ludE9ic2VydmVyLFxuJG1hdC14c21hbGw6ICdtYXgtd2lkdGg6IDU5OXB4JztcbiRtYXQtc21hbGw6ICdtYXgtd2lkdGg6IDk1OXB4JztcblxuLy8gVE9ETzogUmV2aXNpdCBhbGwgei1pbmRpY2VzIGJlZm9yZSBiZXRhXG4vLyB6LWluZGV4IG1hc3RlciBsaXN0XG5cbiR6LWluZGV4LWZhYjogMjAgIWRlZmF1bHQ7XG4kei1pbmRleC1kcmF3ZXI6IDEwMCAhZGVmYXVsdDtcblxuLy8gR2xvYmFsIGNvbnN0YW50c1xuJHBpOiAzLjE0MTU5MjY1O1xuXG4vLyBQYWRkaW5nIGJldHdlZW4gaW5wdXQgdG9nZ2xlcyBhbmQgdGhlaXIgbGFiZWxzXG4kbWF0LXRvZ2dsZS1wYWRkaW5nOiA4cHggIWRlZmF1bHQ7XG4vLyBXaWR0aCBhbmQgaGVpZ2h0IG9mIGlucHV0IHRvZ2dsZXNcbiRtYXQtdG9nZ2xlLXNpemU6IDIwcHggIWRlZmF1bHQ7XG5cbi8vIEVhc2luZyBDdXJ2ZXNcbi8vIFRPRE8oamVsYm91cm4pOiBhbGwgb2YgdGhlc2UgbmVlZCB0byBiZSByZXZpc2l0ZWRcblxuLy8gVGhlIGRlZmF1bHQgYW5pbWF0aW9uIGN1cnZlcyB1c2VkIGJ5IG1hdGVyaWFsIGRlc2lnbi5cbiRtYXQtbGluZWFyLW91dC1zbG93LWluLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSAhZGVmYXVsdDtcbiRtYXQtZmFzdC1vdXQtc2xvdy1pbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkgIWRlZmF1bHQ7XG4kbWF0LWZhc3Qtb3V0LWxpbmVhci1pbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpICFkZWZhdWx0O1xuXG4kZWFzZS1pbi1vdXQtY3VydmUtZnVuY3Rpb246IGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSAhZGVmYXVsdDtcblxuJHN3aWZ0LWVhc2Utb3V0LWR1cmF0aW9uOiA0MDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpICFkZWZhdWx0O1xuJHN3aWZ0LWVhc2Utb3V0OiBhbGwgJHN3aWZ0LWVhc2Utb3V0LWR1cmF0aW9uICRzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb24gIWRlZmF1bHQ7XG5cbiRzd2lmdC1lYXNlLWluLWR1cmF0aW9uOiAzMDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMikgIWRlZmF1bHQ7XG4kc3dpZnQtZWFzZS1pbjogYWxsICRzd2lmdC1lYXNlLWluLWR1cmF0aW9uICRzd2lmdC1lYXNlLWluLXRpbWluZy1mdW5jdGlvbiAhZGVmYXVsdDtcblxuJHN3aWZ0LWVhc2UtaW4tb3V0LWR1cmF0aW9uOiA1MDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLW91dC10aW1pbmctZnVuY3Rpb246ICRlYXNlLWluLW91dC1jdXJ2ZS1mdW5jdGlvbiAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLW91dDogYWxsICRzd2lmdC1lYXNlLWluLW91dC1kdXJhdGlvbiAkc3dpZnQtZWFzZS1pbi1vdXQtdGltaW5nLWZ1bmN0aW9uICFkZWZhdWx0O1xuXG4kc3dpZnQtbGluZWFyLWR1cmF0aW9uOiA4MG1zICFkZWZhdWx0O1xuJHN3aWZ0LWxpbmVhci10aW1pbmctZnVuY3Rpb246IGxpbmVhciAhZGVmYXVsdDtcbiRzd2lmdC1saW5lYXI6IGFsbCAkc3dpZnQtbGluZWFyLWR1cmF0aW9uICRzd2lmdC1saW5lYXItdGltaW5nLWZ1bmN0aW9uICFkZWZhdWx0O1xuXG5cblxuLy8gQSBjb2xsZWN0aW9uIG9mIG1peGlucyBhbmQgQ1NTIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseSBlbGV2YXRpb24gdG8gYSBtYXRlcmlhbFxuLy8gZWxlbWVudC5cbi8vIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vZW52aXJvbm1lbnQvZWxldmF0aW9uLmh0bWxcbi8vIEV4YW1wbGVzOlxuLy9cbi8vXG4vLyAubWF0LWZvbyB7XG4vLyAgIEBpbmNsdWRlICRtYXQtZWxldmF0aW9uKDIpO1xuLy9cbi8vICAgJjphY3RpdmUge1xuLy8gICAgIEBpbmNsdWRlICRtYXQtZWxldmF0aW9uKDgpO1xuLy8gICB9XG4vLyB9XG4vL1xuLy8gPGRpdiBpZD1cImV4dGVybmFsLWNhcmRcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejJcIj48cD5Tb21lIGNvbnRlbnQ8L3A+PC9kaXY+XG4vL1xuLy8gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBkZXNpZ24gYmVoaW5kIGhvdyBlbGV2YXRpb24gaXMgaW1wbGVtZW50ZWQsIHNlZSB0aGUgZGVzaWduIGRvYyBhdFxuLy8gaHR0cHM6Ly9nb28uZ2wvS3EwazlaLlxuXG4vLyBDb2xvcnMgZm9yIHVtYnJhLCBwZW51bWJyYSwgYW5kIGFtYmllbnQgc2hhZG93cy4gQXMgZGVzY3JpYmVkIGluIHRoZSBkZXNpZ24gZG9jLCBlYWNoIGVsZXZhdGlvblxuLy8gbGV2ZWwgaXMgY3JlYXRlZCB1c2luZyBhIHNldCBvZiAzIHNoYWRvdyB2YWx1ZXMsIG9uZSBmb3IgdW1icmEgKHRoZSBzaGFkb3cgcmVwcmVzZW50aW5nIHRoZVxuLy8gc3BhY2UgY29tcGxldGVseSBvYnNjdXJlZCBieSBhbiBvYmplY3QgcmVsYXRpdmUgdG8gaXRzIGxpZ2h0IHNvdXJjZSksIG9uZSBmb3IgcGVudW1icmEgKHRoZVxuLy8gc3BhY2UgcGFydGlhbGx5IG9ic2N1cmVkIGJ5IGFuIG9iamVjdCksIGFuZCBvbmUgZm9yIGFtYmllbnQgKHRoZSBzcGFjZSB3aGljaCBjb250YWlucyB0aGUgb2JqZWN0XG4vLyBpdHNlbGYpLiBGb3IgYSBmdXJ0aGVyIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRlcm1zIGFuZCB0aGVpciBtZWFuaW5ncywgc2VlXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VbWJyYSxfcGVudW1icmFfYW5kX2FudHVtYnJhLlxuXG4vLyBNYXBzIGZvciB0aGUgZGlmZmVyZW50IHNoYWRvdyBzZXRzIGFuZCB0aGVpciB2YWx1ZXMgd2l0aGluIGVhY2ggei1zcGFjZS4gVGhlc2UgdmFsdWVzIHdlcmVcbi8vIGNyZWF0ZWQgYnkgdGFraW5nIGEgZmV3IHJlZmVyZW5jZSBzaGFkb3cgc2V0cyBjcmVhdGVkIGJ5IEdvb2dsZSdzIERlc2lnbmVycyBhbmQgaW50ZXJwb2xhdGluZ1xuLy8gYWxsIG9mIHRoZSB2YWx1ZXMgYmV0d2VlbiB0aGVtLlxuXG5AZnVuY3Rpb24gX2dldC11bWJyYS1tYXAoJGNvbG9yLCAkb3BhY2l0eSkge1xuICAkc2hhZG93LWNvbG9yOiBpZih0eXBlLW9mKCRjb2xvcikgPT0gY29sb3IsIHJnYmEoJGNvbG9yLCAkb3BhY2l0eSAqIDAuMiksICRjb2xvcik7XG5cbiAgQHJldHVybiAoXG4gICAgMDogJzBweCAwcHggMHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOiAnMHB4IDJweCAxcHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyOiAnMHB4IDNweCAxcHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAzOiAnMHB4IDNweCAzcHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA0OiAnMHB4IDJweCA0cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA1OiAnMHB4IDNweCA1cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA2OiAnMHB4IDNweCA1cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA3OiAnMHB4IDRweCA1cHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA4OiAnMHB4IDVweCA1cHggLTNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA5OiAnMHB4IDVweCA2cHggLTNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMDogJzBweCA2cHggNnB4IC0zcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTE6ICcwcHggNnB4IDdweCAtNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDEyOiAnMHB4IDdweCA4cHggLTRweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMzogJzBweCA3cHggOHB4IC00cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTQ6ICcwcHggN3B4IDlweCAtNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE1OiAnMHB4IDhweCA5cHggLTVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNjogJzBweCA4cHggMTBweCAtNXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE3OiAnMHB4IDhweCAxMXB4IC01cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTg6ICcwcHggOXB4IDExcHggLTVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOTogJzBweCA5cHggMTJweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIwOiAnMHB4IDEwcHggMTNweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIxOiAnMHB4IDEwcHggMTNweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIyOiAnMHB4IDEwcHggMTRweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIzOiAnMHB4IDExcHggMTRweCAtN3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI0OiAnMHB4IDExcHggMTVweCAtN3B4ICN7JHNoYWRvdy1jb2xvcn0nXG4gICk7XG59XG5cbkBmdW5jdGlvbiBfZ2V0LXBlbnVtYnJhLW1hcCgkY29sb3IsICRvcGFjaXR5KSB7XG4gICRzaGFkb3ctY29sb3I6IGlmKHR5cGUtb2YoJGNvbG9yKSA9PSBjb2xvciwgcmdiYSgkY29sb3IsICRvcGFjaXR5ICogMC4xNCksICRjb2xvcik7XG5cbiAgQHJldHVybiAoXG4gICAgMDogJzBweCAwcHggMHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOiAnMHB4IDFweCAxcHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI6ICcwcHggMnB4IDJweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMzogJzBweCAzcHggNHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA0OiAnMHB4IDRweCA1cHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDU6ICcwcHggNXB4IDhweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNjogJzBweCA2cHggMTBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNzogJzBweCA3cHggMTBweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgODogJzBweCA4cHggMTBweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgOTogJzBweCA5cHggMTJweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTA6ICcwcHggMTBweCAxNHB4IDFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMTogJzBweCAxMXB4IDE1cHggMXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDEyOiAnMHB4IDEycHggMTdweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTM6ICcwcHggMTNweCAxOXB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNDogJzBweCAxNHB4IDIxcHggMnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE1OiAnMHB4IDE1cHggMjJweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTY6ICcwcHggMTZweCAyNHB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNzogJzBweCAxN3B4IDI2cHggMnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE4OiAnMHB4IDE4cHggMjhweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTk6ICcwcHggMTlweCAyOXB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMDogJzBweCAyMHB4IDMxcHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIxOiAnMHB4IDIxcHggMzNweCAzcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMjI6ICcwcHggMjJweCAzNXB4IDNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMzogJzBweCAyM3B4IDM2cHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI0OiAnMHB4IDI0cHggMzhweCAzcHggI3skc2hhZG93LWNvbG9yfSdcbiAgKTtcbn1cblxuQGZ1bmN0aW9uIF9nZXQtYW1iaWVudC1tYXAoJGNvbG9yLCAkb3BhY2l0eSkge1xuICAkc2hhZG93LWNvbG9yOiBpZih0eXBlLW9mKCRjb2xvcikgPT0gY29sb3IsIHJnYmEoJGNvbG9yLCAkb3BhY2l0eSAqIDAuMTIpLCAkY29sb3IpO1xuXG4gIEByZXR1cm4gKFxuICAgIDA6ICcwcHggMHB4IDBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTogJzBweCAxcHggM3B4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyOiAnMHB4IDFweCA1cHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDM6ICcwcHggMXB4IDhweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNDogJzBweCAxcHggMTBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNTogJzBweCAxcHggMTRweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNjogJzBweCAxcHggMThweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNzogJzBweCAycHggMTZweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgODogJzBweCAzcHggMTRweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgOTogJzBweCAzcHggMTZweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTA6ICcwcHggNHB4IDE4cHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDExOiAnMHB4IDRweCAyMHB4IDNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMjogJzBweCA1cHggMjJweCA0cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTM6ICcwcHggNXB4IDI0cHggNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE0OiAnMHB4IDVweCAyNnB4IDRweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNTogJzBweCA2cHggMjhweCA1cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTY6ICcwcHggNnB4IDMwcHggNXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE3OiAnMHB4IDZweCAzMnB4IDVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxODogJzBweCA3cHggMzRweCA2cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTk6ICcwcHggN3B4IDM2cHggNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIwOiAnMHB4IDhweCAzOHB4IDdweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMTogJzBweCA4cHggNDBweCA3cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMjI6ICcwcHggOHB4IDQycHggN3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIzOiAnMHB4IDlweCA0NHB4IDhweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyNDogJzBweCA5cHggNDZweCA4cHggI3skc2hhZG93LWNvbG9yfSdcbiAgKTtcbn1cblxuLy8gVGhlIGRlZmF1bHQgZHVyYXRpb24gdmFsdWUgZm9yIGVsZXZhdGlvbiB0cmFuc2l0aW9ucy5cbiRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb246IDI4MG1zICFkZWZhdWx0O1xuXG4vLyBUaGUgZGVmYXVsdCBlYXNpbmcgdmFsdWUgZm9yIGVsZXZhdGlvbiB0cmFuc2l0aW9ucy5cbiRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkbWF0LWZhc3Qtb3V0LXNsb3ctaW4tdGltaW5nLWZ1bmN0aW9uO1xuXG4vLyBUaGUgZGVmYXVsdCBjb2xvciBmb3IgZWxldmF0aW9uIHNoYWRvd3MuXG4kbWF0LWVsZXZhdGlvbi1jb2xvcjogYmxhY2sgIWRlZmF1bHQ7XG5cbi8vIFRoZSBkZWZhdWx0IG9wYWNpdHkgc2NhbGluZyB2YWx1ZSBmb3IgZWxldmF0aW9uIHNoYWRvd3MuXG4kbWF0LWVsZXZhdGlvbi1vcGFjaXR5OiAxICFkZWZhdWx0O1xuXG4vLyBQcmVmaXggZm9yIGVsZXZhdGlvbi1yZWxhdGVkIHNlbGVjdG9ycy5cbiRfbWF0LWVsZXZhdGlvbi1wcmVmaXg6ICdtYXQtZWxldmF0aW9uLXonO1xuXG4vLyBBcHBsaWVzIHRoZSBjb3JyZWN0IGNzcyBydWxlcyB0byBhbiBlbGVtZW50IHRvIGdpdmUgaXQgdGhlIGVsZXZhdGlvbiBzcGVjaWZpZWQgYnkgJHpWYWx1ZS5cbi8vIFRoZSAkelZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNC5cbkBtaXhpbiBtYXQtZWxldmF0aW9uKCR6VmFsdWUsICRjb2xvcjogJG1hdC1lbGV2YXRpb24tY29sb3IsICRvcGFjaXR5OiAkbWF0LWVsZXZhdGlvbi1vcGFjaXR5KSB7XG4gIEBpZiB0eXBlLW9mKCR6VmFsdWUpICE9IG51bWJlciBvciBub3QgdW5pdGxlc3MoJHpWYWx1ZSkge1xuICAgIEBlcnJvciAnJHpWYWx1ZSBtdXN0IGJlIGEgdW5pdGxlc3MgbnVtYmVyJztcbiAgfVxuICBAaWYgJHpWYWx1ZSA8IDAgb3IgJHpWYWx1ZSA+IDI0IHtcbiAgICBAZXJyb3IgJyR6VmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI0JztcbiAgfVxuXG4gIGJveC1zaGFkb3c6ICN7bWFwLWdldChfZ2V0LXVtYnJhLW1hcCgkY29sb3IsICRvcGFjaXR5KSwgJHpWYWx1ZSl9LFxuICAgICAgICAgICAgICAje21hcC1nZXQoX2dldC1wZW51bWJyYS1tYXAoJGNvbG9yLCAkb3BhY2l0eSksICR6VmFsdWUpfSxcbiAgICAgICAgICAgICAgI3ttYXAtZ2V0KF9nZXQtYW1iaWVudC1tYXAoJGNvbG9yLCAkb3BhY2l0eSksICR6VmFsdWUpfTtcbn1cblxuQG1peGluIF9tYXQtdGhlbWUtZWxldmF0aW9uKCR6VmFsdWUsICR0aGVtZSwgJG9wYWNpdHk6ICRtYXQtZWxldmF0aW9uLW9wYWNpdHkpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGVsZXZhdGlvbi1jb2xvcjogbWFwLWdldCgkZm9yZWdyb3VuZCwgZWxldmF0aW9uKTtcbiAgJGVsZXZhdGlvbi1jb2xvci1vci1kZWZhdWx0OiBpZigkZWxldmF0aW9uLWNvbG9yID09IG51bGwsICRtYXQtZWxldmF0aW9uLWNvbG9yLCAkZWxldmF0aW9uLWNvbG9yKTtcblxuICBAaW5jbHVkZSBtYXQtZWxldmF0aW9uKCR6VmFsdWUsICRlbGV2YXRpb24tY29sb3Itb3ItZGVmYXVsdCwgJG9wYWNpdHkpO1xufVxuXG4vLyBBcHBsaWVzIHRoZSBlbGV2YXRpb24gdG8gYW4gZWxlbWVudCBpbiBhIG1hbm5lciB0aGF0IGFsbG93c1xuLy8gY29uc3VtZXJzIHRvIG92ZXJyaWRlIGl0IHZpYSB0aGUgTWF0ZXJpYWwgZWxldmF0aW9uIGNsYXNzZXMuXG5AbWl4aW4gbWF0LW92ZXJyaWRhYmxlLWVsZXZhdGlvbihcbiAgICAkelZhbHVlLFxuICAgICRjb2xvcjogJG1hdC1lbGV2YXRpb24tY29sb3IsXG4gICAgJG9wYWNpdHk6ICRtYXQtZWxldmF0aW9uLW9wYWNpdHkpIHtcbiAgJjpub3QoW2NsYXNzKj0nI3skX21hdC1lbGV2YXRpb24tcHJlZml4fSddKSB7XG4gICAgQGluY2x1ZGUgbWF0LWVsZXZhdGlvbigkelZhbHVlLCAkY29sb3IsICRvcGFjaXR5KTtcbiAgfVxufVxuXG5AbWl4aW4gX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oJHpWYWx1ZSwgJHRoZW1lLCAkb3BhY2l0eTogJG1hdC1lbGV2YXRpb24tb3BhY2l0eSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkZWxldmF0aW9uLWNvbG9yOiBtYXAtZ2V0KCRmb3JlZ3JvdW5kLCBlbGV2YXRpb24pO1xuICAkZWxldmF0aW9uLWNvbG9yLW9yLWRlZmF1bHQ6IGlmKCRlbGV2YXRpb24tY29sb3IgPT0gbnVsbCwgJG1hdC1lbGV2YXRpb24tY29sb3IsICRlbGV2YXRpb24tY29sb3IpO1xuXG4gIEBpbmNsdWRlIG1hdC1vdmVycmlkYWJsZS1lbGV2YXRpb24oJHpWYWx1ZSwgJGVsZXZhdGlvbi1jb2xvci1vci1kZWZhdWx0LCAkb3BhY2l0eSk7XG59XG5cbi8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgdHJhbnNpdGlvbiBwcm9wZXJ0eSBmb3IgZWxldmF0aW9uLlxuLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIGEgY29tcG9uZW50IG5lZWRzIHRvIHRyYW5zaXRpb25cbi8vIG1vcmUgdGhhbiBvbmUgcHJvcGVydHkuXG4vL1xuLy8gLmZvbyB7XG4vLyAgIHRyYW5zaXRpb246IG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi1wcm9wZXJ0eS12YWx1ZSgpLCBvcGFjaXR5IDEwMG1zIGVhc2U7XG4vLyB9XG5AZnVuY3Rpb24gbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXByb3BlcnR5LXZhbHVlKFxuICAgICRkdXJhdGlvbjogJG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi1kdXJhdGlvbixcbiAgICAkZWFzaW5nOiAkbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikge1xuICBAcmV0dXJuIGJveC1zaGFkb3cgI3skZHVyYXRpb259ICN7JGVhc2luZ307XG59XG5cbi8vIEFwcGxpZXMgdGhlIGNvcnJlY3QgY3NzIHJ1bGVzIG5lZWRlZCB0byBoYXZlIGFuIGVsZW1lbnQgdHJhbnNpdGlvbiBiZXR3ZWVuIGVsZXZhdGlvbnMuXG4vLyBUaGlzIG1peGluIHNob3VsZCBiZSBhcHBsaWVkIHRvIGVsZW1lbnRzIHdob3NlIGVsZXZhdGlvbiB2YWx1ZXMgd2lsbCBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZWlyXG4vLyBjb250ZXh0IChlLmcuIHdoZW4gYWN0aXZlIG9yIGRpc2FibGVkKS5cbi8vXG4vLyBOT1RFKHRyYXZpc2thdWZtYW4pOiBCb3RoIHRoaXMgbWl4aW4gYW5kIHRoZSBhYm92ZSBmdW5jdGlvbiB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzIHNvIHRoZXkgY2FuXG4vLyBiZSB1c2VkIGluIHRoZSBzYW1lIHdheSBieSBjbGllbnRzLlxuQG1peGluIG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbihcbiAgICAkZHVyYXRpb246ICRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb24sXG4gICAgJGVhc2luZzogJG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24pIHtcbiAgdHJhbnNpdGlvbjogbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXByb3BlcnR5LXZhbHVlKCRkdXJhdGlvbiwgJGVhc2luZyk7XG59XG5cbi8vIENvbG9yIHBhbGV0dGVzIGZyb20gdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLlxuLy8gU2VlIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduL2NvbG9yL1xuLy9cbi8vIENvbnRyYXN0IGNvbG9ycyBhcmUgaGFyZC1jb2RlZCBiZWNhdXNlIGl0IGlzIHRvbyBkaWZmaWN1bHQgKHByb2JhYmx5IGltcG9zc2libGUpIHRvXG4vLyBjYWxjdWxhdGUgdGhlbS4gVGhlc2UgY29udHJhc3QgY29sb3JzIGFyZSBwdWxsZWQgZnJvbSB0aGUgcHVibGljIE1hdGVyaWFsIERlc2lnbiBzcGVjIHN3YXRjaGVzLlxuLy8gV2hpbGUgdGhlIGNvbnRyYXN0IGNvbG9ycyBpbiB0aGUgc3BlYyBhcmUgbm90IHByZXNjcmlwdGl2ZSwgd2UgdXNlIHRoZW0gZm9yIGNvbnZlbmllbmNlLlxuXG5cbi8vIEBkZXByZWNhdGVkIHJlbmFtZWQgdG8gJGRhcmstcHJpbWFyeS10ZXh0LlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJGJsYWNrLTg3LW9wYWNpdHk6IHJnYmEoYmxhY2ssIDAuODcpO1xuLy8gQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byAkbGlnaHQtcHJpbWFyeS10ZXh0LlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJHdoaXRlLTg3LW9wYWNpdHk6IHJnYmEod2hpdGUsIDAuODcpO1xuLy8gQGRlcHJlY2F0ZWQgdXNlICRkYXJrLVtzZWNvbmRhcnktdGV4dCxkaXNhYmxlZC10ZXh0LGRpdmlkZXJzLGZvY3VzZWRdIGluc3RlYWQuXG4vLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wXG4kYmxhY2stMTItb3BhY2l0eTogcmdiYShibGFjaywgMC4xMik7XG4vLyBAZGVwcmVjYXRlZCB1c2UgJGxpZ2h0LVtzZWNvbmRhcnktdGV4dCxkaXNhYmxlZC10ZXh0LGRpdmlkZXJzLGZvY3VzZWRdIGluc3RlYWQuXG4vLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wXG4kd2hpdGUtMTItb3BhY2l0eTogcmdiYSh3aGl0ZSwgMC4xMik7XG4vLyBAZGVwcmVjYXRlZCB1c2UgJGRhcmstW3NlY29uZGFyeS10ZXh0LGRpc2FibGVkLXRleHQsZGl2aWRlcnMsZm9jdXNlZF0gaW5zdGVhZC5cbi8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjBcbiRibGFjay02LW9wYWNpdHk6IHJnYmEoYmxhY2ssIDAuMDYpO1xuLy8gQGRlcHJlY2F0ZWQgdXNlICRsaWdodC1bc2Vjb25kYXJ5LXRleHQsZGlzYWJsZWQtdGV4dCxkaXZpZGVycyxmb2N1c2VkXSBpbnN0ZWFkLlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJHdoaXRlLTYtb3BhY2l0eTogcmdiYSh3aGl0ZSwgMC4wNik7XG5cbiRkYXJrLXByaW1hcnktdGV4dDogcmdiYShibGFjaywgMC44Nyk7XG4kZGFyay1zZWNvbmRhcnktdGV4dDogcmdiYShibGFjaywgMC41NCk7XG4kZGFyay1kaXNhYmxlZC10ZXh0OiByZ2JhKGJsYWNrLCAwLjM4KTtcbiRkYXJrLWRpdmlkZXJzOiByZ2JhKGJsYWNrLCAwLjEyKTtcbiRkYXJrLWZvY3VzZWQ6IHJnYmEoYmxhY2ssIDAuMTIpO1xuJGxpZ2h0LXByaW1hcnktdGV4dDogd2hpdGU7XG4kbGlnaHQtc2Vjb25kYXJ5LXRleHQ6IHJnYmEod2hpdGUsIDAuNyk7XG4kbGlnaHQtZGlzYWJsZWQtdGV4dDogcmdiYSh3aGl0ZSwgMC41KTtcbiRsaWdodC1kaXZpZGVyczogcmdiYSh3aGl0ZSwgMC4xMik7XG4kbGlnaHQtZm9jdXNlZDogcmdiYSh3aGl0ZSwgMC4xMik7XG5cbiRtYXQtcmVkOiAoXG4gIDUwOiAjZmZlYmVlLFxuICAxMDA6ICNmZmNkZDIsXG4gIDIwMDogI2VmOWE5YSxcbiAgMzAwOiAjZTU3MzczLFxuICA0MDA6ICNlZjUzNTAsXG4gIDUwMDogI2Y0NDMzNixcbiAgNjAwOiAjZTUzOTM1LFxuICA3MDA6ICNkMzJmMmYsXG4gIDgwMDogI2M2MjgyOCxcbiAgOTAwOiAjYjcxYzFjLFxuICBBMTAwOiAjZmY4YTgwLFxuICBBMjAwOiAjZmY1MjUyLFxuICBBNDAwOiAjZmYxNzQ0LFxuICBBNzAwOiAjZDUwMDAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtcGluazogKFxuICA1MDogI2ZjZTRlYyxcbiAgMTAwOiAjZjhiYmQwLFxuICAyMDA6ICNmNDhmYjEsXG4gIDMwMDogI2YwNjI5MixcbiAgNDAwOiAjZWM0MDdhLFxuICA1MDA6ICNlOTFlNjMsXG4gIDYwMDogI2Q4MWI2MCxcbiAgNzAwOiAjYzIxODViLFxuICA4MDA6ICNhZDE0NTcsXG4gIDkwMDogIzg4MGU0ZixcbiAgQTEwMDogI2ZmODBhYixcbiAgQTIwMDogI2ZmNDA4MSxcbiAgQTQwMDogI2Y1MDA1NyxcbiAgQTcwMDogI2M1MTE2MixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LXB1cnBsZTogKFxuICA1MDogI2YzZTVmNSxcbiAgMTAwOiAjZTFiZWU3LFxuICAyMDA6ICNjZTkzZDgsXG4gIDMwMDogI2JhNjhjOCxcbiAgNDAwOiAjYWI0N2JjLFxuICA1MDA6ICM5YzI3YjAsXG4gIDYwMDogIzhlMjRhYSxcbiAgNzAwOiAjN2IxZmEyLFxuICA4MDA6ICM2YTFiOWEsXG4gIDkwMDogIzRhMTQ4YyxcbiAgQTEwMDogI2VhODBmYyxcbiAgQTIwMDogI2UwNDBmYixcbiAgQTQwMDogI2Q1MDBmOSxcbiAgQTcwMDogI2FhMDBmZixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtZGVlcC1wdXJwbGU6IChcbiAgNTA6ICNlZGU3ZjYsXG4gIDEwMDogI2QxYzRlOSxcbiAgMjAwOiAjYjM5ZGRiLFxuICAzMDA6ICM5NTc1Y2QsXG4gIDQwMDogIzdlNTdjMixcbiAgNTAwOiAjNjczYWI3LFxuICA2MDA6ICM1ZTM1YjEsXG4gIDcwMDogIzUxMmRhOCxcbiAgODAwOiAjNDUyN2EwLFxuICA5MDA6ICMzMTFiOTIsXG4gIEExMDA6ICNiMzg4ZmYsXG4gIEEyMDA6ICM3YzRkZmYsXG4gIEE0MDA6ICM2NTFmZmYsXG4gIEE3MDA6ICM2MjAwZWEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWluZGlnbzogKFxuICA1MDogI2U4ZWFmNixcbiAgMTAwOiAjYzVjYWU5LFxuICAyMDA6ICM5ZmE4ZGEsXG4gIDMwMDogIzc5ODZjYixcbiAgNDAwOiAjNWM2YmMwLFxuICA1MDA6ICMzZjUxYjUsXG4gIDYwMDogIzM5NDlhYixcbiAgNzAwOiAjMzAzZjlmLFxuICA4MDA6ICMyODM1OTMsXG4gIDkwMDogIzFhMjM3ZSxcbiAgQTEwMDogIzhjOWVmZixcbiAgQTIwMDogIzUzNmRmZSxcbiAgQTQwMDogIzNkNWFmZSxcbiAgQTcwMDogIzMwNGZmZSxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtYmx1ZTogKFxuICA1MDogI2UzZjJmZCxcbiAgMTAwOiAjYmJkZWZiLFxuICAyMDA6ICM5MGNhZjksXG4gIDMwMDogIzY0YjVmNixcbiAgNDAwOiAjNDJhNWY1LFxuICA1MDA6ICMyMTk2ZjMsXG4gIDYwMDogIzFlODhlNSxcbiAgNzAwOiAjMTk3NmQyLFxuICA4MDA6ICMxNTY1YzAsXG4gIDkwMDogIzBkNDdhMSxcbiAgQTEwMDogIzgyYjFmZixcbiAgQTIwMDogIzQ0OGFmZixcbiAgQTQwMDogIzI5NzlmZixcbiAgQTcwMDogIzI5NjJmZixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWxpZ2h0LWJsdWU6IChcbiAgNTA6ICNlMWY1ZmUsXG4gIDEwMDogI2IzZTVmYyxcbiAgMjAwOiAjODFkNGZhLFxuICAzMDA6ICM0ZmMzZjcsXG4gIDQwMDogIzI5YjZmNixcbiAgNTAwOiAjMDNhOWY0LFxuICA2MDA6ICMwMzliZTUsXG4gIDcwMDogIzAyODhkMSxcbiAgODAwOiAjMDI3N2JkLFxuICA5MDA6ICMwMTU3OWIsXG4gIEExMDA6ICM4MGQ4ZmYsXG4gIEEyMDA6ICM0MGM0ZmYsXG4gIEE0MDA6ICMwMGIwZmYsXG4gIEE3MDA6ICMwMDkxZWEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtY3lhbjogKFxuICA1MDogI2UwZjdmYSxcbiAgMTAwOiAjYjJlYmYyLFxuICAyMDA6ICM4MGRlZWEsXG4gIDMwMDogIzRkZDBlMSxcbiAgNDAwOiAjMjZjNmRhLFxuICA1MDA6ICMwMGJjZDQsXG4gIDYwMDogIzAwYWNjMSxcbiAgNzAwOiAjMDA5N2E3LFxuICA4MDA6ICMwMDgzOGYsXG4gIDkwMDogIzAwNjA2NCxcbiAgQTEwMDogIzg0ZmZmZixcbiAgQTIwMDogIzE4ZmZmZixcbiAgQTQwMDogIzAwZTVmZixcbiAgQTcwMDogIzAwYjhkNCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LXRlYWw6IChcbiAgNTA6ICNlMGYyZjEsXG4gIDEwMDogI2IyZGZkYixcbiAgMjAwOiAjODBjYmM0LFxuICAzMDA6ICM0ZGI2YWMsXG4gIDQwMDogIzI2YTY5YSxcbiAgNTAwOiAjMDA5Njg4LFxuICA2MDA6ICMwMDg5N2IsXG4gIDcwMDogIzAwNzk2YixcbiAgODAwOiAjMDA2OTVjLFxuICA5MDA6ICMwMDRkNDAsXG4gIEExMDA6ICNhN2ZmZWIsXG4gIEEyMDA6ICM2NGZmZGEsXG4gIEE0MDA6ICMxZGU5YjYsXG4gIEE3MDA6ICMwMGJmYTUsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgKVxuKTtcblxuJG1hdC1ncmVlbjogKFxuICA1MDogI2U4ZjVlOSxcbiAgMTAwOiAjYzhlNmM5LFxuICAyMDA6ICNhNWQ2YTcsXG4gIDMwMDogIzgxYzc4NCxcbiAgNDAwOiAjNjZiYjZhLFxuICA1MDA6ICM0Y2FmNTAsXG4gIDYwMDogIzQzYTA0NyxcbiAgNzAwOiAjMzg4ZTNjLFxuICA4MDA6ICMyZTdkMzIsXG4gIDkwMDogIzFiNWUyMCxcbiAgQTEwMDogI2I5ZjZjYSxcbiAgQTIwMDogIzY5ZjBhZSxcbiAgQTQwMDogIzAwZTY3NixcbiAgQTcwMDogIzAwYzg1MyxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtbGlnaHQtZ3JlZW46IChcbiAgNTA6ICNmMWY4ZTksXG4gIDEwMDogI2RjZWRjOCxcbiAgMjAwOiAjYzVlMWE1LFxuICAzMDA6ICNhZWQ1ODEsXG4gIDQwMDogIzljY2M2NSxcbiAgNTAwOiAjOGJjMzRhLFxuICA2MDA6ICM3Y2IzNDIsXG4gIDcwMDogIzY4OWYzOCxcbiAgODAwOiAjNTU4YjJmLFxuICA5MDA6ICMzMzY5MWUsXG4gIEExMDA6ICNjY2ZmOTAsXG4gIEEyMDA6ICNiMmZmNTksXG4gIEE0MDA6ICM3NmZmMDMsXG4gIEE3MDA6ICM2NGRkMTcsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtbGltZTogKFxuICA1MDogI2Y5ZmJlNyxcbiAgMTAwOiAjZjBmNGMzLFxuICAyMDA6ICNlNmVlOWMsXG4gIDMwMDogI2RjZTc3NSxcbiAgNDAwOiAjZDRlMTU3LFxuICA1MDA6ICNjZGRjMzksXG4gIDYwMDogI2MwY2EzMyxcbiAgNzAwOiAjYWZiNDJiLFxuICA4MDA6ICM5ZTlkMjQsXG4gIDkwMDogIzgyNzcxNyxcbiAgQTEwMDogI2Y0ZmY4MSxcbiAgQTIwMDogI2VlZmY0MSxcbiAgQTQwMDogI2M2ZmYwMCxcbiAgQTcwMDogI2FlZWEwMCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQteWVsbG93OiAoXG4gIDUwOiAjZmZmZGU3LFxuICAxMDA6ICNmZmY5YzQsXG4gIDIwMDogI2ZmZjU5ZCxcbiAgMzAwOiAjZmZmMTc2LFxuICA0MDA6ICNmZmVlNTgsXG4gIDUwMDogI2ZmZWIzYixcbiAgNjAwOiAjZmRkODM1LFxuICA3MDA6ICNmYmMwMmQsXG4gIDgwMDogI2Y5YTgyNSxcbiAgOTAwOiAjZjU3ZjE3LFxuICBBMTAwOiAjZmZmZjhkLFxuICBBMjAwOiAjZmZmZjAwLFxuICBBNDAwOiAjZmZlYTAwLFxuICBBNzAwOiAjZmZkNjAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWFtYmVyOiAoXG4gIDUwOiAjZmZmOGUxLFxuICAxMDA6ICNmZmVjYjMsXG4gIDIwMDogI2ZmZTA4MixcbiAgMzAwOiAjZmZkNTRmLFxuICA0MDA6ICNmZmNhMjgsXG4gIDUwMDogI2ZmYzEwNyxcbiAgNjAwOiAjZmZiMzAwLFxuICA3MDA6ICNmZmEwMDAsXG4gIDgwMDogI2ZmOGYwMCxcbiAgOTAwOiAjZmY2ZjAwLFxuICBBMTAwOiAjZmZlNTdmLFxuICBBMjAwOiAjZmZkNzQwLFxuICBBNDAwOiAjZmZjNDAwLFxuICBBNzAwOiAjZmZhYjAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LW9yYW5nZTogKFxuICA1MDogI2ZmZjNlMCxcbiAgMTAwOiAjZmZlMGIyLFxuICAyMDA6ICNmZmNjODAsXG4gIDMwMDogI2ZmYjc0ZCxcbiAgNDAwOiAjZmZhNzI2LFxuICA1MDA6ICNmZjk4MDAsXG4gIDYwMDogI2ZiOGMwMCxcbiAgNzAwOiAjZjU3YzAwLFxuICA4MDA6ICNlZjZjMDAsXG4gIDkwMDogI2U2NTEwMCxcbiAgQTEwMDogI2ZmZDE4MCxcbiAgQTIwMDogI2ZmYWI0MCxcbiAgQTQwMDogI2ZmOTEwMCxcbiAgQTcwMDogI2ZmNmQwMCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogYmxhY2ssXG4gIClcbik7XG5cbiRtYXQtZGVlcC1vcmFuZ2U6IChcbiAgNTA6ICNmYmU5ZTcsXG4gIDEwMDogI2ZmY2NiYyxcbiAgMjAwOiAjZmZhYjkxLFxuICAzMDA6ICNmZjhhNjUsXG4gIDQwMDogI2ZmNzA0MyxcbiAgNTAwOiAjZmY1NzIyLFxuICA2MDA6ICNmNDUxMWUsXG4gIDcwMDogI2U2NGExOSxcbiAgODAwOiAjZDg0MzE1LFxuICA5MDA6ICNiZjM2MGMsXG4gIEExMDA6ICNmZjllODAsXG4gIEEyMDA6ICNmZjZlNDAsXG4gIEE0MDA6ICNmZjNkMDAsXG4gIEE3MDA6ICNkZDJjMDAsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWJyb3duOiAoXG4gIDUwOiAjZWZlYmU5LFxuICAxMDA6ICNkN2NjYzgsXG4gIDIwMDogI2JjYWFhNCxcbiAgMzAwOiAjYTE4ODdmLFxuICA0MDA6ICM4ZDZlNjMsXG4gIDUwMDogIzc5NTU0OCxcbiAgNjAwOiAjNmQ0YzQxLFxuICA3MDA6ICM1ZDQwMzcsXG4gIDgwMDogIzRlMzQyZSxcbiAgOTAwOiAjM2UyNzIzLFxuICBBMTAwOiAjZDdjY2M4LFxuICBBMjAwOiAjYmNhYWE0LFxuICBBNDAwOiAjOGQ2ZTYzLFxuICBBNzAwOiAjNWQ0MDM3LFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWdyZXk6IChcbiAgNTA6ICNmYWZhZmEsXG4gIDEwMDogI2Y1ZjVmNSxcbiAgMjAwOiAjZWVlZWVlLFxuICAzMDA6ICNlMGUwZTAsXG4gIDQwMDogI2JkYmRiZCxcbiAgNTAwOiAjOWU5ZTllLFxuICA2MDA6ICM3NTc1NzUsXG4gIDcwMDogIzYxNjE2MSxcbiAgODAwOiAjNDI0MjQyLFxuICA5MDA6ICMyMTIxMjEsXG4gIEExMDA6ICNmZmZmZmYsXG4gIEEyMDA6ICNlZWVlZWUsXG4gIEE0MDA6ICNiZGJkYmQsXG4gIEE3MDA6ICM2MTYxNjEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgKVxuKTtcblxuLy8gQWxpYXMgZm9yIGFsdGVybmF0ZSBzcGVsbGluZy5cbiRtYXQtZ3JheTogJG1hdC1ncmV5O1xuXG4kbWF0LWJsdWUtZ3JleTogKFxuICA1MDogI2VjZWZmMSxcbiAgMTAwOiAjY2ZkOGRjLFxuICAyMDA6ICNiMGJlYzUsXG4gIDMwMDogIzkwYTRhZSxcbiAgNDAwOiAjNzg5MDljLFxuICA1MDA6ICM2MDdkOGIsXG4gIDYwMDogIzU0NmU3YSxcbiAgNzAwOiAjNDU1YTY0LFxuICA4MDA6ICMzNzQ3NGYsXG4gIDkwMDogIzI2MzIzOCxcbiAgQTEwMDogI2NmZDhkYyxcbiAgQTIwMDogI2IwYmVjNSxcbiAgQTQwMDogIzc4OTA5YyxcbiAgQTcwMDogIzQ1NWE2NCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4vLyBBbGlhcyBmb3IgYWx0ZXJuYXRlIHNwZWxsaW5nLlxuJG1hdC1ibHVlLWdyYXk6ICRtYXQtYmx1ZS1ncmV5O1xuXG5cbi8vIEJhY2tncm91bmQgcGFsZXR0ZSBmb3IgbGlnaHQgdGhlbWVzLlxuJG1hdC1saWdodC10aGVtZS1iYWNrZ3JvdW5kOiAoXG4gIHN0YXR1cy1iYXI6IG1hcF9nZXQoJG1hdC1ncmV5LCAzMDApLFxuICBhcHAtYmFyOiAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgMTAwKSxcbiAgYmFja2dyb3VuZDogbWFwX2dldCgkbWF0LWdyZXksIDUwKSxcbiAgaG92ZXI6ICAgICAgcmdiYShibGFjaywgMC4wNCksIC8vIFRPRE8oa2FyYSk6IGNoZWNrIHN0eWxlIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYXG4gIGNhcmQ6ICAgICAgIHdoaXRlLFxuICBkaWFsb2c6ICAgICB3aGl0ZSxcbiAgZGlzYWJsZWQtYnV0dG9uOiByZ2JhKGJsYWNrLCAwLjEyKSxcbiAgcmFpc2VkLWJ1dHRvbjogd2hpdGUsXG4gIGZvY3VzZWQtYnV0dG9uOiAkZGFyay1mb2N1c2VkLFxuICBzZWxlY3RlZC1idXR0b246IG1hcF9nZXQoJG1hdC1ncmV5LCAzMDApLFxuICBzZWxlY3RlZC1kaXNhYmxlZC1idXR0b246IG1hcF9nZXQoJG1hdC1ncmV5LCA0MDApLFxuICBkaXNhYmxlZC1idXR0b24tdG9nZ2xlOiBtYXBfZ2V0KCRtYXQtZ3JleSwgMjAwKSxcbiAgdW5zZWxlY3RlZC1jaGlwOiBtYXBfZ2V0KCRtYXQtZ3JleSwgMzAwKSxcbiAgZGlzYWJsZWQtbGlzdC1vcHRpb246IG1hcF9nZXQoJG1hdC1ncmV5LCAyMDApLFxuKTtcblxuLy8gQmFja2dyb3VuZCBwYWxldHRlIGZvciBkYXJrIHRoZW1lcy5cbiRtYXQtZGFyay10aGVtZS1iYWNrZ3JvdW5kOiAoXG4gIHN0YXR1cy1iYXI6IGJsYWNrLFxuICBhcHAtYmFyOiAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgOTAwKSxcbiAgYmFja2dyb3VuZDogIzMwMzAzMCxcbiAgaG92ZXI6ICAgICAgcmdiYSh3aGl0ZSwgMC4wNCksIC8vIFRPRE8oa2FyYSk6IGNoZWNrIHN0eWxlIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYXG4gIGNhcmQ6ICAgICAgIG1hcF9nZXQoJG1hdC1ncmV5LCA4MDApLFxuICBkaWFsb2c6ICAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgODAwKSxcbiAgZGlzYWJsZWQtYnV0dG9uOiByZ2JhKHdoaXRlLCAwLjEyKSxcbiAgcmFpc2VkLWJ1dHRvbjogbWFwLWdldCgkbWF0LWdyZXksIDgwMCksXG4gIGZvY3VzZWQtYnV0dG9uOiAkbGlnaHQtZm9jdXNlZCxcbiAgc2VsZWN0ZWQtYnV0dG9uOiBtYXBfZ2V0KCRtYXQtZ3JleSwgOTAwKSxcbiAgc2VsZWN0ZWQtZGlzYWJsZWQtYnV0dG9uOiBtYXBfZ2V0KCRtYXQtZ3JleSwgODAwKSxcbiAgZGlzYWJsZWQtYnV0dG9uLXRvZ2dsZTogYmxhY2ssXG4gIHVuc2VsZWN0ZWQtY2hpcDogbWFwX2dldCgkbWF0LWdyZXksIDcwMCksXG4gIGRpc2FibGVkLWxpc3Qtb3B0aW9uOiBibGFjayxcbik7XG5cbi8vIEZvcmVncm91bmQgcGFsZXR0ZSBmb3IgbGlnaHQgdGhlbWVzLlxuJG1hdC1saWdodC10aGVtZS1mb3JlZ3JvdW5kOiAoXG4gIGJhc2U6ICAgICAgICAgICAgICBibGFjayxcbiAgZGl2aWRlcjogICAgICAgICAgICRkYXJrLWRpdmlkZXJzLFxuICBkaXZpZGVyczogICAgICAgICAgJGRhcmstZGl2aWRlcnMsXG4gIGRpc2FibGVkOiAgICAgICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBkaXNhYmxlZC1idXR0b246ICAgcmdiYShibGFjaywgMC4yNiksXG4gIGRpc2FibGVkLXRleHQ6ICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBlbGV2YXRpb246ICAgICAgICAgYmxhY2ssXG4gIGhpbnQtdGV4dDogICAgICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBzZWNvbmRhcnktdGV4dDogICAgJGRhcmstc2Vjb25kYXJ5LXRleHQsXG4gIGljb246ICAgICAgICAgICAgICByZ2JhKGJsYWNrLCAwLjU0KSxcbiAgaWNvbnM6ICAgICAgICAgICAgIHJnYmEoYmxhY2ssIDAuNTQpLFxuICB0ZXh0OiAgICAgICAgICAgICAgcmdiYShibGFjaywgMC44NyksXG4gIHNsaWRlci1taW46ICAgICAgICByZ2JhKGJsYWNrLCAwLjg3KSxcbiAgc2xpZGVyLW9mZjogICAgICAgIHJnYmEoYmxhY2ssIDAuMjYpLFxuICBzbGlkZXItb2ZmLWFjdGl2ZTogcmdiYShibGFjaywgMC4zOCksXG4pO1xuXG4vLyBGb3JlZ3JvdW5kIHBhbGV0dGUgZm9yIGRhcmsgdGhlbWVzLlxuJG1hdC1kYXJrLXRoZW1lLWZvcmVncm91bmQ6IChcbiAgYmFzZTogICAgICAgICAgICAgIHdoaXRlLFxuICBkaXZpZGVyOiAgICAgICAgICAgJGxpZ2h0LWRpdmlkZXJzLFxuICBkaXZpZGVyczogICAgICAgICAgJGxpZ2h0LWRpdmlkZXJzLFxuICBkaXNhYmxlZDogICAgICAgICAgJGxpZ2h0LWRpc2FibGVkLXRleHQsXG4gIGRpc2FibGVkLWJ1dHRvbjogICByZ2JhKHdoaXRlLCAwLjMpLFxuICBkaXNhYmxlZC10ZXh0OiAgICAgJGxpZ2h0LWRpc2FibGVkLXRleHQsXG4gIGVsZXZhdGlvbjogICAgICAgICBibGFjayxcbiAgaGludC10ZXh0OiAgICAgICAgICRsaWdodC1kaXNhYmxlZC10ZXh0LFxuICBzZWNvbmRhcnktdGV4dDogICAgJGxpZ2h0LXNlY29uZGFyeS10ZXh0LFxuICBpY29uOiAgICAgICAgICAgICAgd2hpdGUsXG4gIGljb25zOiAgICAgICAgICAgICB3aGl0ZSxcbiAgdGV4dDogICAgICAgICAgICAgIHdoaXRlLFxuICBzbGlkZXItbWluOiAgICAgICAgd2hpdGUsXG4gIHNsaWRlci1vZmY6ICAgICAgICByZ2JhKHdoaXRlLCAwLjMpLFxuICBzbGlkZXItb2ZmLWFjdGl2ZTogcmdiYSh3aGl0ZSwgMC4zKSxcbik7XG5cblxuXG4vLyBGb3IgYSBnaXZlbiBodWUgaW4gYSBwYWxldHRlLCByZXR1cm4gdGhlIGNvbnRyYXN0IGNvbG9yIGZyb20gdGhlIG1hcCBvZiBjb250cmFzdCBwYWxldHRlcy5cbi8vIEBwYXJhbSAkY29sb3ItbWFwXG4vLyBAcGFyYW0gJGh1ZVxuQGZ1bmN0aW9uIG1hdC1jb250cmFzdCgkcGFsZXR0ZSwgJGh1ZSkge1xuICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkcGFsZXR0ZSwgY29udHJhc3QpLCAkaHVlKTtcbn1cblxuXG4vLyBDcmVhdGVzIGEgbWFwIG9mIGh1ZXMgdG8gY29sb3JzIGZvciBhIHRoZW1lLiBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIGEgdGhlbWUgcGFsZXR0ZSBpbiB0ZXJtc1xuLy8gb2YgdGhlIE1hdGVyaWFsIERlc2lnbiBodWVzLlxuLy8gQHBhcmFtICRjb2xvci1tYXBcbi8vIEBwYXJhbSAkcHJpbWFyeVxuLy8gQHBhcmFtICRsaWdodGVyXG5AZnVuY3Rpb24gbWF0LXBhbGV0dGUoJGJhc2UtcGFsZXR0ZSwgJGRlZmF1bHQ6IDUwMCwgJGxpZ2h0ZXI6IDEwMCwgJGRhcmtlcjogNzAwKSB7XG4gICRyZXN1bHQ6IG1hcF9tZXJnZSgkYmFzZS1wYWxldHRlLCAoXG4gICAgZGVmYXVsdDogbWFwLWdldCgkYmFzZS1wYWxldHRlLCAkZGVmYXVsdCksXG4gICAgbGlnaHRlcjogbWFwLWdldCgkYmFzZS1wYWxldHRlLCAkbGlnaHRlciksXG4gICAgZGFya2VyOiBtYXAtZ2V0KCRiYXNlLXBhbGV0dGUsICRkYXJrZXIpLFxuXG4gICAgZGVmYXVsdC1jb250cmFzdDogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRkZWZhdWx0KSxcbiAgICBsaWdodGVyLWNvbnRyYXN0OiBtYXQtY29udHJhc3QoJGJhc2UtcGFsZXR0ZSwgJGxpZ2h0ZXIpLFxuICAgIGRhcmtlci1jb250cmFzdDogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRkYXJrZXIpXG4gICkpO1xuXG4gIC8vIEZvciBlYWNoIGh1ZSBpbiB0aGUgcGFsZXR0ZSwgYWRkIGEgXCItY29udHJhc3RcIiBjb2xvciB0byB0aGUgbWFwLlxuICBAZWFjaCAkaHVlLCAkY29sb3IgaW4gJGJhc2UtcGFsZXR0ZSB7XG4gICAgJHJlc3VsdDogbWFwX21lcmdlKCRyZXN1bHQsIChcbiAgICAgICcjeyRodWV9LWNvbnRyYXN0JzogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRodWUpXG4gICAgKSk7XG4gIH1cblxuICBAcmV0dXJuICRyZXN1bHQ7XG59XG5cblxuLy8gR2V0cyBhIGNvbG9yIGZyb20gYSB0aGVtZSBwYWxldHRlICh0aGUgb3V0cHV0IG9mIG1hdC1wYWxldHRlKS5cbi8vIFRoZSBodWUgY2FuIGJlIG9uZSBvZiB0aGUgc3RhbmRhcmQgdmFsdWVzICg1MDAsIEE0MDAsIGV0Yy4pLCBvbmUgb2YgdGhlIHRocmVlIHByZWNvbmZpZ3VyZWRcbi8vIGh1ZXMgKGRlZmF1bHQsIGxpZ2h0ZXIsIGRhcmtlciksIG9yIGFueSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgcHJlZml4ZWQgd2l0aCBcIi1jb250cmFzdFwiLlxuLy9cbi8vIEBwYXJhbSAkY29sb3ItbWFwIFRoZSB0aGVtZSBwYWxldHRlIChvdXRwdXQgb2YgbWF0LXBhbGV0dGUpLlxuLy8gQHBhcmFtICRodWUgVGhlIGh1ZSBmcm9tIHRoZSBwYWxldHRlIHRvIHVzZS4gSWYgdGhpcyBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgaXQgd2lsbFxuLy8gICAgIGJlIHRyZWF0ZWQgYXMgb3BhY2l0eS5cbi8vIEBwYXJhbSAkb3BhY2l0eSBUaGUgYWxwaGEgY2hhbm5lbCB2YWx1ZSBmb3IgdGhlIGNvbG9yLlxuQGZ1bmN0aW9uIG1hdC1jb2xvcigkcGFsZXR0ZSwgJGh1ZTogZGVmYXVsdCwgJG9wYWNpdHk6IG51bGwpIHtcbiAgLy8gSWYgaHVlS2V5IGlzIGEgbnVtYmVyIGJldHdlZW4gemVybyBhbmQgb25lLCB0aGVuIGl0IGFjdHVhbGx5IGNvbnRhaW5zIGFuXG4gIC8vIG9wYWNpdHkgdmFsdWUsIHNvIHJlY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGRlZmF1bHQgaHVlIGFuZCB0aGF0IGdpdmVuIG9wYWNpdHkuXG4gIEBpZiB0eXBlLW9mKCRodWUpID09IG51bWJlciBhbmQgJGh1ZSA+PSAwIGFuZCAkaHVlIDw9IDEge1xuICAgIEByZXR1cm4gbWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LCAkaHVlKTtcbiAgfVxuXG4gICRjb2xvcjogbWFwLWdldCgkcGFsZXR0ZSwgJGh1ZSk7XG5cbiAgQGlmICh0eXBlLW9mKCRjb2xvcikgIT0gY29sb3IpIHtcbiAgICAvLyBJZiB0aGUgJGNvbG9yIHJlc29sdmVkIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSBhIGNvbG9yIChlLmcuIGEgQ1NTIHZhcmlhYmxlKSxcbiAgICAvLyB3ZSBjYW4ndCBhcHBseSB0aGUgb3BhY2l0eSBhbnl3YXkgc28gd2UgcmV0dXJuIHRoZSB2YWx1ZSBhcyBpcywgb3RoZXJ3aXNlIFNhc3MgY2FuXG4gICAgLy8gdGhyb3cgYW4gZXJyb3Igb3Igb3V0cHV0IHNvbWV0aGluZyBpbnZhbGlkLlxuICAgIEByZXR1cm4gJGNvbG9yO1xuICB9XG5cbiAgQHJldHVybiByZ2JhKCRjb2xvciwgaWYoJG9wYWNpdHkgPT0gbnVsbCwgb3BhY2l0eSgkY29sb3IpLCAkb3BhY2l0eSkpO1xufVxuXG5cbi8vIENyZWF0ZXMgYSBjb250YWluZXIgb2JqZWN0IGZvciBhIGxpZ2h0IHRoZW1lIHRvIGJlIGdpdmVuIHRvIGluZGl2aWR1YWwgY29tcG9uZW50IHRoZW1lIG1peGlucy5cbkBmdW5jdGlvbiBtYXQtbGlnaHQtdGhlbWUoJHByaW1hcnksICRhY2NlbnQsICR3YXJuOiBtYXQtcGFsZXR0ZSgkbWF0LXJlZCkpIHtcbiAgQHJldHVybiAoXG4gICAgcHJpbWFyeTogJHByaW1hcnksXG4gICAgYWNjZW50OiAkYWNjZW50LFxuICAgIHdhcm46ICR3YXJuLFxuICAgIGlzLWRhcms6IGZhbHNlLFxuICAgIGZvcmVncm91bmQ6ICRtYXQtbGlnaHQtdGhlbWUtZm9yZWdyb3VuZCxcbiAgICBiYWNrZ3JvdW5kOiAkbWF0LWxpZ2h0LXRoZW1lLWJhY2tncm91bmQsXG4gICk7XG59XG5cblxuLy8gQ3JlYXRlcyBhIGNvbnRhaW5lciBvYmplY3QgZm9yIGEgZGFyayB0aGVtZSB0byBiZSBnaXZlbiB0byBpbmRpdmlkdWFsIGNvbXBvbmVudCB0aGVtZSBtaXhpbnMuXG5AZnVuY3Rpb24gbWF0LWRhcmstdGhlbWUoJHByaW1hcnksICRhY2NlbnQsICR3YXJuOiBtYXQtcGFsZXR0ZSgkbWF0LXJlZCkpIHtcbiAgQHJldHVybiAoXG4gICAgcHJpbWFyeTogJHByaW1hcnksXG4gICAgYWNjZW50OiAkYWNjZW50LFxuICAgIHdhcm46ICR3YXJuLFxuICAgIGlzLWRhcms6IHRydWUsXG4gICAgZm9yZWdyb3VuZDogJG1hdC1kYXJrLXRoZW1lLWZvcmVncm91bmQsXG4gICAgYmFja2dyb3VuZDogJG1hdC1kYXJrLXRoZW1lLWJhY2tncm91bmQsXG4gICk7XG59XG5cblxuXG4kbWF0LXJpcHBsZS1jb2xvci1vcGFjaXR5OiAwLjE7XG5cbkBtaXhpbiBtYXQtcmlwcGxlKCkge1xuXG4gIC8vIFRoZSBob3N0IGVsZW1lbnQgb2YgYW4gbWF0LXJpcHBsZSBkaXJlY3RpdmUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgcG9zaXRpb24gb2YgXCJhYnNvbHV0ZVwiIG9yXG4gIC8vIFwicmVsYXRpdmVcIiBzbyB0aGF0IHRoZSByaXBwbGVzIGluc2lkZSBhcmUgY29ycmVjdGx5IHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGUgY29udGFpbmVyLlxuICAubWF0LXJpcHBsZSB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAgIC8vIEJ5IGRlZmF1bHQsIGV2ZXJ5IHJpcHBsZSBjb250YWluZXIgc2hvdWxkIGhhdmUgcG9zaXRpb246IHJlbGF0aXZlIGluIGZhdm9yIG9mIGNyZWF0aW5nIGFuXG4gICAgLy8gZWFzeSBBUEkgZm9yIGRldmVsb3BlcnMgdXNpbmcgdGhlIE1hdFJpcHBsZSBkaXJlY3RpdmUuXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5cbiAgLm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWQge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG5cbiAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgIHRyYW5zaXRpb246IG9wYWNpdHksIHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcblxuICAgIC8vIEluIGhpZ2ggY29udHJhc3QgbW9kZSB0aGUgcmlwcGxlIGlzIG9wYXF1ZSwgY2F1c2luZyBpdCB0byBvYnN0cnVjdCB0aGUgY29udGVudC5cbiAgICBAaW5jbHVkZSBjZGstaGlnaC1jb250cmFzdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBUaGVtZSBmb3IgdGhlIHJpcHBsZSBlbGVtZW50cy4qL1xuQG1peGluIG1hdC1yaXBwbGUtdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXBfZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRmb3JlZ3JvdW5kLWJhc2U6IG1hcF9nZXQoJGZvcmVncm91bmQsIGJhc2UpO1xuXG4gIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIC8vIElmIHRoZSByaXBwbGUgY29sb3IgaXMgcmVzb2x2ZXMgdG8gYSBjb2xvciAqdHlwZSosIHdlIGNhbiB1c2UgaXQgZGlyZWN0bHksIG90aGVyd2lzZVxuICAgIC8vIChlLmcuIGl0IHJlc29sdmVzIHRvIGEgQ1NTIHZhcmlhYmxlKSB3ZSBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIGNvbG9yIGFuZCBzZXR0aW5nIGFuIG9wYWNpdHkuXG4gICAgQGlmICh0eXBlLW9mKCRmb3JlZ3JvdW5kLWJhc2UpID09IGNvbG9yKSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRmb3JlZ3JvdW5kLWJhc2UsICRtYXQtcmlwcGxlLWNvbG9yLW9wYWNpdHkpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZm9yZWdyb3VuZC1iYXNlO1xuICAgICAgb3BhY2l0eTogJG1hdC1yaXBwbGUtY29sb3Itb3BhY2l0eTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFV0aWxpdHkgZm9yIGZldGNoaW5nIGEgbmVzdGVkIHZhbHVlIGZyb20gYSB0eXBvZ3JhcGh5IGNvbmZpZy5cbkBmdW5jdGlvbiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgJG5hbWUpIHtcbiAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbmZpZywgJGxldmVsKSwgJG5hbWUpO1xufVxuXG4vLyBHZXRzIHRoZSBmb250IHNpemUgZm9yIGEgbGV2ZWwgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb25maWcuXG5AZnVuY3Rpb24gbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCAkbGV2ZWwpIHtcbiAgQHJldHVybiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgZm9udC1zaXplKTtcbn1cblxuLy8gR2V0cyB0aGUgbGluZSBoZWlnaHQgZm9yIGEgbGV2ZWwgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb25maWcuXG5AZnVuY3Rpb24gbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsICRsZXZlbCkge1xuICBAcmV0dXJuIF9tYXQtZ2V0LXR5cGUtdmFsdWUoJGNvbmZpZywgJGxldmVsLCBsaW5lLWhlaWdodCk7XG59XG5cbi8vIEdldHMgdGhlIGZvbnQgd2VpZ2h0IGZvciBhIGxldmVsIGluc2lkZSBhIHR5cG9ncmFwaHkgY29uZmlnLlxuQGZ1bmN0aW9uIG1hdC1mb250LXdlaWdodCgkY29uZmlnLCAkbGV2ZWwpIHtcbiAgQHJldHVybiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgZm9udC13ZWlnaHQpO1xufVxuXG4vLyBHZXRzIHRoZSBsZXR0ZXIgc3BhY2luZyBmb3IgYSBsZXZlbCBpbnNpZGUgYSB0eXBvZ3JhcGh5IGNvbmZpZy5cbkBmdW5jdGlvbiBtYXQtbGV0dGVyLXNwYWNpbmcoJGNvbmZpZywgJGxldmVsKSB7XG4gIEByZXR1cm4gX21hdC1nZXQtdHlwZS12YWx1ZSgkY29uZmlnLCAkbGV2ZWwsIGxldHRlci1zcGFjaW5nKTtcbn1cblxuLy8gR2V0cyB0aGUgZm9udC1mYW1pbHkgZnJvbSBhIHR5cG9ncmFwaHkgY29uZmlnIGFuZCByZW1vdmVzIHRoZSBxdW90ZXMgYXJvdW5kIGl0LlxuQGZ1bmN0aW9uIG1hdC1mb250LWZhbWlseSgkY29uZmlnLCAkbGV2ZWw6IG51bGwpIHtcbiAgJGZvbnQtZmFtaWx5OiBtYXAtZ2V0KCRjb25maWcsIGZvbnQtZmFtaWx5KTtcblxuICBAaWYgJGxldmVsICE9IG51bGwge1xuICAgICRmb250LWZhbWlseTogX21hdC1nZXQtdHlwZS12YWx1ZSgkY29uZmlnLCAkbGV2ZWwsIGZvbnQtZmFtaWx5KTtcbiAgfVxuXG4gIC8vIEd1YXJkIGFnYWluc3QgdW5xdW90aW5nIG5vbi1zdHJpbmcgdmFsdWVzLCBiZWNhdXNlIGl0J3MgZGVwcmVjYXRlZC5cbiAgQHJldHVybiBpZih0eXBlLW9mKCRmb250LWZhbWlseSkgPT0gc3RyaW5nLCB1bnF1b3RlKCRmb250LWZhbWlseSksICRmb250LWZhbWlseSk7XG59XG5cbi8vIE91dHB1dHMgdGhlIHNob3J0aGFuZCBgZm9udGAgQ1NTIHByb3BlcnR5LCBiYXNlZCBvbiBhIHNldCBvZiB0eXBvZ3JhcGh5IHZhbHVlcy4gRmFsbHMgYmFjayB0b1xuLy8gdGhlIGluZGl2aWR1YWwgcHJvcGVydGllcyBpZiBhIHZhbHVlIHRoYXQgaXNuJ3QgYWxsb3dlZCBpbiB0aGUgc2hvcnRoYW5kIGlzIHBhc3NlZCBpbi5cbkBtaXhpbiBtYXQtdHlwb2dyYXBoeS1mb250LXNob3J0aGFuZCgkZm9udC1zaXplLCAkZm9udC13ZWlnaHQsICRsaW5lLWhlaWdodCwgJGZvbnQtZmFtaWx5KSB7XG4gIC8vIElmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSBzZXQgdG8gYGluaGVyaXRgLCB3ZSBjYW4ndCB1c2UgdGhlIHNob3J0aGFuZFxuICAvLyBzbyB3ZSBmYWxsIGJhY2sgdG8gcGFzc2luZyBpbiB0aGUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzLlxuICBAaWYgKCRmb250LXNpemUgPT0gaW5oZXJpdCBvclxuICAgICAgICRmb250LXdlaWdodCA9PSBpbmhlcml0IG9yXG4gICAgICAgJGxpbmUtaGVpZ2h0ID09IGluaGVyaXQgb3JcbiAgICAgICAkZm9udC1mYW1pbHkgPT0gaW5oZXJpdCBvclxuICAgICAgICRmb250LXNpemUgPT0gbnVsbCBvclxuICAgICAgICRmb250LXdlaWdodCA9PSBudWxsIG9yXG4gICAgICAgJGxpbmUtaGVpZ2h0ID09IG51bGwgb3JcbiAgICAgICAkZm9udC1mYW1pbHkgPT0gbnVsbCkge1xuXG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICAgIGZvbnQtd2VpZ2h0OiAkZm9udC13ZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5O1xuICB9XG4gIEBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBzaG9ydGhhbmQgYGZvbnRgLCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGFtb3VudCBvZiBieXRlcy4gTm90ZVxuICAgIC8vIHRoYXQgd2UgbmVlZCB0byB1c2UgaW50ZXJwb2xhdGlvbiBmb3IgYGZvbnQtc2l6ZS9saW5lLWhlaWdodGAgaW4gb3JkZXIgdG8gcHJldmVudFxuICAgIC8vIFNhc3MgZnJvbSBkaXZpZGluZyB0aGUgdHdvIHZhbHVlcy5cbiAgICBmb250OiAkZm9udC13ZWlnaHQgI3skZm9udC1zaXplfS8jeyRsaW5lLWhlaWdodH0gJGZvbnQtZmFtaWx5O1xuICB9XG59XG5cbi8vIENvbnZlcnRzIGEgdHlwb2dyYXBoeSBsZXZlbCBpbnRvIENTUyBzdHlsZXMuXG5AbWl4aW4gbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsICRsZXZlbCkge1xuICAkZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsICRsZXZlbCk7XG4gICRmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsICRsZXZlbCk7XG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsICRsZXZlbCk7XG4gICRmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsICRsZXZlbCk7XG5cbiAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktZm9udC1zaG9ydGhhbmQoJGZvbnQtc2l6ZSwgJGZvbnQtd2VpZ2h0LCAkbGluZS1oZWlnaHQsICRmb250LWZhbWlseSk7XG4gIGxldHRlci1zcGFjaW5nOiBtYXQtbGV0dGVyLXNwYWNpbmcoJGNvbmZpZywgJGxldmVsKTtcbn1cblxuXG5AbWl4aW4gbWF0LW9wdGlvbi10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1vcHRpb24ge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLFxuICAgICY6Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICB9XG5cbiAgICAvLyBJbiBtdWx0aXBsZSBtb2RlIHRoZXJlIGlzIGEgY2hlY2tib3ggdG8gc2hvdyB0aGF0IHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgJi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIpO1xuICAgIH1cblxuICAgICYubWF0LWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICAgIH1cblxuICAgICYubWF0LW9wdGlvbi1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gIH1cblxuICAubWF0LWFjY2VudCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgfVxuXG4gIC5tYXQtd2FybiAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1vcHRpb24tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtb3B0aW9uIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LW9wdGdyb3VwLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtb3B0Z3JvdXAtbGFiZWwge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LW9wdGdyb3VwLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LW9wdGdyb3VwLWxhYmVsIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgYm9keS0yKTtcbiAgfVxufVxuXG5cblxuQG1peGluIG1hdC1wc2V1ZG8tY2hlY2tib3gtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC8vIE5PVEUodHJhdmlza2F1Zm1hbik6IFdoaWxlIHRoZSBzcGVjIGNhbGxzIGZvciB0cmFuc2x1Y2VudCBibGFja3Mvd2hpdGVzIGZvciBkaXNhYmxlZCBjb2xvcnMsXG4gIC8vIHRoaXMgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggZWxlbWVudHMgbGF5ZXJlZCBvbiB0b3Agb2Ygb25lIGFub3RoZXIuIFRvIGdldCBhcm91bmQgdGhpcyB3ZVxuICAvLyBibGVuZCB0aGUgY29sb3JzIHRvZ2V0aGVyIGJhc2VkIG9uIHRoZSBiYXNlIGNvbG9yIGFuZCB0aGUgdGhlbWUgYmFja2dyb3VuZC5cbiAgJHdoaXRlLTMwcGN0LW9wYWNpdHktb24tZGFyazogIzY4Njg2ODtcbiAgJGJsYWNrLTI2cGN0LW9wYWNpdHktb24tbGlnaHQ6ICNiMGIwYjA7XG4gICRkaXNhYmxlZC1jb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsICR3aGl0ZS0zMHBjdC1vcGFjaXR5LW9uLWRhcmssICRibGFjay0yNnBjdC1vcGFjaXR5LW9uLWxpZ2h0KTtcbiAgJGNvbG9yZWQtYm94LXNlbGVjdG9yOiAnLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSc7XG5cbiAgLm1hdC1wc2V1ZG8tY2hlY2tib3gge1xuICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpLCBzZWNvbmRhcnktdGV4dCk7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKTtcbiAgICB9XG4gIH1cblxuICAubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gICAgY29sb3I6ICRkaXNhYmxlZC1jb2xvcjtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gdGhlIGFjY2VudCBjb2xvci4gTm90ZSB0aGF0IHRoZSBwc2V1ZG8gY2hlY2tib3hlcyBhcmUgbWVhbnQgdG8gaW5oZXJpdCB0aGVcbiAgLy8gdGhlbWUgZnJvbSB0aGVpciBwYXJlbnQsIHJhdGhlciB0aGFuIGltcGxlbWVudGluZyB0aGVpciBvd24gdGhlbWluZywgd2hpY2ggaXMgd2h5IHdlXG4gIC8vIGRvbid0IGF0dGFjaCB0byB0aGUgYG1hdC0qYCBjbGFzc2VzLlxuICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLFxuICAubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIGFjY2VudCkpO1xuICB9XG5cbiAgLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsXG4gIC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHByaW1hcnkpKTtcbiAgfVxuXG4gIC5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKG1hcC1nZXQoJHRoZW1lLCB3YXJuKSk7XG4gIH1cblxuICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICAmLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQge1xuICAgICAgYmFja2dyb3VuZDogJGRpc2FibGVkLWNvbG9yO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gUmVwcmVzZW50cyBhIHR5cG9ncmFwaHkgbGV2ZWwgZnJvbSB0aGUgTWF0ZXJpYWwgZGVzaWduIHNwZWMuXG5AZnVuY3Rpb24gbWF0LXR5cG9ncmFwaHktbGV2ZWwoXG4gICRmb250LXNpemUsXG4gICRsaW5lLWhlaWdodDogJGZvbnQtc2l6ZSxcbiAgJGZvbnQtd2VpZ2h0OiA0MDAsXG4gICRmb250LWZhbWlseTogbnVsbCxcbiAgJGxldHRlci1zcGFjaW5nOiBudWxsKSB7XG5cbiAgQHJldHVybiAoXG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLFxuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQsXG4gICAgZm9udC13ZWlnaHQ6ICRmb250LXdlaWdodCxcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LFxuICAgIGxldHRlci1zcGFjaW5nOiAkbGV0dGVyLXNwYWNpbmdcbiAgKTtcbn1cblxuLy8gUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgdHlwb2dyYXBoeSBsZXZlbHMuXG4vLyBEZWZhdWx0cyBjb21lIGZyb20gaHR0cHM6Ly9tYXRlcmlhbC5pby9ndWlkZWxpbmVzL3N0eWxlL3R5cG9ncmFwaHkuaHRtbFxuQGZ1bmN0aW9uIG1hdC10eXBvZ3JhcGh5LWNvbmZpZyhcbiAgJGZvbnQtZmFtaWx5OiAgICdSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZicsXG4gICRkaXNwbGF5LTQ6ICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxMTJweCwgMTEycHgsIDMwMCksXG4gICRkaXNwbGF5LTM6ICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCg1NnB4LCA1NnB4LCA0MDApLFxuICAkZGlzcGxheS0yOiAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoNDVweCwgNDhweCwgNDAwKSxcbiAgJGRpc3BsYXktMTogICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKDM0cHgsIDQwcHgsIDQwMCksXG4gICRoZWFkbGluZTogICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgyNHB4LCAzMnB4LCA0MDApLFxuICAkdGl0bGU6ICAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMjBweCwgMzJweCwgNTAwKSxcbiAgJHN1YmhlYWRpbmctMjogIG1hdC10eXBvZ3JhcGh5LWxldmVsKDE2cHgsIDI4cHgsIDQwMCksXG4gICRzdWJoZWFkaW5nLTE6ICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxNXB4LCAyNHB4LCA0MDApLFxuICAkYm9keS0yOiAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMTRweCwgMjRweCwgNTAwKSxcbiAgJGJvZHktMTogICAgICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKDE0cHgsIDIwcHgsIDQwMCksXG4gICRjYXB0aW9uOiAgICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxMnB4LCAyMHB4LCA0MDApLFxuICAkYnV0dG9uOiAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMTRweCwgMTRweCwgNTAwKSxcbiAgLy8gTGluZS1oZWlnaHQgbXVzdCBiZSB1bml0LWxlc3MgZnJhY3Rpb24gb2YgdGhlIGZvbnQtc2l6ZS5cbiAgJGlucHV0OiAgICAgICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKGluaGVyaXQsIDEuMTI1LCA0MDApXG4pIHtcblxuICAvLyBEZWNsYXJlIGFuIGluaXRpYWwgbWFwIHdpdGggYWxsIG9mIHRoZSBsZXZlbHMuXG4gICRjb25maWc6IChcbiAgICBkaXNwbGF5LTQ6ICAgICAgJGRpc3BsYXktNCxcbiAgICBkaXNwbGF5LTM6ICAgICAgJGRpc3BsYXktMyxcbiAgICBkaXNwbGF5LTI6ICAgICAgJGRpc3BsYXktMixcbiAgICBkaXNwbGF5LTE6ICAgICAgJGRpc3BsYXktMSxcbiAgICBoZWFkbGluZTogICAgICAgJGhlYWRsaW5lLFxuICAgIHRpdGxlOiAgICAgICAgICAkdGl0bGUsXG4gICAgc3ViaGVhZGluZy0yOiAgICRzdWJoZWFkaW5nLTIsXG4gICAgc3ViaGVhZGluZy0xOiAgICRzdWJoZWFkaW5nLTEsXG4gICAgYm9keS0yOiAgICAgICAgICRib2R5LTIsXG4gICAgYm9keS0xOiAgICAgICAgICRib2R5LTEsXG4gICAgY2FwdGlvbjogICAgICAgICRjYXB0aW9uLFxuICAgIGJ1dHRvbjogICAgICAgICAkYnV0dG9uLFxuICAgIGlucHV0OiAgICAgICAgICAkaW5wdXQsXG4gICk7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsZXZlbHMgYW5kIHNldCB0aGUgYGZvbnQtZmFtaWx5YCBvZiB0aGUgb25lcyB0aGF0IGRvbid0IGhhdmUgb25lIHRvIHRoZSBiYXNlLlxuICAvLyBOb3RlIHRoYXQgU2FzcyBjYW4ndCBtb2RpZnkgbWFwcyBpbiBwbGFjZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG1lcmdlIGFuZCByZS1hc3NpZ24uXG4gIEBlYWNoICRrZXksICRsZXZlbCBpbiAkY29uZmlnIHtcbiAgICBAaWYgbWFwLWdldCgkbGV2ZWwsIGZvbnQtZmFtaWx5KSA9PSBudWxsIHtcbiAgICAgICRuZXctbGV2ZWw6IG1hcC1tZXJnZSgkbGV2ZWwsIChmb250LWZhbWlseTogJGZvbnQtZmFtaWx5KSk7XG4gICAgICAkY29uZmlnOiBtYXAtbWVyZ2UoJGNvbmZpZywgKCRrZXk6ICRuZXctbGV2ZWwpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGJhc2UgZm9udCBmYW1pbHkgdG8gdGhlIGNvbmZpZy5cbiAgQHJldHVybiBtYXAtbWVyZ2UoJGNvbmZpZywgKGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHkpKTtcbn1cblxuLy8gQWRkcyB0aGUgYmFzZSB0eXBvZ3JhcGh5IHN0eWxlcywgYmFzZWQgb24gYSBjb25maWcuXG5AbWl4aW4gbWF0LWJhc2UtdHlwb2dyYXBoeSgkY29uZmlnLCAkc2VsZWN0b3I6ICcubWF0LXR5cG9ncmFwaHknKSB7XG4gIC5tYXQtaDEsIC5tYXQtaGVhZGxpbmUsICN7JHNlbGVjdG9yfSBoMSB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGhlYWRsaW5lKTtcbiAgICBtYXJnaW46IDAgMCAxNnB4O1xuICB9XG5cbiAgLm1hdC1oMiwgLm1hdC10aXRsZSwgI3skc2VsZWN0b3J9IGgyIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgdGl0bGUpO1xuICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gIH1cblxuICAubWF0LWgzLCAubWF0LXN1YmhlYWRpbmctMiwgI3skc2VsZWN0b3J9IGgzIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICBtYXJnaW46IDAgMCAxNnB4O1xuICB9XG5cbiAgLm1hdC1oNCwgLm1hdC1zdWJoZWFkaW5nLTEsICN7JHNlbGVjdG9yfSBoNCB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgfVxuXG4gIC8vIE5vdGU6IHRoZSBzcGVjIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gaDUgYW5kIGg2LCBidXQgd2UgYWRkIHRoZXNlIGZvclxuICAvLyBjb25zaXN0ZW5jeS4gVGhlIGZvbnQgc2l6ZXMgY29tZSBmcm9tIHRoZSBDaHJvbWUgdXNlciBhZ2VudCBzdHlsZXMgd2hpY2ggaGF2ZSBoNSBhdCAwLjgzZW1cbiAgLy8gYW5kIGg2IGF0IDAuNjdlbS5cbiAgLm1hdC1oNSwgI3skc2VsZWN0b3J9IGg1IHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1mb250LXNob3J0aGFuZChcbiAgICAgIG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKSAqIDAuODMsXG4gICAgICBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0xKSxcbiAgICAgIG1hdC1saW5lLWhlaWdodCgkY29uZmlnLCBib2R5LTEpLFxuICAgICAgbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIGJvZHktMSlcbiAgICApO1xuXG4gICAgbWFyZ2luOiAwIDAgMTJweDtcbiAgfVxuXG4gIC5tYXQtaDYsICN7JHNlbGVjdG9yfSBoNiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktZm9udC1zaG9ydGhhbmQoXG4gICAgICBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSkgKiAwLjY3LFxuICAgICAgbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSksXG4gICAgICBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgYm9keS0xKSxcbiAgICAgIG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBib2R5LTEpXG4gICAgKTtcblxuICAgIG1hcmdpbjogMCAwIDEycHg7XG4gIH1cblxuICAubWF0LWJvZHktc3Ryb25nLCAubWF0LWJvZHktMiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGJvZHktMik7XG4gIH1cblxuICAubWF0LWJvZHksIC5tYXQtYm9keS0xLCAjeyRzZWxlY3Rvcn0ge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBib2R5LTEpO1xuXG4gICAgcCB7XG4gICAgICBtYXJnaW46IDAgMCAxMnB4O1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc21hbGwsIC5tYXQtY2FwdGlvbiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGNhcHRpb24pO1xuICB9XG5cbiAgLy8gTm90ZTogVGhlIHNwZWMgZG9lc24ndCBtZW50aW9uIGxldHRlciBzcGFjaW5nLiBUaGUgdmFsdWUgY29tZXMgZnJvbVxuICAvLyBleWViYWxsaW5nIGl0IHVudGlsIGl0IGxvb2tlZCBleGFjdGx5IGxpa2UgdGhlIHNwZWMgZXhhbXBsZXMuXG4gIC5tYXQtZGlzcGxheS00LCAjeyRzZWxlY3Rvcn0gLm1hdC1kaXNwbGF5LTQge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBkaXNwbGF5LTQpO1xuICAgIG1hcmdpbjogMCAwIDU2cHg7XG4gICAgbGV0dGVyLXNwYWNpbmc6IC0wLjA1ZW07XG4gIH1cblxuICAubWF0LWRpc3BsYXktMywgI3skc2VsZWN0b3J9IC5tYXQtZGlzcGxheS0zIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgZGlzcGxheS0zKTtcbiAgICBtYXJnaW46IDAgMCA2NHB4O1xuICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtO1xuICB9XG5cbiAgLm1hdC1kaXNwbGF5LTIsICN7JHNlbGVjdG9yfSAubWF0LWRpc3BsYXktMiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGRpc3BsYXktMik7XG4gICAgbWFyZ2luOiAwIDAgNjRweDtcbiAgICBsZXR0ZXItc3BhY2luZzogLTAuMDA1ZW07XG4gIH1cblxuICAubWF0LWRpc3BsYXktMSwgI3skc2VsZWN0b3J9IC5tYXQtZGlzcGxheS0xIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgZGlzcGxheS0xKTtcbiAgICBtYXJnaW46IDAgMCA2NHB4O1xuICB9XG59XG5cblxuXG5cbkBtaXhpbiBtYXQtYXV0b2NvbXBsZXRlLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLW92ZXJyaWRhYmxlLWVsZXZhdGlvbig0LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG5cbiAgICAvLyBTZWxlY3RlZCBvcHRpb25zIGluIGF1dG9jb21wbGV0ZXMgc2hvdWxkIG5vdCBiZSBncmF5LCBidXQgd2VcbiAgICAvLyBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGJhY2tncm91bmQgZm9yIHNlbGVjdGVkIG9wdGlvbnMgaWZcbiAgICAvLyB0aGV5IGFyZSAqbm90KiBpbiBob3ZlciBvciBmb2N1cyBzdGF0ZS4gVGhpcyBjaGFuZ2UgaGFzIHRvIGJlXG4gICAgLy8gbWFkZSBoZXJlIGJlY2F1c2UgYmFzZSBvcHRpb24gc3R5bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGVcbiAgICAvLyBhdXRvY29tcGxldGUgYW5kIHRoZSBzZWxlY3QuXG4gICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcikge1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcblxuICAgICAgJjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuQG1peGluIG1hdC1hdXRvY29tcGxldGUtdHlwb2dyYXBoeSgkY29uZmlnKSB7IH1cblxuLy8gVGhpcyBjb250YWlucyBhbGwgb2YgdGhlIHN0eWxlcyBmb3IgdGhlIGJhZGdlXG4vLyByYXRoZXIgdGhhbiBqdXN0IHRoZSBjb2xvci90aGVtZSBiZWNhdXNlIG9mXG4vLyBubyBzdHlsZSBzaGVldCBzdXBwb3J0IGZvciBkaXJlY3RpdmVzLlxuXG5cblxuXG5cbiRtYXQtYmFkZ2UtZm9udC1zaXplOiAxMnB4O1xuJG1hdC1iYWRnZS1mb250LXdlaWdodDogNjAwO1xuJG1hdC1iYWRnZS1kZWZhdWx0LXNpemU6IDIycHggIWRlZmF1bHQ7XG4kbWF0LWJhZGdlLXNtYWxsLXNpemU6ICRtYXQtYmFkZ2UtZGVmYXVsdC1zaXplIC0gNjtcbiRtYXQtYmFkZ2UtbGFyZ2Utc2l6ZTogJG1hdC1iYWRnZS1kZWZhdWx0LXNpemUgKyA2O1xuXG4vLyBNaXhpbiBmb3IgYnVpbGRpbmcgb2Zmc2V0IGdpdmVuIGRpZmZlcmVudCBzaXplc1xuQG1peGluIF9tYXQtYmFkZ2Utc2l6ZSgkc2l6ZSkge1xuICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgIHdpZHRoOiAkc2l6ZTtcbiAgICBoZWlnaHQ6ICRzaXplO1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZTtcbiAgfVxuXG4gICYubWF0LWJhZGdlLWFib3ZlIHtcbiAgICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgICAgdG9wOiAtJHNpemUgLyAyO1xuICAgIH1cbiAgfVxuXG4gICYubWF0LWJhZGdlLWJlbG93IHtcbiAgICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgICAgYm90dG9tOiAtJHNpemUgLyAyO1xuICAgIH1cbiAgfVxuXG4gICYubWF0LWJhZGdlLWJlZm9yZSB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGxlZnQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICBbZGlyPSdydGwnXSAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICBsZWZ0OiBhdXRvO1xuICAgICAgcmlnaHQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICAmLm1hdC1iYWRnZS1hZnRlciB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIHJpZ2h0OiAtJHNpemU7XG4gICAgfVxuICB9XG5cbiAgW2Rpcj0ncnRsJ10gJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICByaWdodDogYXV0bztcbiAgICAgIGxlZnQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICAmLm1hdC1iYWRnZS1vdmVybGFwIHtcbiAgICAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgbGVmdDogLSRzaXplIC8gMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBbZGlyPSdydGwnXSAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgbGVmdDogYXV0bztcbiAgICAgICAgcmlnaHQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgcmlnaHQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgW2Rpcj0ncnRsJ10gJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGxlZnQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtYmFkZ2UtdGhlbWUoJHRoZW1lKSB7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkcHJpbWFyeTogbWFwLWdldCgkdGhlbWUsIHByaW1hcnkpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSwgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwcmltYXJ5KTtcblxuICAgIEBpbmNsdWRlIGNkay1oaWdoLWNvbnRyYXN0IHtcbiAgICAgIG91dGxpbmU6IHNvbGlkIDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1iYWRnZS1hY2NlbnQge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQsIGRlZmF1bHQtY29udHJhc3QpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtYmFkZ2Utd2FybiB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJHdhcm4sIGRlZmF1bHQtY29udHJhc3QpO1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJhZGdlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAubWF0LWJhZGdlLWhpZGRlbiB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1iYWRnZS1kaXNhYmxlZCB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICRhcHAtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnYmFja2dyb3VuZCcpO1xuICAgICAgJGJhZGdlLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLWJ1dHRvbik7XG5cbiAgICAgIC8vIFRoZSBkaXNhYmxlZCBjb2xvciB1c3VhbGx5IGhhcyBzb21lIGtpbmQgb2Ygb3BhY2l0eSwgYnV0IGJlY2F1c2UgdGhlIGJhZGdlIGlzIG92ZXJsYXllZFxuICAgICAgLy8gb24gdG9wIG9mIHNvbWV0aGluZyBlbHNlLCBpdCB3b24ndCBsb29rIGdvb2QgaWYgaXQncyBvcGFxdWUuIElmIGl0IGlzIGEgY29sb3IgKnR5cGUqLFxuICAgICAgLy8gd2UgY29udmVydCBpdCBpbnRvIGEgc29saWQgY29sb3IgYnkgdGFraW5nIHRoZSBvcGFjaXR5IGZyb20gdGhlIHJnYmEgdmFsdWUgYW5kIHVzaW5nXG4gICAgICAvLyB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBiYWNrZ3JvdW5kIHRvIHB1dCBpbnRvIGZvcmVncm91bmQgd2hlblxuICAgICAgLy8gbWl4aW5nIHRoZSBjb2xvcnMgdG9nZXRoZXIuXG4gICAgICBAaWYgKHR5cGUtb2YoJGJhZGdlLWNvbG9yKSA9PSBjb2xvciBhbmQgdHlwZS1vZigkYXBwLWJhY2tncm91bmQpID09IGNvbG9yKSB7XG4gICAgICAgICRiYWRnZS1vcGFjaXR5OiBvcGFjaXR5KCRiYWRnZS1jb2xvcik7XG4gICAgICAgIGJhY2tncm91bmQ6IG1peCgkYXBwLWJhY2tncm91bmQsIHJnYmEoJGJhZGdlLWNvbG9yLCAxKSwgKDEgLSAkYmFkZ2Utb3BhY2l0eSkgKiAxMDAlKTtcbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGJhZGdlLWNvbG9yO1xuICAgICAgfVxuXG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgY2xhc3MgaXMgYWRkZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgYWRkZWRcbiAgLy8gc28gaXQgY2FuIGFuaW1hdGUgc2NhbGUgdG8gZGVmYXVsdFxuICAubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZSB7XG4gICAgLy8gU2NhbGUgdG8gYG5vbmVgIGluc3RlYWQgb2YgYDFgIHRvIGF2b2lkIGJsdXJyeSB0ZXh0IGluIHNvbWUgYnJvd3NlcnMuXG4gICAgdHJhbnNmb3JtOiBub25lO1xuICB9XG5cbiAgLm1hdC1iYWRnZS1zbWFsbCB7XG4gICAgQGluY2x1ZGUgX21hdC1iYWRnZS1zaXplKCRtYXQtYmFkZ2Utc21hbGwtc2l6ZSk7XG4gIH1cbiAgLm1hdC1iYWRnZS1tZWRpdW0ge1xuICAgIEBpbmNsdWRlIF9tYXQtYmFkZ2Utc2l6ZSgkbWF0LWJhZGdlLWRlZmF1bHQtc2l6ZSk7XG4gIH1cbiAgLm1hdC1iYWRnZS1sYXJnZSB7XG4gICAgQGluY2x1ZGUgX21hdC1iYWRnZS1zaXplKCRtYXQtYmFkZ2UtbGFyZ2Utc2l6ZSk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1iYWRnZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICBmb250LXdlaWdodDogJG1hdC1iYWRnZS1mb250LXdlaWdodDtcbiAgICBmb250LXNpemU6ICRtYXQtYmFkZ2UtZm9udC1zaXplO1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgZm9udC1zaXplOiAkbWF0LWJhZGdlLWZvbnQtc2l6ZSAvIDI7XG4gIH1cblxuICAubWF0LWJhZGdlLWxhcmdlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgZm9udC1zaXplOiAkbWF0LWJhZGdlLWZvbnQtc2l6ZSAqIDI7XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LWJvdHRvbS1zaGVldC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXIge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtZWxldmF0aW9uKDE2LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlhbG9nKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LWJvdHRvbS1zaGVldC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgYm9keS0xKTtcbiAgfVxufVxuXG5cblxuXG5cbiRfbWF0LWJ1dHRvbi1yaXBwbGUtb3BhY2l0eTogMC4xO1xuXG4vLyBBcHBsaWVzIGEgZm9jdXMgc3R5bGUgdG8gYW4gbWF0LWJ1dHRvbiBlbGVtZW50IGZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgcGFsZXR0ZXMuXG5AbWl4aW4gX21hdC1idXR0b24tZm9jdXMtb3ZlcmxheS1jb2xvcigkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgJi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnkpO1xuICB9XG5cbiAgJi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgfVxuXG4gICYubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgfVxuXG4gICZbZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbkBtaXhpbiBfbWF0LWJ1dHRvbi1yaXBwbGUtY29sb3IoJHRoZW1lLCAkaHVlLCAkb3BhY2l0eTogJF9tYXQtYnV0dG9uLXJpcHBsZS1vcGFjaXR5KSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gICYubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5LCAkaHVlLCAkb3BhY2l0eSk7XG4gIH1cblxuICAmLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQsICRodWUsICRvcGFjaXR5KTtcbiAgfVxuXG4gICYubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuLCAkaHVlLCAkb3BhY2l0eSk7XG4gIH1cbn1cblxuLy8gQXBwbGllcyBhIHByb3BlcnR5IHRvIGFuIG1hdC1idXR0b24gZWxlbWVudCBmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIHBhbGV0dGVzLlxuQG1peGluIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJHByb3BlcnR5LCAkaHVlKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICYubWF0LXByaW1hcnkge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRwcmltYXJ5LCAkaHVlKTtcbiAgfVxuICAmLm1hdC1hY2NlbnQge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRhY2NlbnQsICRodWUpO1xuICB9XG4gICYubWF0LXdhcm4ge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCR3YXJuLCAkaHVlKTtcbiAgfVxuXG4gICYubWF0LXByaW1hcnksICYubWF0LWFjY2VudCwgJi5tYXQtd2FybiwgJltkaXNhYmxlZF0ge1xuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgICRwYWxldHRlOiBpZigkcHJvcGVydHkgPT0gJ2NvbG9yJywgJGZvcmVncm91bmQsICRiYWNrZ3JvdW5kKTtcbiAgICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRwYWxldHRlLCBkaXNhYmxlZC1idXR0b24pO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LWJ1dHRvbi10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC1idXR0b24sIC5tYXQtaWNvbi1idXR0b24sIC5tYXQtc3Ryb2tlZC1idXR0b24ge1xuICAgIC8vIEJ1dHRvbnMgd2l0aG91dCBhIGJhY2tncm91bmQgY29sb3Igc2hvdWxkIGluaGVyaXQgdGhlIGZvbnQgY29sb3IuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvXG4gICAgLy8gZW5zdXJlIHRoYXQgdGhlIGJ1dHRvbiBpcyByZWFkYWJsZSBvbiBjdXN0b20gYmFja2dyb3VuZCBjb2xvcnMuIEl0J3Mgd3JvbmcgdG8gYWx3YXlzIGFzc3VtZVxuICAgIC8vIHRoYXQgdGhvc2UgYnV0dG9ucyBhcmUgYWx3YXlzIHBsYWNlZCBpbnNpZGUgb2YgY29udGFpbmVycyB3aXRoIHRoZSBkZWZhdWx0IGJhY2tncm91bmRcbiAgICAvLyBjb2xvciBvZiB0aGUgdGhlbWUgKGUuZy4gdGhlbWVkIHRvb2xiYXJzKS5cbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblxuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJ2NvbG9yJywgZGVmYXVsdCk7XG4gICAgQGluY2x1ZGUgX21hdC1idXR0b24tZm9jdXMtb3ZlcmxheS1jb2xvcigkdGhlbWUpO1xuXG4gICAgLy8gU2V0dXAgdGhlIHJpcHBsZSBjb2xvciB0byBiZSBiYXNlZCBvbiB0aGUgdGV4dCBjb2xvci4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHJpcHBsZXNcbiAgICAvLyBhcmUgbWF0Y2hpbmcgd2l0aCB0aGUgY3VycmVudCB0aGVtZSBwYWxldHRlIGFuZCBhcmUgaW4gY29udHJhc3QgdG8gdGhlIGJhY2tncm91bmQgY29sb3JcbiAgICAvLyAoZS5nIGluIHRoZW1lZCB0b29sYmFycykuXG4gICAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICBvcGFjaXR5OiAkX21hdC1idXR0b24tcmlwcGxlLW9wYWNpdHk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZDogbWFwX2dldCgkZm9yZWdyb3VuZCwgYmFzZSk7XG4gIH1cblxuICAvLyBOb3RlOiB0aGlzIG5lZWRzIGEgYml0IGV4dHJhIHNwZWNpZmljaXR5LCBiZWNhdXNlIHdlJ3JlIG5vdCBndWFyYW50ZWVkIHRoZSBpbmNsdXNpb25cbiAgLy8gb3JkZXIgb2YgdGhlIHRoZW1lIHN0eWxlcyBhbmQgdGhlIGJ1dHRvbiByZXNldCBtYXkgZW5kIHVwIHJlc2V0dGluZyB0aGlzIGFzIHdlbGwuXG4gIC5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG4gIH1cblxuICAubWF0LWZsYXQtYnV0dG9uLCAubWF0LXJhaXNlZC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgICAvLyBEZWZhdWx0IGZvbnQgYW5kIGJhY2tncm91bmQgY29sb3Igd2hlbiBub3QgdXNpbmcgYW55IGNvbG9yIHBhbGV0dGUuXG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCByYWlzZWQtYnV0dG9uKTtcblxuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJ2NvbG9yJywgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgQGluY2x1ZGUgX21hdC1idXR0b24tdGhlbWUtcHJvcGVydHkoJHRoZW1lLCAnYmFja2dyb3VuZC1jb2xvcicsIGRlZmF1bHQpO1xuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXJpcHBsZS1jb2xvcigkdGhlbWUsIGRlZmF1bHQtY29udHJhc3QpO1xuICB9XG5cbiAgLm1hdC1zdHJva2VkLWJ1dHRvbiwgLm1hdC1mbGF0LWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMCwgJHRoZW1lKTtcbiAgfVxuXG4gIC5tYXQtcmFpc2VkLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMiwgJHRoZW1lKTtcblxuICAgICY6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZSB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLW92ZXJyaWRhYmxlLWVsZXZhdGlvbig4LCAkdGhlbWUpO1xuICAgIH1cblxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDAsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1mYWIsIC5tYXQtbWluaS1mYWIge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDYsICR0aGVtZSk7XG5cbiAgICAmOm5vdChbZGlzYWJsZWRdKTphY3RpdmUge1xuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMTIsICR0aGVtZSk7XG4gICAgfVxuXG4gICAgJltkaXNhYmxlZF0ge1xuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMCwgJHRoZW1lKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1idXR0b24tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtYnV0dG9uLCAubWF0LXJhaXNlZC1idXR0b24sIC5tYXQtaWNvbi1idXR0b24sIC5tYXQtc3Ryb2tlZC1idXR0b24sXG4gIC5tYXQtZmxhdC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYnV0dG9uKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtYnV0dG9uLXRvZ2dsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGRpdmlkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMiwgJHRoZW1lKTtcbiAgfVxuXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuXG4gICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBmb2N1c2VkLWJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG5cbiAgICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGZvY3VzZWQtYnV0dG9uLCAxKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggJGRpdmlkZXItY29sb3I7XG4gIH1cblxuICBbZGlyPSdydGwnXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICRkaXZpZGVyLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwge1xuICAgIC5tYXQtYnV0dG9uLXRvZ2dsZSArIC5tYXQtYnV0dG9uLXRvZ2dsZSB7XG4gICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTtcbiAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAkZGl2aWRlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBzZWxlY3RlZC1idXR0b24pO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLWJ1dHRvbik7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaXNhYmxlZC1idXR0b24tdG9nZ2xlKTtcblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGNhcmQpO1xuICAgIH1cblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIHNlbGVjdGVkLWRpc2FibGVkLWJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxcbiAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQge1xuICAgIGJvcmRlcjogc29saWQgMXB4ICRkaXZpZGVyLWNvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtYnV0dG9uLXRvZ2dsZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtY2FyZC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWNhcmQge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDEsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAgIC8vIE5lZWRzIGV4dHJhIHNwZWNpZmljaXR5IHRvIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGVsZXZhdGlvbiBzZWxlY3RvcnMuXG4gICAgJi5tYXQtY2FyZC1mbGF0IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDAsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jYXJkLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1jYXJkLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWNhcmQge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LWNhcmQtdGl0bGUge1xuICAgIGZvbnQ6IHtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgaGVhZGxpbmUpO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgdGl0bGUpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2FyZC1oZWFkZXIgLm1hdC1jYXJkLXRpdGxlIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgdGl0bGUpO1xuICB9XG5cbiAgLm1hdC1jYXJkLXN1YnRpdGxlLFxuICAubWF0LWNhcmQtY29udGVudCB7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtY2hlY2tib3gtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG5cbiAgLy8gVGhlIGNvbG9yIG9mIHRoZSBjaGVja2JveCdzIGNoZWNrbWFyayAvIG1peGVkbWFyay5cbiAgJGNoZWNrYm94LW1hcmstY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgYmFja2dyb3VuZCk7XG5cbiAgLy8gTk9URSh0cmF2aXNrYXVmbWFuKTogV2hpbGUgdGhlIHNwZWMgY2FsbHMgZm9yIHRyYW5zbHVjZW50IGJsYWNrcy93aGl0ZXMgZm9yIGRpc2FibGVkIGNvbG9ycyxcbiAgLy8gdGhpcyBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBlbGVtZW50cyBsYXllcmVkIG9uIHRvcCBvZiBvbmUgYW5vdGhlci4gVG8gZ2V0IGFyb3VuZCB0aGlzIHdlXG4gIC8vIGJsZW5kIHRoZSBjb2xvcnMgdG9nZXRoZXIgYmFzZWQgb24gdGhlIGJhc2UgY29sb3IgYW5kIHRoZSB0aGVtZSBiYWNrZ3JvdW5kLlxuICAkd2hpdGUtMzBwY3Qtb3BhY2l0eS1vbi1kYXJrOiAjNjg2ODY4O1xuICAkYmxhY2stMjZwY3Qtb3BhY2l0eS1vbi1saWdodDogI2IwYjBiMDtcbiAgJGRpc2FibGVkLWNvbG9yOiBpZigkaXMtZGFyay10aGVtZSwgJHdoaXRlLTMwcGN0LW9wYWNpdHktb24tZGFyaywgJGJsYWNrLTI2cGN0LW9wYWNpdHktb24tbGlnaHQpO1xuXG4gIC5tYXQtY2hlY2tib3gtZnJhbWUge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWNoZWNrbWFyayB7XG4gICAgZmlsbDogJGNoZWNrYm94LW1hcmstY29sb3I7XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoIHtcbiAgICAvLyAhaW1wb3J0YW50IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2UgYSBzdHJva2UgbXVzdCBiZSBzZXQgYXMgYW5cbiAgICAvLyBhdHRyaWJ1dGUgb24gdGhlIFNWRyBpbiBvcmRlciBmb3IgbGluZSBhbmltYXRpb24gdG8gd29yayBwcm9wZXJseS5cbiAgICBzdHJva2U6ICRjaGVja2JveC1tYXJrLWNvbG9yICFpbXBvcnRhbnQ7XG5cbiAgICBAaW5jbHVkZSBjZGstaGlnaC1jb250cmFzdChibGFjay1vbi13aGl0ZSkge1xuICAgICAgLy8gSGF2aW5nIHRoZSBvbmUgYWJvdmUgYmUgIWltcG9ydGFudCBlbmRzIHVwIG92ZXJyaWRpbmcgdGhlIGJyb3dzZXIncyBhdXRvbWF0aWNcbiAgICAgIC8vIGNvbG9yIGludmVyc2lvbiBzbyB3ZSBuZWVkIHRvIHJlLWludmVydCBpdCBvdXJzZWx2ZXMgZm9yIGJsYWNrLW9uLXdoaXRlLlxuICAgICAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jaGVja2JveC1taXhlZG1hcmsge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjaGVja2JveC1tYXJrLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLCAubWF0LWNoZWNrYm94LWNoZWNrZWQge1xuICAgICYubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWRpc2FibGVkIHtcbiAgICAmLm1hdC1jaGVja2JveC1jaGVja2VkLFxuICAgICYubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICAgICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgICY6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkge1xuICAgICAgLm1hdC1jaGVja2JveC1mcmFtZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5tYXQtY2hlY2tib3gtbGFiZWwge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICAgIH1cblxuICAgIEBpbmNsdWRlIGNkay1oaWdoLWNvbnRyYXN0IHtcbiAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIG9uZSBpcyBtb3ZlZCBkb3duIGhlcmUgc28gaXQgY2FuIHRhcmdldCBib3RoXG4gIC8vIHRoZSB0aGVtZSBjb2xvcnMgYW5kIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgQGluY2x1ZGUgY2RrLWhpZ2gtY29udHJhc3Qge1xuICAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gICAgICAvLyBOZWVkcyB0byBiZSByZW1vdmVkIGJlY2F1c2UgaXQgaGlkZXMgdGhlIGNoZWNrYm94IG91dGxpbmUuXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2hlY2tib3g6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpIHtcbiAgICAmLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgICB9XG5cbiAgICAmLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtY2hlY2tib3gtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtY2hlY2tib3gge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAvLyBUT0RPKGthcmEpOiBSZW1vdmUgdGhpcyBzdHlsZSB3aGVuIGZpeGluZyB2ZXJ0aWNhbCBiYXNlbGluZVxuICAubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgICBsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGJvZHktMik7XG4gIH1cbn1cblxuXG5cblxuXG5cbiRtYXQtY2hpcC1yZW1vdmUtZm9udC1zaXplOiAxOHB4O1xuXG5AbWl4aW4gbWF0LWNoaXBzLWNvbG9yKCRmb3JlZ3JvdW5kLCAkYmFja2dyb3VuZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgY29sb3I6ICRmb3JlZ3JvdW5kO1xuXG4gIC5tYXQtY2hpcC1yZW1vdmUge1xuICAgIGNvbG9yOiAkZm9yZWdyb3VuZDtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gIH1cbn1cblxuQG1peGluIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkcGFsZXR0ZSkge1xuICBAaW5jbHVkZSBtYXQtY2hpcHMtY29sb3IobWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LWNvbnRyYXN0KSwgbWF0LWNvbG9yKCRwYWxldHRlKSk7XG5cbiAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LWNvbnRyYXN0LCAwLjEpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtY2hpcHMtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICR1bnNlbGVjdGVkLWJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgdW5zZWxlY3RlZC1jaGlwKTtcbiAgJHVuc2VsZWN0ZWQtZm9yZWdyb3VuZDogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAge1xuICAgIEBpbmNsdWRlIG1hdC1jaGlwcy1jb2xvcigkdW5zZWxlY3RlZC1mb3JlZ3JvdW5kLCAkdW5zZWxlY3RlZC1iYWNrZ3JvdW5kKTtcblxuICAgICY6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkge1xuICAgICAgJjphY3RpdmUge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbigzLCAkdGhlbWUpO1xuICAgICAgfVxuXG4gICAgICAubWF0LWNoaXAtcmVtb3ZlOmhvdmVyIHtcbiAgICAgICAgb3BhY2l0eTogMC41NDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLm1hdC1jaGlwLWRpc2FibGVkIHtcbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXBfZ2V0KCRmb3JlZ3JvdW5kLCBiYXNlKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgQGluY2x1ZGUgbWF0LWNoaXBzLXRoZW1lLWNvbG9yKCRwcmltYXJ5KTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkYWNjZW50KTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1jaGlwcy10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1jaGlwIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMik7XG5cbiAgICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbixcbiAgICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogJG1hdC1jaGlwLXJlbW92ZS1mb250LXNpemU7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC10YWJsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LXRhYmxlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdjYXJkJyk7XG4gIH1cblxuICAubWF0LXRhYmxlIHRoZWFkLCAubWF0LXRhYmxlIHRib2R5LCAubWF0LXRhYmxlIHRmb290LFxuICBtYXQtaGVhZGVyLXJvdywgbWF0LXJvdywgbWF0LWZvb3Rlci1yb3csXG4gIFttYXQtaGVhZGVyLXJvd10sIFttYXQtcm93XSwgW21hdC1mb290ZXItcm93XSxcbiAgLm1hdC10YWJsZS1zdGlja3kge1xuICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gIH1cblxuICBtYXQtcm93LCBtYXQtaGVhZGVyLXJvdywgbWF0LWZvb3Rlci1yb3csXG4gIHRoLm1hdC1oZWFkZXItY2VsbCwgdGQubWF0LWNlbGwsIHRkLm1hdC1mb290ZXItY2VsbCB7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtaGVhZGVyLWNlbGwge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtY2VsbCwgLm1hdC1mb290ZXItY2VsbCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC10YWJsZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10YWJsZSB7XG4gICAgZm9udC1mYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgfVxuXG4gIC5tYXQtaGVhZGVyLWNlbGwge1xuICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMik7XG4gIH1cblxuICAubWF0LWNlbGwsIC5tYXQtZm9vdGVyLWNlbGwge1xuICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpO1xuICB9XG59XG5cblxuXG5cblxuXG5cbiRtYXQtZGF0ZXBpY2tlci1zZWxlY3RlZC10b2RheS1ib3gtc2hhZG93LXdpZHRoOiAxcHg7XG4kbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtZmFkZS1hbW91bnQ6IDAuNjtcbiRtYXQtZGF0ZXBpY2tlci10b2RheS1mYWRlLWFtb3VudDogMC4yO1xuJG1hdC1jYWxlbmRhci1ib2R5LWZvbnQtc2l6ZTogMTNweCAhZGVmYXVsdDtcbiRtYXQtY2FsZW5kYXItd2Vla2RheS10YWJsZS1mb250LXNpemU6IDExcHggIWRlZmF1bHQ7XG5cbkBtaXhpbiBfbWF0LWRhdGVwaWNrZXItY29sb3IoJHBhbGV0dGUpIHtcbiAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsIGRlZmF1bHQtY29udHJhc3QpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICAkYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwYWxldHRlKTtcblxuICAgIEBpZiAodHlwZS1vZigkYmFja2dyb3VuZCkgPT0gY29sb3IpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGZhZGUtb3V0KCRiYWNrZ3JvdW5kLCAkbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtZmFkZS1hbW91bnQpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBjb3VsZG4ndCByZXNvbHZlIHRvIGJhY2tncm91bmQgdG8gYSBjb2xvciAoZS5nLiBpdCdzIGEgQ1NTIHZhcmlhYmxlKSxcbiAgICAgIC8vIGZhbGwgYmFjayB0byBmYWRpbmcgdGhlIGNvbnRlbnQgb3V0IHZpYSBgb3BhY2l0eWAuXG4gICAgICBvcGFjaXR5OiAkbWF0LWRhdGVwaWNrZXItdG9kYXktZmFkZS1hbW91bnQ7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAkbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtdG9kYXktYm94LXNoYWRvdy13aWR0aFxuICAgICAgICAgICAgICAgIG1hdC1jb2xvcigkcGFsZXR0ZSwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1kYXRlcGlja2VyLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC5tYXQtY2FsZW5kYXItYXJyb3cge1xuICAgIGJvcmRlci10b3AtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaWNvbik7XG4gIH1cblxuICAvLyBUaGUgcHJldi9uZXh0IGJ1dHRvbnMgbmVlZCBhIGJpdCBtb3JlIHNwZWNpZmljaXR5IHRvXG4gIC8vIGF2b2lkIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHRoZSAubWF0LWljb24tYnV0dG9uLlxuICAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLFxuICAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLFxuICAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaWNvbik7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50IHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlcixcbiAgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUsXG4gIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUge1xuICAgICYgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gICAgLy8gTm90ZTogdGhvdWdoIGl0J3Mgbm90IHRleHQsIHRoZSBib3JkZXIgaXMgYSBoaW50IGFib3V0IHRoZSBmYWN0IHRoYXQgdGhpcyBpcyB0b2RheSdzIGRhdGUsXG4gICAgLy8gc28gd2UgdXNlIHRoZSBoaW50IGNvbG9yLlxuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgICAkY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcblxuICAgIEBpZiAodHlwZS1vZigkY29sb3IpID09IGNvbG9yKSB7XG4gICAgICBib3JkZXItY29sb3I6IGZhZGUtb3V0KCRjb2xvciwgJG1hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50KTtcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGNvbG9yIGRpZG4ndCByZXNvbHZlIHRvIGEgY29sb3IgdmFsdWUsIGJ1dCBzb21ldGhpbmcgbGlrZSBhIENTUyB2YXJpYWJsZSwgd2UgY2FuJ3RcbiAgICAgIC8vIGZhZGUgaXQgb3V0IHNvIHdlIGZhbGwgYmFjayB0byByZWR1Y2luZyB0aGUgZWxlbWVudCBvcGFjaXR5LiBOb3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZVxuICAgICAgLy8gJG1hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50LCBiZWNhdXNlIGhpbnQgdGV4dCB1c3VhbGx5IGhhcyBzb21lIG9wYWNpdHkgYXBwbGllZFxuICAgICAgLy8gdG8gaXQgYWxyZWFkeSBhbmQgd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIHN0YWNrIG9uIHRvcCBvZiBlYWNoIG90aGVyLlxuICAgICAgb3BhY2l0eTogMC41O1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIF9tYXQtZGF0ZXBpY2tlci1jb2xvcihtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSkpO1xuXG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbig0LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG5cbiAgICAmLm1hdC1hY2NlbnQge1xuICAgICAgQGluY2x1ZGUgX21hdC1kYXRlcGlja2VyLWNvbG9yKG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpKTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZGF0ZXBpY2tlci1jb2xvcihtYXAtZ2V0KCR0aGVtZSwgd2FybikpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoIHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbigwLCAkdGhlbWUpO1xuICB9XG5cbiAgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUge1xuICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHByaW1hcnkpKTtcblxuICAgICYubWF0LWFjY2VudCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpKTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHdhcm4pKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1kYXRlcGlja2VyLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWNhbGVuZGFyIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5IHtcbiAgICBmb250LXNpemU6ICRtYXQtY2FsZW5kYXItYm9keS1mb250LXNpemU7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsXG4gIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYnV0dG9uKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aCB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogJG1hdC1jYWxlbmRhci13ZWVrZGF5LXRhYmxlLWZvbnQtc2l6ZTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtZGlhbG9nLXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZGlhbG9nLWNvbnRhaW5lciB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMjQsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaWFsb2cpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtZGlhbG9nLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWRpYWxvZy10aXRsZSB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHRpdGxlKTtcbiAgfVxufVxuXG5cblxuXG5cblxuQG1peGluIG1hdC1leHBhbnNpb24tcGFuZWwtdGhlbWUoJHRoZW1lKSB7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDIsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtYWN0aW9uLXJvdyB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIge1xuICAgICY6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pIHtcbiAgICAgICYuY2RrLWtleWJvYXJkLWZvY3VzZWQsXG4gICAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBob3Zlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzYWJsZSB0aGUgaG92ZXIgb24gdG91Y2ggZGV2aWNlcyBzaW5jZSBpdCBjYW4gYXBwZWFyIGxpa2UgaXQgaXMgc3R1Y2suIFdlIGNhbid0IHVzZVxuICAvLyBgQG1lZGlhIChob3ZlcilgIGFib3ZlLCBiZWNhdXNlIHRoZSBkZXNrdG9wIHN1cHBvcnQgYnJvd3NlciBzdXBwb3J0IGlzbid0IGdyZWF0LlxuICBAbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gICAgLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddKVxuICAgICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbixcbiAgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtYnV0dG9uKTtcblxuICAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSxcbiAgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24ge1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtZXhwYW5zaW9uLXBhbmVsLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIge1xuICAgIGZvbnQ6IHtcbiAgICAgIGZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgICB3ZWlnaHQ6IG1hdC1mb250LXdlaWdodCgkY29uZmlnLCBzdWJoZWFkaW5nLTEpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBib2R5LTEpO1xuICB9XG59XG5cblxuXG5cbi8vIFRoaXMgbWl4aW4gd2lsbCBlbnN1cmUgdGhhdCBsaW5lcyB0aGF0IG92ZXJmbG93IHRoZSBjb250YWluZXIgd2lsbCBoaWRlIHRoZSBvdmVyZmxvdyBhbmRcbi8vIHRydW5jYXRlIG5lYXRseSB3aXRoIGFuIGVsbGlwc2lzLlxuQG1peGluIG1hdC10cnVuY2F0ZS1saW5lKCkge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLy8gTWl4aW4gdG8gcHJvdmlkZSBhbGwgbWF0LWxpbmUgc3R5bGVzLCBjaGFuZ2luZyBzZWNvbmRhcnkgZm9udCBzaXplIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxpc3Rcbi8vIGlzIGluIGRlbnNlIG1vZGUuXG5AbWl4aW4gbWF0LWxpbmUtYmFzZSgkc2Vjb25kYXJ5LWZvbnQtc2l6ZSkge1xuICAubWF0LWxpbmUge1xuICAgIEBpbmNsdWRlIG1hdC10cnVuY2F0ZS1saW5lKCk7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAgIC8vIGFsbCBsaW5lcyBidXQgdGhlIHRvcCBsaW5lIHNob3VsZCBoYXZlIHNtYWxsZXIgdGV4dFxuICAgICY6bnRoLWNoaWxkKG4rMikge1xuICAgICAgZm9udC1zaXplOiAkc2Vjb25kYXJ5LWZvbnQtc2l6ZTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtaXhpbiBub3JtYWxpemVzIGRlZmF1bHQgZWxlbWVudCBzdHlsZXMsIGUuZy4gZm9udCB3ZWlnaHQgZm9yIGhlYWRpbmcgdGV4dC5cbkBtaXhpbiBtYXQtbm9ybWFsaXplLXRleHQoKSB7XG4gICYgPiAqIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBUaGlzIG1peGluIHByb3ZpZGVzIGJhc2Ugc3R5bGVzIGZvciB0aGUgd3JhcHBlciBhcm91bmQgbWF0LWxpbmUgZWxlbWVudHMgaW4gYSBsaXN0LlxuQG1peGluIG1hdC1saW5lLXdyYXBwZXItYmFzZSgpIHtcbiAgQGluY2x1ZGUgbWF0LW5vcm1hbGl6ZS10ZXh0KCk7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgLy8gTXVzdCByZW1vdmUgd3JhcHBlciB3aGVuIGxpbmVzIGFyZSBlbXB0eSBvciBpdCB0YWtlcyB1cCBob3Jpem9udGFsXG4gIC8vIHNwYWNlIGFuZCBwdXNoZXMgb3RoZXIgZWxlbWVudHMgdG8gdGhlIHJpZ2h0LlxuICAmOmVtcHR5IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuXG4vLyBJbmNsdWRlIHRoaXMgZW1wdHkgbWl4aW4gZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGNvbXBvbmVudHMuXG5AbWl4aW4gbWF0LWdyaWQtbGlzdC10aGVtZSgkdGhlbWUpIHsgfVxuXG5AbWl4aW4gbWF0LWdyaWQtbGlzdC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1ncmlkLXRpbGUtaGVhZGVyLFxuICAubWF0LWdyaWQtdGlsZS1mb290ZXIge1xuICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKSk7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cblxuLy8gSW5jbHVkZSB0aGlzIGVtcHR5IG1peGluIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLlxuQG1peGluIG1hdC1pY29uLXRoZW1lKCR0aGVtZSkge1xuICAkcHJpbWFyeTogbWFwLWdldCgkdGhlbWUsIHByaW1hcnkpO1xuICAkYWNjZW50OiBtYXAtZ2V0KCR0aGVtZSwgYWNjZW50KTtcbiAgJHdhcm46IG1hcC1nZXQoJHRoZW1lLCB3YXJuKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWljb24ge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1pY29uLXR5cG9ncmFwaHkoJGNvbmZpZykgeyB9XG5cblxuXG5cblxuLy8gUmVuZGVycyBhIGdyYWRpZW50IGZvciBzaG93aW5nIHRoZSBkYXNoZWQgbGluZSB3aGVuIHRoZSBpbnB1dCBpcyBkaXNhYmxlZC5cbi8vIFVubGlrZSB1c2luZyBhIGJvcmRlciwgYSBncmFkaWVudCBhbGxvd3MgdXMgdG8gYWRqdXN0IHRoZSBzcGFjaW5nIG9mIHRoZSBkb3R0ZWQgbGluZVxuLy8gdG8gbWF0Y2ggdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLlxuQG1peGluIG1hdC1jb250cm9sLWRpc2FibGVkLXVuZGVybGluZSgkY29sb3IpIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAkY29sb3IgMCUsICRjb2xvciAzMyUsIHRyYW5zcGFyZW50IDAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0cHggMTAwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xufVxuXG4vLyBGaWd1cmVzIG91dCB0aGUgY29sb3Igb2YgdGhlIHBsYWNlaG9sZGVyIGZvciBhIGZvcm0gY29udHJvbC5cbi8vIFVzZWQgcHJpbWFyaWx5IHRvIHByZXZlbnQgdGhlIHZhcmlvdXMgZm9ybSBjb250cm9scyBmcm9tXG4vLyBiZWNvbWluZyBvdXQgb2Ygc3luYyBzaW5jZSB0aGVzZSBjb2xvcnMgYXJlbid0IGluIGEgcGFsZXR0ZS5cbkBmdW5jdGlvbiBfbWF0LWNvbnRyb2wtcGxhY2Vob2xkZXItY29sb3IoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gIEByZXR1cm4gbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNSwgMC40MikpO1xufVxuXG5cbi8qIHN0eWxlbGludC1kaXNhYmxlIG1hdGVyaWFsL25vLXByZWZpeGVzICovXG5AbWl4aW4gdXNlci1zZWxlY3QoJHZhbHVlKSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbiAgLW1vei11c2VyLXNlbGVjdDogJHZhbHVlO1xuICAtbXMtdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbiAgdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbn1cblxuQG1peGluIGlucHV0LXBsYWNlaG9sZGVyIHtcbiAgJjo6cGxhY2Vob2xkZXIge1xuICAgIEBjb250ZW50O1xuICB9XG5cbiAgJjo6LW1vei1wbGFjZWhvbGRlciB7XG4gICAgQGNvbnRlbnQ7XG4gIH1cblxuICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICBAY29udGVudDtcbiAgfVxuXG4gICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG5AbWl4aW4gY3Vyc29yLWdyYWIge1xuICBjdXJzb3I6IC13ZWJraXQtZ3JhYjtcbiAgY3Vyc29yOiBncmFiO1xufVxuXG5AbWl4aW4gY3Vyc29yLWdyYWJiaW5nIHtcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nO1xuICBjdXJzb3I6IGdyYWJiaW5nO1xufVxuXG5AbWl4aW4gYmFja2ZhY2UtdmlzaWJpbGl0eSgkdmFsdWUpIHtcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiAkdmFsdWU7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6ICR2YWx1ZTtcbn1cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cblxuXG5cbkBtaXhpbiBtYXQtaW5wdXQtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxcbiAgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LWlucHV0LWVsZW1lbnQge1xuICAgIGNhcmV0LWNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnkpO1xuXG4gICAgQGluY2x1ZGUgaW5wdXQtcGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6IF9tYXQtY29udHJvbC1wbGFjZWhvbGRlci1jb2xvcigkdGhlbWUpO1xuICAgIH1cblxuICAgIC8vIE9uIGRhcmsgdGhlbWVzIHdlIHNldCB0aGUgbmF0aXZlIGBzZWxlY3RgIGNvbG9yIHRvIHNvbWUgc2hhZGUgb2Ygd2hpdGUsXG4gICAgLy8gaG93ZXZlciB0aGUgY29sb3IgcHJvcGFnYXRlcyB0byBhbGwgb2YgdGhlIGBvcHRpb25gIGVsZW1lbnRzLCB3aGljaCBhcmVcbiAgICAvLyBhbHdheXMgb24gYSB3aGl0ZSBiYWNrZ3JvdW5kIGluc2lkZSB0aGUgZHJvcGRvd24sIGNhdXNpbmcgdGhlbSB0byBibGVuZCBpbi5cbiAgICAvLyBTaW5jZSB3ZSBjYW4ndCBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZHJvcGRvd24sIHdlIG5lZWQgdG8gZXhwbGljaXRseVxuICAgIC8vIHJlc2V0IHRoZSBjb2xvciBvZiB0aGUgb3B0aW9ucyB0byBzb21ldGhpbmcgZGFyay5cbiAgICBAaWYgKG1hcC1nZXQoJHRoZW1lLCBpcy1kYXJrKSkge1xuICAgICAgb3B0aW9uIHtcbiAgICAgICAgY29sb3I6ICRkYXJrLXByaW1hcnktdGV4dDtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uOmRpc2FibGVkIHtcbiAgICAgICAgY29sb3I6ICRkYXJrLWRpc2FibGVkLXRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICB9XG5cbiAgLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxcbiAgLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1pbnB1dC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLy8gVGhlIHVuaXQtbGVzcyBsaW5lLWhlaWdodCBmcm9tIHRoZSBmb250IGNvbmZpZy5cbiAgJGxpbmUtaGVpZ2h0OiBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgaW5wdXQpO1xuXG4gIC8vIFRoZSBhbW91bnQgb2Ygc3BhY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBhY3R1YWwgdGV4dFxuICAvLyAoYXMgYSBmcmFjdGlvbiBvZiB0aGUgZm9udC1zaXplKS5cbiAgJGxpbmUtc3BhY2luZzogKCRsaW5lLWhlaWdodCAtIDEpIC8gMjtcblxuICAvLyA8aW5wdXQ+IGVsZW1lbnRzIHNlZW0gdG8gaGF2ZSB0aGVpciBoZWlnaHQgc2V0IHNsaWdodGx5IHRvbyBsYXJnZSBvbiBTYWZhcmkgY2F1c2luZyB0aGUgdGV4dCB0b1xuICAvLyBiZSBtaXNhbGlnbmVkIHcuci50LiB0aGUgcGxhY2Vob2xkZXIuIEFkZGluZyB0aGlzIG1hcmdpbiBjb3JyZWN0cyBpdC5cbiAgaW5wdXQubWF0LWlucHV0LWVsZW1lbnQge1xuICAgIG1hcmdpbi10b3A6IC0kbGluZS1zcGFjaW5nICogMWVtO1xuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtbGlzdC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWxpc3QtYmFzZSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgfVxuXG4gICAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG5cbiAgICAubWF0LXN1YmhlYWRlciB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1saXN0LWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlzYWJsZWQtbGlzdC1vcHRpb24pO1xuICB9XG5cbiAgLm1hdC1saXN0LW9wdGlvbixcbiAgLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSxcbiAgLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSB7XG4gICAgJjpob3ZlciwgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdob3ZlcicpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LWxpc3QtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gICRmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuXG4gIC5tYXQtbGlzdC1pdGVtIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5O1xuICB9XG5cbiAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlzdFxuICAubWF0LWxpc3QtYmFzZSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIHN1YmhlYWRpbmctMik7XG4gICAgICBAaW5jbHVkZSBtYXQtbGluZS1iYXNlKG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKSk7XG4gICAgfVxuXG4gICAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpKTtcbiAgICB9XG5cbiAgICAubWF0LXN1YmhlYWRlciB7XG4gICAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIGJvZHktMik7XG4gICAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cblxuICAvLyBEZW5zZSBsaXN0XG4gIC5tYXQtbGlzdC1iYXNlW2RlbnNlXSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pO1xuICAgICAgQGluY2x1ZGUgbWF0LWxpbmUtYmFzZShtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pKTtcbiAgICB9XG5cbiAgICAubWF0LWxpc3Qtb3B0aW9uIHtcbiAgICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKSk7XG4gICAgfVxuXG4gICAgLm1hdC1zdWJoZWFkZXIge1xuICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseTtcbiAgICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1tZW51LXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtbWVudS1wYW5lbCB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oNCwgJHRoZW1lKTtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdjYXJkJyk7XG4gIH1cblxuICAubWF0LW1lbnUtaXRlbSB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ3RleHQnKTtcblxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgICYsICY6OmFmdGVyIHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLFxuICAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVyIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCAnaWNvbicpO1xuICB9XG5cbiAgLm1hdC1tZW51LWl0ZW06aG92ZXIsXG4gIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkLFxuICAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCB7XG4gICAgJjpub3QoW2Rpc2FibGVkXSkge1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnaG92ZXInKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1tZW51LXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LW1lbnUtaXRlbSB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZywgYm9keS0xKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gbWF0LXBhZ2luYXRvci10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcblxuICAubWF0LXBhZ2luYXRvciB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICB9XG5cbiAgLm1hdC1wYWdpbmF0b3IsXG4gIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsXG4gIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2ljb24nKTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBtYXQtY29sb3IoJGZvcmVncm91bmQsICdpY29uJyk7XG4gIH1cblxuICAubWF0LXBhZ2luYXRvci1maXJzdCxcbiAgLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2ljb24nKTtcbiAgfVxuXG4gIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIHtcbiAgICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsXG4gICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50LFxuICAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuICAgIC5tYXQtcGFnaW5hdG9yLWxhc3Qge1xuICAgICAgYm9yZGVyLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsICdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LXBhZ2luYXRvci10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1wYWdpbmF0b3IsXG4gIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgY2FwdGlvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC1wcm9ncmVzcy1iYXItdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICAgIGZpbGw6IG1hdC1jb2xvcigkcHJpbWFyeSwgbGlnaHRlcik7XG4gIH1cblxuICAubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSwgbGlnaHRlcik7XG4gIH1cblxuICAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgfVxuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQge1xuICAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICAgICAgZmlsbDogbWF0LWNvbG9yKCRhY2NlbnQsIGxpZ2h0ZXIpO1xuICAgIH1cblxuICAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIHtcbiAgICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgICAgIGZpbGw6IG1hdC1jb2xvcigkd2FybiwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkd2FybiwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1wcm9ncmVzcy1iYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7IH1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1wcm9ncmVzcy1zcGlubmVyLCAubWF0LXNwaW5uZXIge1xuICAgIGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cbkBtaXhpbiBfbWF0LXJhZGlvLWNvbG9yKCRwYWxldHRlKSB7XG4gICYubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlKTtcbiAgfVxuXG4gIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuICAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbiAgJi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLFxuICAmOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtcmFkaW8tdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1yYWRpby1idXR0b24ge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgQGluY2x1ZGUgX21hdC1yYWRpby1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtcmFkaW8tY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXJhZGlvLWNvbG9yKCR3YXJuKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG5lZWRzIGV4dHJhIHNwZWNpZmljaXR5LCBiZWNhdXNlIHRoZSBjbGFzc2VzIGFib3ZlIGFyZSBjb21iaW5lZFxuICAgIC8vIChlLmcuIGAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50YCkgd2hpY2ggaW5jcmVhc2VzIHRoZWlyIHNwZWNpZmljaXR5IGEgbG90LlxuICAgIC8vIFRPRE86IGNvbnNpZGVyIG1ha2luZyB0aGUgc2VsZWN0b3JzIGludG8gZGVzY2VuZGFudHMgKGAubWF0LXByaW1hcnkgLm1hdC1yYWRpby1idXR0b25gKS5cbiAgICAmLm1hdC1yYWRpby1kaXNhYmxlZCB7XG4gICAgICAmLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLFxuICAgICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICAgICAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQpO1xuICAgICAgfVxuXG4gICAgICAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50LFxuICAgICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkKTtcbiAgICAgIH1cblxuICAgICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50IHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN3aXRjaCB0aGlzIHRvIGEgc29saWQgY29sb3Igc2luY2Ugd2UncmUgdXNpbmcgYG9wYWNpdHlgXG4gICAgLy8gdG8gY29udHJvbCBob3cgb3BhcXVlIHRoZSByaXBwbGUgc2hvdWxkIGJlLlxuICAgIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWFwX2dldCgkZm9yZWdyb3VuZCwgYmFzZSk7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtcmFkaW8tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtcmFkaW8tYnV0dG9uIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1zZWxlY3QtdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gIC5tYXQtc2VsZWN0LXZhbHVlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogX21hdC1jb250cm9sLXBsYWNlaG9sZGVyLWNvbG9yKCR0aGVtZSk7XG4gIH1cblxuICAubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC12YWx1ZSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1zZWxlY3QtcGFuZWwge1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oNCwgJHRoZW1lKTtcblxuICAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIsIDAuMTIpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZCB7XG4gICAgJi5tYXQtZm9jdXNlZCB7XG4gICAgICAmLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93IHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgICB9XG5cbiAgICAgICYubWF0LWFjY2VudCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgICB9XG5cbiAgICAgICYubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgICAgICBjb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1zZWxlY3QtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcblxuICAubWF0LXNlbGVjdCB7XG4gICAgZm9udC1mYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgfVxuXG4gIC5tYXQtc2VsZWN0LXRyaWdnZXIge1xuICAgIGhlaWdodDogJGxpbmUtaGVpZ2h0ICogMWVtO1xuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gbWF0LXNpZGVuYXYtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICRkcmF3ZXItYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaWFsb2cpO1xuICAkZHJhd2VyLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yOiAgbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKTtcbiAgJGRyYXdlci1wdXNoLWJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlhbG9nKTtcbiAgJGRyYXdlci1zaWRlLWJvcmRlcjogc29saWQgMXB4IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG5cbiAgLm1hdC1kcmF3ZXItY29udGFpbmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZHJhd2VyLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICB9XG5cbiAgLm1hdC1kcmF3ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRkcmF3ZXItYmFja2dyb3VuZC1jb2xvcjtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAgICYubWF0LWRyYXdlci1wdXNoIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRkcmF3ZXItcHVzaC1iYWNrZ3JvdW5kLWNvbG9yO1xuICAgIH1cblxuICAgICY6bm90KC5tYXQtZHJhd2VyLXNpZGUpIHtcbiAgICAgIC8vIFRoZSBlbGV2YXRpb24gb2Ygei0xNiBpcyBub3RlZCBpbiB0aGUgZGVzaWduIHNwZWNpZmljYXRpb25zLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1kcmF3ZXIuaHRtbFxuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMTYsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1kcmF3ZXItc2lkZSB7XG4gICAgYm9yZGVyLXJpZ2h0OiAkZHJhd2VyLXNpZGUtYm9yZGVyO1xuXG4gICAgJi5tYXQtZHJhd2VyLWVuZCB7XG4gICAgICBib3JkZXItbGVmdDogJGRyYXdlci1zaWRlLWJvcmRlcjtcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTtcbiAgICB9XG4gIH1cblxuICBbZGlyPSdydGwnXSAubWF0LWRyYXdlci1zaWRlIHtcbiAgICBib3JkZXItbGVmdDogJGRyYXdlci1zaWRlLWJvcmRlcjtcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG5cbiAgICAmLm1hdC1kcmF3ZXItZW5kIHtcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgICAgYm9yZGVyLXJpZ2h0OiAkZHJhd2VyLXNpZGUtYm9yZGVyO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd24ge1xuICAgICRvcGFjaXR5OiAwLjY7XG4gICAgJGJhY2tkcm9wLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGNhcmQsICRvcGFjaXR5KTtcblxuICAgIEBpZiAodHlwZS1vZigkYmFja2Ryb3AtY29sb3IpID09IGNvbG9yKSB7XG4gICAgICAvLyBXZSB1c2UgaW52ZXJ0KCkgaGVyZSB0byBoYXZlIHRoZSBkYXJrZW4gdGhlIGJhY2tncm91bmQgY29sb3IgZXhwZWN0ZWQgdG8gYmUgdXNlZC4gSWYgdGhlXG4gICAgICAvLyBiYWNrZ3JvdW5kIGlzIGxpZ2h0LCB3ZSB1c2UgYSBkYXJrIGJhY2tkcm9wLiBJZiB0aGUgYmFja2dyb3VuZCBpcyBkYXJrLFxuICAgICAgLy8gd2UgdXNlIGEgbGlnaHQgYmFja2Ryb3AuXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbnZlcnQoJGJhY2tkcm9wLWNvbG9yKTtcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgLy8gSWYgd2UgY291bGRuJ3QgcmVzb2x2ZSB0aGUgYmFja2Ryb3AgY29sb3IgdG8gYSBjb2xvciB2YWx1ZSwgZmFsbCBiYWNrIHRvIHVzaW5nXG4gICAgICAvLyBgb3BhY2l0eWAgdG8gbWFrZSBpdCBvcGFxdWUgc2luY2UgaXRzIGVuZCB2YWx1ZSBjb3VsZCBiZSBhIHNvbGlkIGNvbG9yLlxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tkcm9wLWNvbG9yO1xuICAgICAgb3BhY2l0eTogJG9wYWNpdHk7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtc2lkZW5hdi10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cblxuQG1peGluIF9tYXQtc2xpZGUtdG9nZ2xlLWNoZWNrZWQoJHBhbGV0dGUsICR0aHVtYi1jaGVja2VkLWh1ZSkge1xuICAmLm1hdC1jaGVja2VkIHtcbiAgICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsICR0aHVtYi1jaGVja2VkLWh1ZSk7XG4gICAgfVxuXG4gICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgICAgIC8vIE9wYWNpdHkgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzcGVjcyBmb3IgdGhlIHNlbGVjdGlvbiBjb250cm9scy5cbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vY29tcG9uZW50cy9zZWxlY3Rpb24tY29udHJvbHMuaHRtbCNzcGVjc1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlLCAkdGh1bWItY2hlY2tlZC1odWUsIDAuNTQpO1xuICAgIH1cblxuICAgIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgLy8gU2V0IG5vIG9wYWNpdHkgZm9yIHRoZSByaXBwbGVzIGJlY2F1c2UgdGhlIHJpcHBsZSBvcGFjaXR5IHdpbGwgYmUgYWRqdXN0ZWQgZHluYW1pY2FsbHlcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGludGVyYWN0aW9uIHdpdGggdGhlIHNsaWRlLXRvZ2dsZSAoZS5nLiBmb3IgaG92ZXIsIGZvY3VzKVxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlLCAkdGh1bWItY2hlY2tlZC1odWUpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LXNsaWRlLXRvZ2dsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGlzLWRhcms6IG1hcF9nZXQoJHRoZW1lLCBpcy1kYXJrKTtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLy8gQ29sb3IgaHVlcyBhcmUgYmFzZWQgb24gdGhlIHNwZWNzIHdoaWNoIGJyaWVmbHkgc2hvdyB0aGUgaHVlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIGEgc3dpdGNoLlxuICAvLyBUaGUgMjAxOCBzcGVjcyBubyBsb25nZXIgZGVzY3JpYmUgaG93IGRhcmsgc3dpdGNoZXMgc2hvdWxkIGxvb2sgbGlrZS4gRHVlIHRvIHRoZSBsYWNrIG9mXG4gIC8vIGluZm9ybWF0aW9uIGZvciBkYXJrIHRoZW1lZCBzd2l0Y2hlcywgd2UgcGFydGlhbGx5IGtlZXAgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGlzIGJhc2VkIG9uXG4gIC8vIHRoZSBwcmV2aW91cyBzcGVjaWZpY2F0aW9ucy4gRm9yIHRoZSBjaGVja2VkIGNvbG9yIHdlIGFsd2F5cyB1c2UgdGhlIGBkZWZhdWx0YCBodWUgYmVjYXVzZVxuICAvLyB0aGF0IGZvbGxvd3MgTURDIGFuZCBhbHNvIG1ha2VzIGl0IGVhc2llciBmb3IgcGVvcGxlIHRvIGNyZWF0ZSBhIGN1c3RvbSB0aGVtZSB3aXRob3V0IG5lZWRpbmdcbiAgLy8gdG8gc3BlY2lmeSBlYWNoIGh1ZSBpbmRpdmlkdWFsbHkuXG4gICR0aHVtYi11bmNoZWNrZWQtaHVlOiBpZigkaXMtZGFyaywgNDAwLCA1MCk7XG4gICR0aHVtYi1jaGVja2VkLWh1ZTogZGVmYXVsdDtcblxuICAkYmFyLXVuY2hlY2tlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZCk7XG4gICRyaXBwbGUtdW5jaGVja2VkLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGJhc2UpO1xuXG4gIC5tYXQtc2xpZGUtdG9nZ2xlIHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlLXRvZ2dsZS1jaGVja2VkKCRhY2NlbnQsICR0aHVtYi1jaGVja2VkLWh1ZSk7XG5cbiAgICAmLm1hdC1wcmltYXJ5IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtc2xpZGUtdG9nZ2xlLWNoZWNrZWQoJHByaW1hcnksICR0aHVtYi1jaGVja2VkLWh1ZSk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXNsaWRlLXRvZ2dsZS1jaGVja2VkKCR3YXJuLCAkdGh1bWItY2hlY2tlZC1odWUpO1xuICAgIH1cblxuICAgICY6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICAvLyBTZXQgbm8gb3BhY2l0eSBmb3IgdGhlIHJpcHBsZXMgYmVjYXVzZSB0aGUgcmlwcGxlIG9wYWNpdHkgd2lsbCBiZSBhZGp1c3RlZCBkeW5hbWljYWxseVxuICAgICAgLy8gYmFzZWQgb24gdGhlIHR5cGUgb2YgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc2xpZGUtdG9nZ2xlIChlLmcuIGZvciBob3ZlciwgZm9jdXMpXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcmlwcGxlLXVuY2hlY2tlZC1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMSwgJHRoZW1lKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJG1hdC1ncmV5LCAkdGh1bWItdW5jaGVja2VkLWh1ZSk7XG4gIH1cblxuICAubWF0LXNsaWRlLXRvZ2dsZS1iYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRiYXItdW5jaGVja2VkLWNvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtc2xpZGUtdG9nZ2xlLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuQG1peGluIF9tYXQtc2xpZGVyLWlubmVyLWNvbnRlbnQtdGhlbWUoJHBhbGV0dGUpIHtcbiAgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbiAgLm1hdC1zbGlkZXItdGh1bWIsXG4gIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICB9XG5cbiAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcGFsZXR0ZSwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zbGlkZXItdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICRtYXQtc2xpZGVyLW9mZi1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzbGlkZXItb2ZmKTtcbiAgJG1hdC1zbGlkZXItb2ZmLWZvY3VzZWQtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2xpZGVyLW9mZi1hY3RpdmUpO1xuICAkbWF0LXNsaWRlci1kaXNhYmxlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzbGlkZXItb2ZmKTtcbiAgJG1hdC1zbGlkZXItbGFiZWxlZC1taW4tdmFsdWUtdGh1bWItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2xpZGVyLW1pbik7XG4gICRtYXQtc2xpZGVyLWxhYmVsZWQtbWluLXZhbHVlLXRodW1iLWxhYmVsLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNsaWRlci1vZmYpO1xuICAkbWF0LXNsaWRlci1mb2N1cy1yaW5nLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCwgZGVmYXVsdCwgMC4yKTtcbiAgJG1hdC1zbGlkZXItZm9jdXMtcmluZy1taW4tdmFsdWUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgYmFzZSwgMC4xMik7XG4gICRtYXQtc2xpZGVyLXRpY2stY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgYmFzZSwgMC43KTtcbiAgJG1hdC1zbGlkZXItdGljay1zaXplOiAycHg7XG5cbiAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItb2ZmLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1wcmltYXJ5IHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCRwcmltYXJ5KTtcbiAgfVxuXG4gIC5tYXQtYWNjZW50IHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCRhY2NlbnQpO1xuICB9XG5cbiAgLm1hdC13YXJuIHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCR3YXJuKTtcbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLWZvY3VzLXJpbmctY29sb3I7XG4gIH1cblxuICAubWF0LXNsaWRlcjpob3ZlcixcbiAgLmNkay1mb2N1c2VkIHtcbiAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLW9mZi1mb2N1c2VkLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWRpc2FibGVkIHtcbiAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLFxuICAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4gICAgLm1hdC1zbGlkZXItdGh1bWIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItZGlzYWJsZWQtY29sb3I7XG4gICAgfVxuXG4gICAgJjpob3ZlciB7XG4gICAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItZGlzYWJsZWQtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1zbGlkZXItbWluLXZhbHVlIHtcbiAgICAubWF0LXNsaWRlci1mb2N1cy1yaW5nIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLWZvY3VzLXJpbmctbWluLXZhbHVlLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIHtcbiAgICAgIC5tYXQtc2xpZGVyLXRodW1iLFxuICAgICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWF0LXNsaWRlci1sYWJlbGVkLW1pbi12YWx1ZS10aHVtYi1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgJi5jZGstZm9jdXNlZCB7XG4gICAgICAgIC5tYXQtc2xpZGVyLXRodW1iLFxuICAgICAgICAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItbGFiZWxlZC1taW4tdmFsdWUtdGh1bWItbGFiZWwtY29sb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSB7XG4gICAgICAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJG1hdC1zbGlkZXItb2ZmLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlcixcbiAgICAgICYuY2RrLWZvY3VzZWQge1xuICAgICAgICAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci1vZmYtZm9jdXNlZC1jb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgICYubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci10aWNrLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrcyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgICAvLyBGaXJlZm94IGRvZXNuJ3QgZHJhdyB0aGUgZ3JhZGllbnQgY29ycmVjdGx5IHdpdGggJ3RvIHJpZ2h0J1xuICAgIC8vIChzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNDMxOSkuXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgfVxuXG4gIC5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LXNsaWRlci10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LXN0ZXBwZXItdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1zdGVwLWhlYWRlciB7XG4gICAgJi5jZGsta2V5Ym9hcmQtZm9jdXNlZCxcbiAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICB9XG5cbiAgICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSA6aG92ZXIgc3RhdGUgd2lsbCBsaW5nZXIgb24gdGhlIGVsZW1lbnQgYWZ0ZXIgYSB0YXAuXG4gICAgLy8gUmVzZXQgaXQgdmlhIGBAbWVkaWFgIGFmdGVyIHRoZSBkZWNsYXJhdGlvbiwgYmVjYXVzZSB0aGUgbWVkaWEgcXVlcnkgaXNuJ3RcbiAgICAvLyBzdXBwb3J0ZWQgYnkgYWxsIGJyb3dzZXJzIHlldC5cbiAgICBAbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtbGFiZWwsXG4gICAgLm1hdC1zdGVwLW9wdGlvbmFsIHtcbiAgICAgIC8vIFRPRE8oam9zZXBocGVycm90dCk6IFVwZGF0ZSB0byB1c2luZyBhIGNvcnJlY3RlZCBkaXNhYmxlZC10ZXh0IGNvbnRyYXN0XG4gICAgICAvLyBpbnN0ZWFkIG9mIHNlY29uZGFyeS10ZXh0LlxuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICAgIH1cblxuICAgIC5tYXQtc3RlcC1pY29uIHtcbiAgICAgIC8vIFRPRE8oam9zZXBocGVycm90dCk6IFVwZGF0ZSB0byB1c2luZyBhIGNvcnJlY3RlZCBkaXNhYmxlZC10ZXh0IGNvbnRyYXN0XG4gICAgICAvLyBpbnN0ZWFkIG9mIHNlY29uZGFyeS10ZXh0LlxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5LCBkZWZhdWx0LWNvbnRyYXN0KTtcbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCxcbiAgICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLFxuICAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnksIGRlZmF1bHQtY29udHJhc3QpO1xuICAgIH1cblxuICAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZSB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3Ige1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1zdGVwcGVyLWhvcml6b250YWwsIC5tYXQtc3RlcHBlci12ZXJ0aWNhbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgfVxuXG4gIC5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lOjpiZWZvcmUge1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG5cbiAgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsXG4gIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YWZ0ZXIsXG4gIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmUge1xuICAgIGJvcmRlci10b3AtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zdGVwcGVyLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXN0ZXBwZXItdmVydGljYWwsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG5cbiAgLm1hdC1zdGVwLWxhYmVsIHtcbiAgICBmb250OiB7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gICAgICB3ZWlnaHQ6IG1hdC1mb250LXdlaWdodCgkY29uZmlnLCBib2R5LTEpO1xuICAgIH07XG4gIH1cblxuICAubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICB9XG5cbiAgLm1hdC1zdGVwLWxhYmVsLWVycm9yIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgfVxuXG4gIC5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZCB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTIpO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9O1xuICB9XG59XG5cbkBtaXhpbiBtYXQtc29ydC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LXNvcnQtaGVhZGVyLWFycm93IHtcbiAgICAkdGFibGUtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICAgICR0ZXh0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcblxuICAgIC8vIEJlY2F1c2UgdGhlIGFycm93IGlzIG1hZGUgdXAgb2YgbXVsdGlwbGUgZWxlbWVudHMgdGhhdCBhcmUgc3RhY2tlZCBvbiB0b3Agb2YgZWFjaCBvdGhlcixcbiAgICAvLyB3ZSBjYW4ndCB1c2UgdGhlIHNlbWktdHJhc3BhcmVudCBjb2xvciBmcm9tIHRoZSB0aGVtZSBkaXJlY3RseS4gSWYgdGhlIHZhbHVlIGlzIGEgY29sb3JcbiAgICAvLyAqdHlwZSosIHdlIGNvbnZlcnQgaXQgaW50byBhIHNvbGlkIGNvbG9yIGJ5IHRha2luZyB0aGUgb3BhY2l0eSBmcm9tIHRoZSByZ2JhIHZhbHVlIGFuZFxuICAgIC8vIHVzaW5nIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGJhY2tncm91bmQgdG8gcHV0IGludG8gZm9yZWdyb3VuZFxuICAgIC8vIHdoZW4gbWl4aW5nIHRoZSBjb2xvcnMgdG9nZXRoZXIuIE90aGVyd2lzZSwgaWYgaXQgcmVzb2x2ZXMgdG8gc29tZXRoaW5nIGRpZmZlcmVudFxuICAgIC8vIChlLmcuIGl0IHJlc29sdmVzIHRvIGEgQ1NTIHZhcmlhYmxlKSwgd2UgdXNlIHRoZSBjb2xvciBkaXJlY3RseS5cbiAgICBAaWYgKHR5cGUtb2YoJHRhYmxlLWJhY2tncm91bmQpID09IGNvbG9yIGFuZCB0eXBlLW9mKCR0ZXh0LWNvbG9yKSA9PSBjb2xvcikge1xuICAgICAgJHRleHQtb3BhY2l0eTogb3BhY2l0eSgkdGV4dC1jb2xvcik7XG4gICAgICBjb2xvcjogbWl4KCR0YWJsZS1iYWNrZ3JvdW5kLCByZ2JhKCR0ZXh0LWNvbG9yLCAxKSwgKDEgLSAkdGV4dC1vcGFjaXR5KSAqIDEwMCUpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICBjb2xvcjogJHRleHQtY29sb3I7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtc29ydC10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cbkBtaXhpbiBtYXQtdGFicy10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRoZWFkZXItYm9yZGVyOiAxcHggc29saWQgbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcblxuICAubWF0LXRhYi1uYXYtYmFyLFxuICAubWF0LXRhYi1oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206ICRoZWFkZXItYm9yZGVyO1xuICB9XG5cbiAgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIHtcbiAgICAubWF0LXRhYi1uYXYtYmFyLFxuICAgIC5tYXQtdGFiLWhlYWRlciB7XG4gICAgICBib3JkZXItdG9wOiAkaGVhZGVyLWJvcmRlcjtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWxpbmsge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJi5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLXRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBoZWFkZXIgYm9yZGVyIHdoZW4gdGhlcmUgaXMgYSBiYWNrZ3JvdW5kIGNvbG9yXG4gIC5tYXQtdGFiLWdyb3VwW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10gLm1hdC10YWItaGVhZGVyLFxuICAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10ge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgfVxuXG4gIC5tYXQtdGFiLWdyb3VwLCAubWF0LXRhYi1uYXYtYmFyIHtcbiAgICAkdGhlbWUtY29sb3JzOiAoXG4gICAgICBwcmltYXJ5OiAkcHJpbWFyeSxcbiAgICAgIGFjY2VudDogJGFjY2VudCxcbiAgICAgIHdhcm46ICR3YXJuXG4gICAgKTtcblxuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJHRoZW1lLWNvbG9ycyB7XG4gICAgICAvLyBTZXQgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHRhYnNcbiAgICAgICYubWF0LSN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWItbGFiZWwtZm9jdXMoJGNvbG9yKTtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1pbmstYmFyKCRjb2xvcik7XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgaW5rIGJhciB3aGVuIGJhY2tncm91bmQgY29sb3IgaXMgdGhlIHNhbWVcbiAgICAgICAgJi5tYXQtYmFja2dyb3VuZC0jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgX21hdC1pbmstYmFyKCRjb2xvciwgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZWFjaCAkbmFtZSwgJGNvbG9yIGluICR0aGVtZS1jb2xvcnMge1xuICAgICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRhYnMgYW5kIG92ZXJyaWRlIGZvY3VzIGNvbG9yXG4gICAgICAmLm1hdC1iYWNrZ3JvdW5kLSN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWItbGFiZWwtZm9jdXMoJGNvbG9yKTtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWJzLWJhY2tncm91bmQoJGNvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuQG1peGluIF9tYXQtaW5rLWJhcigkY29sb3IsICRodWU6IGRlZmF1bHQpIHtcbiAgLm1hdC1pbmstYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGNvbG9yLCAkaHVlKTtcbiAgfVxufVxuXG5AbWl4aW4gX21hdC10YWItbGFiZWwtZm9jdXMoJHRhYi1mb2N1cy1jb2xvcikge1xuICAubWF0LXRhYi1sYWJlbCxcbiAgLm1hdC10YWItbGluayB7XG4gICAgJi5jZGsta2V5Ym9hcmQtZm9jdXNlZCxcbiAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQge1xuICAgICAgJjpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR0YWItZm9jdXMtY29sb3IsIGxpZ2h0ZXIsIDAuMyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBfbWF0LXRhYnMtYmFja2dyb3VuZCgkYmFja2dyb3VuZC1jb2xvcikge1xuICAvLyBTZXQgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIHRhYiBncm91cFxuICAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWxpbmtzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IpO1xuICB9XG5cbiAgLy8gU2V0IGxhYmVscyB0byBjb250cmFzdCBhZ2FpbnN0IGJhY2tncm91bmRcbiAgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWxpbmsge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QpO1xuXG4gICAgJi5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QsIDAuNCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHBhZ2luYXRpb24gY2hldnJvbnMgdG8gY29udHJhc3QgYmFja2dyb3VuZFxuICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZC1jb2xvciwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cblxuICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZC1jb2xvciwgZGVmYXVsdC1jb250cmFzdCwgMC40KTtcbiAgfVxuXG4gIC8vIFNldCByaXBwbGVzIGNvbG9yIHRvIGJlIHRoZSBjb250cmFzdCBjb2xvciBvZiB0aGUgbmV3IGJhY2tncm91bmQuIE90aGVyd2lzZSB0aGUgcmlwcGxlXG4gIC8vIGNvbG9yIHdpbGwgYmUgYmFzZWQgb24gdGhlIGFwcCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QsIDAuMTIpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdGFicy10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10YWItZ3JvdXAge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LXRhYi1sYWJlbCwgLm1hdC10YWItbGluayB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZywgYnV0dG9uKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYnV0dG9uKTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJ1dHRvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gX21hdC10b29sYmFyLWNvbG9yKCRwYWxldHRlKSB7XG4gIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkcGFsZXR0ZSk7XG4gIGNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsIGRlZmF1bHQtY29udHJhc3QpO1xufVxuXG5AbWl4aW4gX21hdC10b29sYmFyLWZvcm0tZmllbGQtb3ZlcnJpZGVzIHtcbiAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSxcbiAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSxcbiAgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1sYWJlbCxcbiAgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCxcbiAgLm1hdC1zZWxlY3QtdmFsdWUsXG4gIC5tYXQtc2VsZWN0LWFycm93LFxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG5cbiAgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogY3VycmVudENvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdG9vbGJhci10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC10b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGFwcC1iYXIpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJi5tYXQtcHJpbWFyeSB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJHByaW1hcnkpO1xuICAgIH1cblxuICAgICYubWF0LWFjY2VudCB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJHdhcm4pO1xuICAgIH1cblxuICAgIEBpbmNsdWRlIF9tYXQtdG9vbGJhci1mb3JtLWZpZWxkLW92ZXJyaWRlcztcbiAgfVxufVxuXG5AbWl4aW4gbWF0LXRvb2xiYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtdG9vbGJhcixcbiAgLm1hdC10b29sYmFyIGgxLFxuICAubWF0LXRvb2xiYXIgaDIsXG4gIC5tYXQtdG9vbGJhciBoMyxcbiAgLm1hdC10b29sYmFyIGg0LFxuICAubWF0LXRvb2xiYXIgaDUsXG4gIC5tYXQtdG9vbGJhciBoNiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHRpdGxlKTtcbiAgICBtYXJnaW46IDA7XG4gIH1cbn1cblxuXG5cblxuXG4kbWF0LXRvb2x0aXAtdGFyZ2V0LWhlaWdodDogMjJweDtcbiRtYXQtdG9vbHRpcC1mb250LXNpemU6IDEwcHg7XG4kbWF0LXRvb2x0aXAtdmVydGljYWwtcGFkZGluZzogKCRtYXQtdG9vbHRpcC10YXJnZXQtaGVpZ2h0IC0gJG1hdC10b29sdGlwLWZvbnQtc2l6ZSkgLyAyO1xuXG4kbWF0LXRvb2x0aXAtaGFuZHNldC10YXJnZXQtaGVpZ2h0OiAzMHB4O1xuJG1hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplOiAxNHB4O1xuJG1hdC10b29sdGlwLWhhbmRzZXQtdmVydGljYWwtcGFkZGluZzpcbiAgICAoJG1hdC10b29sdGlwLWhhbmRzZXQtdGFyZ2V0LWhlaWdodCAtICRtYXQtdG9vbHRpcC1oYW5kc2V0LWZvbnQtc2l6ZSkgLyAyO1xuXG5AbWl4aW4gbWF0LXRvb2x0aXAtdGhlbWUoJHRoZW1lKSB7XG4gIC5tYXQtdG9vbHRpcCB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRtYXQtZ3JleSwgNzAwLCAwLjkpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdG9vbHRpcC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10b29sdGlwIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICAgIGZvbnQtc2l6ZTogJG1hdC10b29sdGlwLWZvbnQtc2l6ZTtcbiAgICBwYWRkaW5nLXRvcDogJG1hdC10b29sdGlwLXZlcnRpY2FsLXBhZGRpbmc7XG4gICAgcGFkZGluZy1ib3R0b206ICRtYXQtdG9vbHRpcC12ZXJ0aWNhbC1wYWRkaW5nO1xuICB9XG5cbiAgLm1hdC10b29sdGlwLWhhbmRzZXQge1xuICAgIGZvbnQtc2l6ZTogJG1hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplO1xuICAgIHBhZGRpbmctdG9wOiAkbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nO1xuICAgIHBhZGRpbmctYm90dG9tOiAkbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nO1xuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC1zbmFjay1iYXItdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuXG4gIC5tYXQtc25hY2stYmFyLWNvbnRhaW5lciB7XG4gICAgLy8gVXNlIHRoZSBwcmltYXJ5IHRleHQgb24gdGhlIGRhcmsgdGhlbWUsIGV2ZW4gdGhvdWdoIHRoZSBsaWdodGVyIG9uZSB1c2VzXG4gICAgLy8gYSBzZWNvbmRhcnksIGJlY2F1c2UgdGhlIGNvbnRyYXN0IG9uIHRoZSBsaWdodCBwcmltYXJ5IHRleHQgaXMgcG9vci5cbiAgICBjb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsICRkYXJrLXByaW1hcnktdGV4dCwgJGxpZ2h0LXNlY29uZGFyeS10ZXh0KTtcbiAgICBiYWNrZ3JvdW5kOiBpZigkaXMtZGFyay10aGVtZSwgbWFwLWdldCgkbWF0LWdyZXksIDUwKSwgIzMyMzIzMik7XG5cbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbig2LCAkdGhlbWUpO1xuICB9XG5cbiAgLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgICBjb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsIGluaGVyaXQsIG1hdC1jb2xvcigkYWNjZW50KSk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zbmFjay1iYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtc2ltcGxlLXNuYWNrYmFyIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBib2R5LTEpO1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiB7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBpbmhlcml0O1xuICAgICAgc2l6ZTogaW5oZXJpdDtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJ1dHRvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gVGhlbWUgc3R5bGVzIHRoYXQgb25seSBhcHBseSB0byB0aGUgZmlsbCBhcHBlYXJhbmNlIG9mIHRoZSBmb3JtLWZpZWxkLlxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtZmlsbC10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGlzLWRhcmstdGhlbWU6IG1hcC1nZXQoJHRoZW1lLCBpcy1kYXJrKTtcblxuICAkZmlsbC1iYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGJhc2UsIGlmKCRpcy1kYXJrLXRoZW1lLCAwLjEsIDAuMDQpKTtcbiAgJGZpbGwtZGlzYWJsZWQtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBiYXNlLCBpZigkaXMtZGFyay10aGVtZSwgMC4wNSwgMC4wMikpO1xuICAkdW5kZXJsaW5lLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIsIGlmKCRpcy1kYXJrLXRoZW1lLCAwLjUsIDAuNDIpKTtcbiAgJGxhYmVsLWRpc2FibGVkLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLXRleHQpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwge1xuICAgIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRmaWxsLWJhY2tncm91bmQ7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtZmxleCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZmlsbC1kaXNhYmxlZC1iYWNrZ3JvdW5kO1xuICAgIH1cblxuICAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRsYWJlbC1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlOiAwO1xuXG4vLyBBcHBsaWVzIGEgZmxvYXRpbmcgbGFiZWwgYWJvdmUgdGhlIGZvcm0gZmllbGQgY29udHJvbCBpdHNlbGYuXG5AbWl4aW4gX21hdC1mb3JtLWZpZWxkLWZpbGwtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtZmlsbC1kZWR1cGUpXG4gICAgICAgICAgICAgc2NhbGUoJGZvbnQtc2NhbGUpO1xuICB3aWR0aDogMTAwJSAvICRmb250LXNjYWxlICsgJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlO1xuXG4gICRtYXQtZm9ybS1maWVsZC1maWxsLWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlICsgMC4wMDAwMSAhZ2xvYmFsO1xufVxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtZmlsbC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLy8gVGhlIHVuaXQtbGVzcyBsaW5lLWhlaWdodCBmcm9tIHRoZSBmb250IGNvbmZpZy5cbiAgJGxpbmUtaGVpZ2h0OiBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgaW5wdXQpO1xuICAvLyBUaGUgYW1vdW50IHRvIHNjYWxlIHRoZSBmb250IGZvciB0aGUgZmxvYXRpbmcgbGFiZWwgYW5kIHN1YnNjcmlwdC5cbiAgJHN1YnNjcmlwdC1mb250LXNjYWxlOiAwLjc1O1xuICAvLyBUaGUgcGFkZGluZyBvbiB0b3Agb2YgdGhlIGluZml4LlxuICAkaW5maXgtcGFkZGluZy10b3A6IDAuMjVlbTtcbiAgLy8gVGhlIHBhZGRpbmcgYmVsb3cgdGhlIGluZml4LlxuICAkaW5maXgtcGFkZGluZy1ib3R0b206IDAuNzVlbTtcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIGFtb3VudCB3ZSBvZmZzZXQgdGhlIGxhYmVsIGZyb20gdGhlIGlucHV0IHRleHQgaW4gdGhlIGZpbGwgYXBwZWFyYW5jZS5cbiAgJGZpbGwtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ6IC0wLjVlbTtcblxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIHtcbiAgICAubWF0LWZvcm0tZmllbGQtaW5maXgge1xuICAgICAgcGFkZGluZzogJGluZml4LXBhZGRpbmctdG9wIDAgJGluZml4LXBhZGRpbmctYm90dG9tIDA7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZy10b3A7XG4gICAgICBtYXJnaW4tdG9wOiAkZmlsbC1hcHBlYXJhbmNlLWxhYmVsLW9mZnNldDtcbiAgICB9XG5cbiAgICAmLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCB7XG4gICAgICAmLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gICAgICAubWF0LWlucHV0LXNlcnZlcjpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1maWxsLWxhYmVsLWZsb2F0aW5nKFxuICAgICAgICAgICAgICAgICRzdWJzY3JpcHQtZm9udC1zY2FsZSwgJGluZml4LXBhZGRpbmctdG9wICsgJGZpbGwtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQsXG4gICAgICAgICAgICAgICAgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLWZpbGwtbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZy10b3AgKyAkZmlsbC1hcHBlYXJhbmNlLWxhYmVsLW9mZnNldCxcbiAgICAgICAgICAgICAgICAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbi8vIFRoZW1lIHN0eWxlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIGxlZ2FjeSBhcHBlYXJhbmNlIG9mIHRoZSBmb3JtLWZpZWxkLlxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtbGVnYWN5LXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICRsYWJlbC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICR1bmRlcmxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNywgMC40MikpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1oaW50IHtcbiAgICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gICAgICBAaW5jbHVkZSBtYXQtY29udHJvbC1kaXNhYmxlZC11bmRlcmxpbmUoJHVuZGVybGluZS1jb2xvcik7XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGU6IDA7XG5cbi8vIEFwcGxpZXMgYSBmbG9hdGluZyBsYWJlbCBhYm92ZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGl0c2VsZi5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nKCRmb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApIHtcbiAgLy8gV2UgdXNlIHBlcnNwZWN0aXZlIHRvIGZpeCB0aGUgdGV4dCBibHVycmluZXNzIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAvLyBodHRwOi8vd3d3LnVzZXJhZ2VudG1hbi5jb20vYmxvZy8yMDE0LzA1LzA0L2ZpeGluZy10eXBvZ3JhcGh5LWluc2lkZS1vZi0yLWQtY3NzLXRyYW5zZm9ybXMvXG4gIC8vIFRoaXMgcmVzdWx0cyBpbiBhIHNtYWxsIGppdHRlciBhZnRlciB0aGUgbGFiZWwgZmxvYXRzIG9uIEZpcmVmb3gsIHdoaWNoIHRoZVxuICAvLyB0cmFuc2xhdGVaIGZpeGVzLlxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcpIHNjYWxlKCRmb250LXNjYWxlKSBwZXJzcGVjdGl2ZSgxMDBweClcbiAgdHJhbnNsYXRlWigwLjAwMXB4ICsgJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUpO1xuICAvLyBUaGUgdHJpY2tzIGFib3ZlIHVzZWQgdG8gc21vb3RoIG91dCB0aGUgYW5pbWF0aW9uIG9uIGNocm9tZSBhbmQgZmlyZWZveCBhY3R1YWxseSBtYWtlIHRoaW5nc1xuICAvLyB3b3JzZSBvbiBJRSwgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGluIHRoZSBJRSB2ZXJzaW9uLlxuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0kaW5maXgtbWFyZ2luLXRvcCAtICRpbmZpeC1wYWRkaW5nICsgJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUpXG4gICAgICAgICAgICAgICAgICBzY2FsZSgkZm9udC1zY2FsZSk7XG5cbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlO1xuXG4gICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlOiAkbWF0LWZvcm0tZmllbGQtbGVnYWN5LWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuLy8gU2FtZSBhcyBtaXhpbiBhYm92ZSwgYnV0IG9taXRzIHRoZSB0cmFuc2xhdGVaIGZvciBwcmludGluZyBwdXJwb3Nlcy5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KCRmb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApIHtcbiAgLy8gVGhpcyByZXN1bHRzIGluIGEgc21hbGwgaml0dGVyIGFmdGVyIHRoZSBsYWJlbCBmbG9hdHMgb24gRmlyZWZveCwgd2hpY2ggdGhlXG4gIC8vIHRyYW5zbGF0ZVogZml4ZXMuXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtJGluZml4LW1hcmdpbi10b3AgLSAkaW5maXgtcGFkZGluZyArICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlKVxuICAgICAgICAgICAgICAgICAgc2NhbGUoJGZvbnQtc2NhbGUpO1xuICAvLyBUaGUgdHJpY2tzIGFib3ZlIHVzZWQgdG8gc21vb3RoIG91dCB0aGUgYW5pbWF0aW9uIG9uIGNocm9tZSBhbmQgZmlyZWZveCBhY3R1YWxseSBtYWtlIHRoaW5nc1xuICAvLyB3b3JzZSBvbiBJRSwgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGluIHRoZSBJRSB2ZXJzaW9uLlxuICAkbWF0LWZvcm0tZmllbGQtbGVnYWN5LWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUgKyAwLjAwMDAxICFnbG9iYWw7XG59XG5cbkBtaXhpbiBtYXQtZm9ybS1maWVsZC1sZWdhY3ktdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIGFtb3VudCBvZiBzcGFjZSBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhlIGxpbmUgYW5kIHRoZSB0b3Agb2YgdGhlIGFjdHVhbCB0ZXh0XG4gIC8vIChhcyBhIGZyYWN0aW9uIG9mIHRoZSBmb250LXNpemUpLlxuICAkbGluZS1zcGFjaW5nOiAoJGxpbmUtaGVpZ2h0IC0gMSkgLyAyO1xuICAvLyBUaGUgcGFkZGluZyBvbiB0aGUgaW5maXguIE1vY2tzIHNob3cgaGFsZiBvZiB0aGUgdGV4dCBzaXplLCBidXQgc2VlbSB0byBtZWFzdXJlIGZyb20gdGhlIGVkZ2VcbiAgLy8gb2YgdGhlIHRleHQgaXRzZWxmLCBub3QgdGhlIGVkZ2Ugb2YgdGhlIGxpbmU7IHRoZXJlZm9yZSB3ZSBzdWJ0cmFjdCBvZmYgdGhlIGxpbmUgc3BhY2luZy5cbiAgJGluZml4LXBhZGRpbmc6IDAuNWVtIC0gJGxpbmUtc3BhY2luZztcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgLm1hdC1mb3JtLWZpZWxkLWZsZXggYXJlYSBhbmQgdGhlIHN1YnNjcmlwdCB3cmFwcGVyLlxuICAvLyBNb2NrcyBzaG93IGhhbGYgb2YgdGhlIHRleHQgc2l6ZSwgYnV0IHRoaXMgbWFyZ2luIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aXRoIHRoZSBzdWJzY3JpcHRcbiAgLy8gdGV4dCBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBzY2FsZSBmYWN0b3IgdG8gbWFrZSBpdCBoYWxmIG9mIHRoZSBvcmlnaW5hbCB0ZXh0XG4gIC8vIHNpemUuIFdlIGFnYWluIG5lZWQgdG8gc3VidHJhY3Qgb2ZmIHRoZSBsaW5lIHNwYWNpbmcgc2luY2UgdGhlIG1vY2tzIG1lYXN1cmUgdG8gdGhlIGVkZ2Ugb2YgdGhlXG4gIC8vIHRleHQsIG5vdCB0aGUgIGVkZ2Ugb2YgdGhlIGxpbmUuXG4gICRzdWJzY3JpcHQtbWFyZ2luLXRvcDogMC41ZW0gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGUgLSAoJGxpbmUtc3BhY2luZyAqIDIpO1xuICAvLyBUaGUgcGFkZGluZyBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLXdyYXBwZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN1YnNjcmlwdCwgc2luY2UgaXQnc1xuICAvLyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgc3Vic2NyaXB0J3MgbWFyZ2luIGFuZCBsaW5lLWhlaWdodCwgYnV0IHdlXG4gIC8vIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIHN1YnNjcmlwdCBmb250IHNjYWxlIGZhY3RvciBzaW5jZSB0aGUgd3JhcHBlciBoYXMgYSBsYXJnZXIgZm9udCBzaXplLlxuICAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTogKCRzdWJzY3JpcHQtbWFyZ2luLXRvcCArICRsaW5lLWhlaWdodCkgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IHtcbiAgICAubWF0LWZvcm0tZmllbGQtd3JhcHBlciB7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHdyYXBwZXItcGFkZGluZy1ib3R0b207XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgICAgIHBhZGRpbmc6ICRpbmZpeC1wYWRkaW5nIDA7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nKFxuICAgICAgICAgICAgICAgICRzdWJzY3JpcHQtZm9udC1zY2FsZSwgJGluZml4LXBhZGRpbmcsICRpbmZpeC1tYXJnaW4tdG9wKTtcbiAgICAgIH1cblxuICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCB3aWxsIHJlbHkgb24gQXV0b2ZpbGxNb25pdG9yIGluc3RlYWQuXG4gICAgICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbDotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sZWdhY3ktbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLWxlZ2FjeS1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZztcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIHVuZGVybGluZSB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAgIC8vIHNvIHdlIG1vdmUgaXQgdXAgYnkgdGhlIHBhZGRpbmcgYW1vdW50LlxuICAgICAgYm90dG9tOiAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTtcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xuICAgICAgbWFyZ2luLXRvcDogJHN1YnNjcmlwdC1tYXJnaW4tdG9wO1xuXG4gICAgICAvLyBXZSB3YW50IHRoZSBzdWJzY3JpcHQgdG8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudCBib3gsIG5vdCB0aGUgcGFkZGluZyBib3gsXG4gICAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudCAoYWRqdXN0ZWQgZm9yIHRoZSBzbWFsbGVyIGZvbnQgc2l6ZSk7XG4gICAgICB0b3A6IGNhbGMoMTAwJSAtICN7JHdyYXBwZXItcGFkZGluZy1ib3R0b20gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGV9KTtcbiAgICB9XG4gIH1cblxuICAvLyB0cmFuc2xhdGVaIGNhdXNlcyB0aGUgbGFiZWwgdG8gbm90IGFwcGVhciB3aGlsZSBwcmludGluZywgc28gd2Ugb3ZlcnJpZGUgaXQgdG8gbm90XG4gIC8vIGFwcGx5IHRyYW5zbGF0ZVogd2hpbGUgcHJpbnRpbmdcbiAgQG1lZGlhIHByaW50IHtcbiAgICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgICAmLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gICAgICAgIC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KFxuICAgICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCB3aWxsIHJlbHkgb24gQXV0b2ZpbGxNb25pdG9yIGluc3RlYWQuXG4gICAgICAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sZWdhY3ktbGFiZWwtZmxvYXRpbmctcHJpbnQoXG4gICAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgICAgLy8gKHVzZWQgYXMgYSBwdXJlIENTUyBzdGFuZC1pbiBmb3IgbWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0KS5cbiAgICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KFxuICAgICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbi8vIFRoZW1lIHN0eWxlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIG91dGxpbmUgYXBwZWFyYW5jZSBvZiB0aGUgZm9ybS1maWVsZC5cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICRsYWJlbC1kaXNhYmxlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgJG91dGxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuMywgMC4xMikpO1xuICAkb3V0bGluZS1jb2xvci1ob3ZlcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyLCBpZigkaXMtZGFyay10aGVtZSwgMSwgMC44NykpO1xuICAkb3V0bGluZS1jb2xvci1wcmltYXJ5OiBtYXQtY29sb3IoJHByaW1hcnkpO1xuICAkb3V0bGluZS1jb2xvci1hY2NlbnQ6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgJG91dGxpbmUtY29sb3Itd2FybjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgJG91dGxpbmUtY29sb3ItZGlzYWJsZWQ6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuMTUsIDAuMDYpKTtcblxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIHtcbiAgICAubWF0LWZvcm0tZmllbGQtb3V0bGluZSB7XG4gICAgICBjb2xvcjogJG91dGxpbmUtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICAgICAgY29sb3I6ICRvdXRsaW5lLWNvbG9yLWhvdmVyO1xuICAgIH1cblxuICAgICYubWF0LWZvY3VzZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICAgICAgICBjb2xvcjogJG91dGxpbmUtY29sb3ItcHJpbWFyeTtcbiAgICAgIH1cblxuICAgICAgJi5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIHtcbiAgICAgICAgY29sb3I6ICRvdXRsaW5lLWNvbG9yLWFjY2VudDtcbiAgICAgIH1cblxuICAgICAgJi5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gICAgICAgIGNvbG9yOiAkb3V0bGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsYXNzIHJlcGVhdGVkIHNvIHRoYXQgcnVsZSBpcyBzcGVjaWZpYyBlbm91Z2ggdG8gb3ZlcnJpZGUgZm9jdXNlZCBhY2NlbnQgY29sb3IgY2FzZS5cbiAgICAmLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCB7XG4gICAgICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gICAgICAgIGNvbG9yOiAkb3V0bGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRsYWJlbC1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUge1xuICAgICAgICBjb2xvcjogJG91dGxpbmUtY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZGVkdXBlOiAwO1xuXG4vLyBBcHBsaWVzIGEgZmxvYXRpbmcgbGFiZWwgYWJvdmUgdGhlIGZvcm0gZmllbGQgY29udHJvbCBpdHNlbGYuXG5AbWl4aW4gX21hdC1mb3JtLWZpZWxkLW91dGxpbmUtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtb3V0bGluZS1kZWR1cGUpXG4gIHNjYWxlKCRmb250LXNjYWxlKTtcbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWRlZHVwZTtcblxuICAkbWF0LWZvcm0tZmllbGQtb3V0bGluZS1kZWR1cGU6ICRtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIHBhZGRpbmcgYWJvdmUgYW5kIGJlbG93IHRoZSBpbmZpeC5cbiAgJGluZml4LXBhZGRpbmc6IDFlbTtcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgLm1hdC1mb3JtLWZpZWxkLWZsZXggYXJlYSBhbmQgdGhlIHN1YnNjcmlwdCB3cmFwcGVyLlxuICAvLyBNb2NrcyBzaG93IGhhbGYgb2YgdGhlIHRleHQgc2l6ZSwgYnV0IHRoaXMgbWFyZ2luIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aXRoIHRoZSBzdWJzY3JpcHRcbiAgLy8gdGV4dCBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBzY2FsZSBmYWN0b3IgdG8gbWFrZSBpdCBoYWxmIG9mIHRoZSBvcmlnaW5hbCB0ZXh0XG4gIC8vIHNpemUuXG4gICRzdWJzY3JpcHQtbWFyZ2luLXRvcDogMC41ZW0gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG4gIC8vIFRoZSBwYWRkaW5nIGFwcGxpZWQgdG8gdGhlIGZvcm0tZmllbGQtd3JhcHBlciB0byByZXNlcnZlIHNwYWNlIGZvciB0aGUgc3Vic2NyaXB0LCBzaW5jZSBpdCdzXG4gIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZC4gVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJzY3JpcHQncyBtYXJnaW4gYW5kIGxpbmUtaGVpZ2h0LCBidXQgd2VcbiAgLy8gbmVlZCB0byBtdWx0aXBseSBieSB0aGUgc3Vic2NyaXB0IGZvbnQgc2NhbGUgZmFjdG9yIHNpbmNlIHRoZSB3cmFwcGVyIGhhcyBhIGxhcmdlciBmb250IHNpemUuXG4gICR3cmFwcGVyLXBhZGRpbmctYm90dG9tOiAoJHN1YnNjcmlwdC1tYXJnaW4tdG9wICsgJGxpbmUtaGVpZ2h0KSAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIGFtb3VudCB3ZSBvZmZzZXQgdGhlIGxhYmVsIGZyb20gdGhlIGlucHV0IHRleHQgaW4gdGhlIG91dGxpbmUgYXBwZWFyYW5jZS5cbiAgJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ6IC0wLjI1ZW07XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgICAgIHBhZGRpbmc6ICRpbmZpeC1wYWRkaW5nIDAgJGluZml4LXBhZGRpbmcgMDtcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgdG9wOiAkaW5maXgtbWFyZ2luLXRvcCArICRpbmZpeC1wYWRkaW5nO1xuICAgICAgbWFyZ2luLXRvcDogJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtb3V0bGluZS1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nICsgJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQsXG4gICAgICAgICAgICAgICAgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLW91dGxpbmUtbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZyArICRvdXRsaW5lLWFwcGVhcmFuY2UtbGFiZWwtb2Zmc2V0LFxuICAgICAgICAgICAgICAgICRpbmZpeC1tYXJnaW4tdG9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuLy8gVGhlbWUgc3R5bGVzIHRoYXQgb25seSBhcHBseSB0byB0aGUgc3RhbmRhcmQgYXBwZWFyYW5jZSBvZiB0aGUgZm9ybS1maWVsZC5cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICR1bmRlcmxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNywgMC40MikpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3I7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jb250cm9sLWRpc2FibGVkLXVuZGVybGluZSgkdW5kZXJsaW5lLWNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXR5cG9ncmFwaHkoJGNvbmZpZykge31cblxuXG4vLyBUaGVtZSBzdHlsZXMgdGhhdCBhcHBseSB0byBhbGwgYXBwZWFyYW5jZXMgb2YgdGhlIGZvcm0tZmllbGQuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gIC8vIExhYmVsIGNvbG9ycy4gUmVxdWlyZWQgaXMgdXNlZCBmb3IgdGhlIGAqYCBzdGFyIHNob3duIGluIHRoZSBsYWJlbC5cbiAgJGxhYmVsLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0LCBpZigkaXMtZGFyay10aGVtZSwgMC43LCAwLjYpKTtcbiAgJGZvY3VzZWQtbGFiZWwtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICRyZXF1aXJlZC1sYWJlbC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuXG4gIC8vIFVuZGVybGluZSBjb2xvcnMuXG4gICR1bmRlcmxpbmUtY29sb3ItYmFzZTogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyLCBpZigkaXMtZGFyay10aGVtZSwgMSwgMC44NykpO1xuICAkdW5kZXJsaW5lLWNvbG9yLWFjY2VudDogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICAkdW5kZXJsaW5lLWNvbG9yLXdhcm46IG1hdC1jb2xvcigkd2Fybik7XG4gICR1bmRlcmxpbmUtZm9jdXNlZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcblxuICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gIH1cblxuICAubWF0LWhpbnQge1xuICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gIH1cblxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICBjb2xvcjogJGZvY3VzZWQtbGFiZWwtY29sb3I7XG5cbiAgICAmLm1hdC1hY2NlbnQge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYWNjZW50O1xuICAgIH1cblxuICAgICYubWF0LXdhcm4ge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtY29sb3Itd2FybjtcbiAgICB9XG4gIH1cblxuICAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciB7XG4gICAgY29sb3I6ICRyZXF1aXJlZC1sYWJlbC1jb2xvcjtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYmFzZTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWZvY3VzZWQtY29sb3I7XG5cbiAgICAgICYubWF0LWFjY2VudCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYWNjZW50O1xuICAgICAgfVxuXG4gICAgICAmLm1hdC13YXJuIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkge1xuICAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtZm9jdXNlZC1jb2xvcjtcbiAgICB9XG5cbiAgICAmLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci1hY2NlbnQ7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVyIHtcbiAgICAgIGNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yLXdhcm47XG4gICAgfVxuICB9XG5cbiAgLy8gU3R5bGluZyBmb3IgdGhlIGVycm9yIHN0YXRlIG9mIHRoZSBmb3JtIGZpZWxkLiBOb3RlIHRoYXQgd2hpbGUgdGhlIHNhbWUgY2FuIGJlXG4gIC8vIGFjaGlldmVkIHdpdGggdGhlIG5nLSogY2xhc3Nlcywgd2UgdXNlIHRoaXMgYXBwcm9hY2ggaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNhbWVcbiAgLy8gbG9naWMgaXMgdXNlZCB0byBzdHlsZSB0aGUgZXJyb3Igc3RhdGUgYW5kIHRvIHNob3cgdGhlIGVycm9yIG1lc3NhZ2VzLlxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yLXdhcm47XG5cbiAgICAgICYubWF0LWFjY2VudCxcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIge1xuICAgICAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4gICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3Itd2FybjtcbiAgICB9XG4gIH1cblxuICAubWF0LWVycm9yIHtcbiAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICB9XG5cbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtbGVnYWN5LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1mb3JtLWZpZWxkLWZpbGwtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGVtZSgkdGhlbWUpO1xufVxuXG4vLyBVc2VkIHRvIG1ha2UgaW5zdGFuY2VzIG9mIHRoZSBfbWF0LWZvcm0tZmllbGQtbGFiZWwtZmxvYXRpbmcgbWl4aW4gbmVnbGlnaWJseSBkaWZmZXJlbnQsXG4vLyBhbmQgcHJldmVudCBHb29nbGUncyBDU1MgT3B0aW1pemVyIGZyb20gY29sbGFwc2luZyB0aGUgZGVjbGFyYXRpb25zLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWVcbi8vIG9mIHRoZSBzZWxlY3RvcnMgY29udGFpbiBwc2V1ZG8tY2xhc3NlcyBub3QgcmVjb2duaXplZCBpbiBhbGwgYnJvd3NlcnMuIElmIGEgYnJvd3NlciBlbmNvdW50ZXJzXG4vLyBhbiB1bmtub3duIHBzZXVkby1jbGFzcyBpdCB3aWxsIGRpc2NhcmQgdGhlIGVudGlyZSBydWxlIHNldC5cbiRtYXQtZm9ybS1maWVsZC1kZWR1cGU6IDA7XG5cbi8vIEFwcGxpZXMgYSBmbG9hdGluZyBsYWJlbCBhYm92ZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGl0c2VsZi5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtZGVkdXBlKVxuICAgICAgICAgICAgIHNjYWxlKCRmb250LXNjYWxlKTtcbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1kZWR1cGU7XG5cbiAgJG1hdC1mb3JtLWZpZWxkLWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAvLyBUaGUgdW5pdC1sZXNzIGxpbmUtaGVpZ2h0IGZyb20gdGhlIGZvbnQgY29uZmlnLlxuICAkbGluZS1oZWlnaHQ6IG1hdC1saW5lLWhlaWdodCgkY29uZmlnLCBpbnB1dCk7XG5cbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIHByZWZpeCBhbmQgc3VmZml4IGljb25zLlxuICAkcHJlZml4LXN1ZmZpeC1pY29uLWZvbnQtc2NhbGU6IDEuNTtcblxuICAvLyBUaGUgcGFkZGluZyBvbiB0aGUgaW5maXguIE1vY2tzIHNob3cgaGFsZiBvZiB0aGUgdGV4dCBzaXplLlxuICAkaW5maXgtcGFkZGluZzogMC41ZW07XG4gIC8vIFRoZSBtYXJnaW4gYXBwbGllZCB0byB0aGUgZm9ybS1maWVsZC1pbmZpeCB0byByZXNlcnZlIHNwYWNlIGZvciB0aGUgZmxvYXRpbmcgbGFiZWwuXG4gICRpbmZpeC1tYXJnaW4tdG9wOiAxZW0gKiAkbGluZS1oZWlnaHQgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG4gIC8vIEZvbnQgc2l6ZSB0byB1c2UgZm9yIHRoZSBsYWJlbCBhbmQgc3Vic2NyaXB0IHRleHQuXG4gICRzdWJzY3JpcHQtZm9udC1zaXplOiAkc3Vic2NyaXB0LWZvbnQtc2NhbGUgKiAxMDAlO1xuICAvLyBGb250IHNpemUgdG8gdXNlIGZvciB0aGUgZm9yIHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBpY29ucy5cbiAgJHByZWZpeC1zdWZmaXgtaWNvbi1mb250LXNpemU6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zY2FsZSAqIDEwMCU7XG4gIC8vIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBib3R0b20gb2YgdGhlIC5tYXQtZm9ybS1maWVsZC1mbGV4IGFyZWEgYW5kIHRoZSBzdWJzY3JpcHQgd3JhcHBlci5cbiAgLy8gTW9ja3Mgc2hvdyBoYWxmIG9mIHRoZSB0ZXh0IHNpemUsIGJ1dCB0aGlzIG1hcmdpbiBpcyBhcHBsaWVkIHRvIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3Vic2NyaXB0XG4gIC8vIHRleHQgZm9udCBzaXplLCBzbyB3ZSBuZWVkIHRvIGRpdmlkZSBieSB0aGUgc2NhbGUgZmFjdG9yIHRvIG1ha2UgaXQgaGFsZiBvZiB0aGUgb3JpZ2luYWwgdGV4dFxuICAvLyBzaXplLlxuICAkc3Vic2NyaXB0LW1hcmdpbi10b3A6IDAuNWVtIC8gJHN1YnNjcmlwdC1mb250LXNjYWxlO1xuICAvLyBUaGUgcGFkZGluZyBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLXdyYXBwZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN1YnNjcmlwdCwgc2luY2UgaXQnc1xuICAvLyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgc3Vic2NyaXB0J3MgbWFyZ2luIGFuZCBsaW5lLWhlaWdodCwgYnV0IHdlXG4gIC8vIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIHN1YnNjcmlwdCBmb250IHNjYWxlIGZhY3RvciBzaW5jZSB0aGUgd3JhcHBlciBoYXMgYSBsYXJnZXIgZm9udCBzaXplLlxuICAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTogKCRzdWJzY3JpcHQtbWFyZ2luLXRvcCArICRsaW5lLWhlaWdodCkgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG5cbiAgLm1hdC1mb3JtLWZpZWxkIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgaW5wdXQpO1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIge1xuICAgIHBhZGRpbmctYm90dG9tOiAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1wcmVmaXgsXG4gIC5tYXQtZm9ybS1maWVsZC1zdWZmaXgge1xuICAgIC8vIEFsbG93IGljb25zIGluIGEgcHJlZml4IG9yIHN1ZmZpeCB0byBhZGFwdCB0byB0aGUgY29ycmVjdCBzaXplLlxuICAgIC5tYXQtaWNvbiB7XG4gICAgICBmb250LXNpemU6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zaXplO1xuICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBpY29uIGJ1dHRvbnMgaW4gYSBwcmVmaXggb3Igc3VmZml4IHRvIGFkYXB0IHRvIHRoZSBjb3JyZWN0IHNpemUuXG4gICAgLm1hdC1pY29uLWJ1dHRvbiB7XG4gICAgICBoZWlnaHQ6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zY2FsZSAqIDFlbTtcbiAgICAgIHdpZHRoOiAkcHJlZml4LXN1ZmZpeC1pY29uLWZvbnQtc2NhbGUgKiAxZW07XG5cbiAgICAgIC5tYXQtaWNvbiB7XG4gICAgICAgIGhlaWdodDogJGxpbmUtaGVpZ2h0ICogMWVtO1xuICAgICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gICAgcGFkZGluZzogJGluZml4LXBhZGRpbmcgMDtcbiAgICAvLyBUaHJvd3Mgb2ZmIHRoZSBiYXNlbGluZSBpZiB3ZSBkbyBpdCBhcyBhIHJlYWwgbWFyZ2luLCBzbyB3ZSBkbyBpdCBhcyBhIGJvcmRlciBpbnN0ZWFkLlxuICAgIGJvcmRlci10b3A6ICRpbmZpeC1tYXJnaW4tdG9wIHNvbGlkIHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCB7XG4gICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgIC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgIH1cblxuICAgIC8vIFNlcnZlci1zaWRlIHJlbmRlcmVkIG1hdElucHV0IHdpdGggYSBsYWJlbCBhdHRyaWJ1dGUgYnV0IGxhYmVsIG5vdCBzaG93blxuICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIHtcbiAgICB0b3A6IC0kaW5maXgtbWFyZ2luLXRvcDtcbiAgICBwYWRkaW5nLXRvcDogJGluZml4LW1hcmdpbi10b3A7XG4gIH1cblxuICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZztcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICAgIC8vIFdlIHdhbnQgdGhlIHVuZGVybGluZSB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudC5cbiAgICBib3R0b206ICR3cmFwcGVyLXBhZGRpbmctYm90dG9tO1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcbiAgICBmb250LXNpemU6ICRzdWJzY3JpcHQtZm9udC1zaXplO1xuICAgIG1hcmdpbi10b3A6ICRzdWJzY3JpcHQtbWFyZ2luLXRvcDtcblxuICAgIC8vIFdlIHdhbnQgdGhlIHN1YnNjcmlwdCB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudCAoYWRqdXN0ZWQgZm9yIHRoZSBzbWFsbGVyIGZvbnQgc2l6ZSk7XG4gICAgdG9wOiBjYWxjKDEwMCUgLSAjeyR3cmFwcGVyLXBhZGRpbmctYm90dG9tIC8gJHN1YnNjcmlwdC1mb250LXNjYWxlfSk7XG4gIH1cblxuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC1sZWdhY3ktdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtc3RhbmRhcmQtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtZmlsbC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG59XG5cblxuXG5cblxuQG1peGluIG1hdC10cmVlLXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtdHJlZSB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICB9XG5cbiAgLm1hdC10cmVlLW5vZGUsXG4gIC5tYXQtbmVzdGVkLXRyZWUtbm9kZSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC10cmVlLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXRyZWUge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LXRyZWUtbm9kZSxcbiAgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlIHtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cbi8vIEluY2x1ZGVzIGFsbCBvZiB0aGUgdHlwb2dyYXBoaWMgc3R5bGVzLlxuQG1peGluIGFuZ3VsYXItbWF0ZXJpYWwtdHlwb2dyYXBoeSgkY29uZmlnOiBudWxsKSB7XG4gIEBpZiAkY29uZmlnID09IG51bGwge1xuICAgICRjb25maWc6IG1hdC10eXBvZ3JhcGh5LWNvbmZpZygpO1xuICB9XG5cbiAgQGluY2x1ZGUgbWF0LWJhZGdlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1iYXNlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1hdXRvY29tcGxldGUtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWJvdHRvbS1zaGVldC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtYnV0dG9uLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1idXR0b24tdG9nZ2xlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1jYXJkLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1jaGVja2JveC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtY2hpcHMtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXRhYmxlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1kYXRlcGlja2VyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1kaWFsb2ctdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWV4cGFuc2lvbi1wYW5lbC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZ3JpZC1saXN0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1pY29uLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1pbnB1dC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtbWVudS10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtcGFnaW5hdG9yLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1wcm9ncmVzcy1iYXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXByb2dyZXNzLXNwaW5uZXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXJhZGlvLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zZWxlY3QtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXNpZGVuYXYtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXNsaWRlLXRvZ2dsZS10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtc2xpZGVyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zdGVwcGVyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zb3J0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10YWJzLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10b29sYmFyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10b29sdGlwLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1saXN0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1vcHRpb24tdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LW9wdGdyb3VwLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zbmFjay1iYXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXRyZWUtdHlwb2dyYXBoeSgkY29uZmlnKTtcbn1cblxuXG4vLyBNaXhpbiB0aGF0IHJlbmRlcnMgYWxsIG9mIHRoZSBjb3JlIHN0eWxlcyB0aGF0IGFyZSBub3QgdGhlbWUtZGVwZW5kZW50LlxuQG1peGluIG1hdC1jb3JlKCR0eXBvZ3JhcGh5LWNvbmZpZzogbnVsbCkge1xuICBAaW5jbHVkZSBhbmd1bGFyLW1hdGVyaWFsLXR5cG9ncmFwaHkoJHR5cG9ncmFwaHktY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXJpcHBsZSgpO1xuICBAaW5jbHVkZSBjZGstYTExeSgpO1xuICBAaW5jbHVkZSBjZGstb3ZlcmxheSgpO1xuICBAaW5jbHVkZSBjZGstdGV4dC1maWVsZCgpO1xufVxuXG4vLyBNaXhpbiB0aGF0IHJlbmRlcnMgYWxsIG9mIHRoZSBjb3JlIHN0eWxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgdGhlbWUuXG5AbWl4aW4gbWF0LWNvcmUtdGhlbWUoJHRoZW1lKSB7XG4gIEBpbmNsdWRlIG1hdC1yaXBwbGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LW9wdGlvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtb3B0Z3JvdXAtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXBzZXVkby1jaGVja2JveC10aGVtZSgkdGhlbWUpO1xuXG4gIC8vIFByb3ZpZGVzIGV4dGVybmFsIENTUyBjbGFzc2VzIGZvciBlYWNoIGVsZXZhdGlvbiB2YWx1ZS4gRWFjaCBDU1MgY2xhc3MgaXMgZm9ybWF0dGVkIGFzXG4gIC8vIGBtYXQtZWxldmF0aW9uLXokelZhbHVlYCB3aGVyZSBgJHpWYWx1ZWAgY29ycmVzcG9uZHMgdG8gdGhlIHotc3BhY2UgdG8gd2hpY2ggdGhlIGVsZW1lbnQgaXNcbiAgLy8gZWxldmF0ZWQuXG4gIEBmb3IgJHpWYWx1ZSBmcm9tIDAgdGhyb3VnaCAyNCB7XG4gICAgLiN7JF9tYXQtZWxldmF0aW9uLXByZWZpeH0jeyR6VmFsdWV9IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtZWxldmF0aW9uKCR6VmFsdWUsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcHBlciBlbGVtZW50IHRoYXQgcHJvdmlkZXMgdGhlIHRoZW1lIGJhY2tncm91bmQgd2hlbiB0aGUgdXNlcidzIGNvbnRlbnQgaXNuJ3RcbiAgLy8gaW5zaWRlIG9mIGEgYG1hdC1zaWRlbmF2LWNvbnRhaW5lcmAuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlIGFtcGVyc2FuZFxuICAvLyBzZWxlY3RvciBpbiBjYXNlIHRoZSBtaXhpbiBpcyBpbmNsdWRlZCBhdCB0aGUgdG9wIGxldmVsLlxuICAubWF0LWFwcC1iYWNrZ3JvdW5kI3tpZigmLCAnLCAmLm1hdC1hcHAtYmFja2dyb3VuZCcsICcnKX0ge1xuICAgICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgYmFja2dyb3VuZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cblxuICAvLyBNYXJrZXIgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIGhhcyBhZGRlZCBhIHRoZW1lIHRvIHRoZWlyIHBhZ2UuXG4gIEBhdC1yb290IHtcbiAgICAubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1kaXZpZGVyLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZGl2aWRlciB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtZGl2aWRlci12ZXJ0aWNhbCB7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIENyZWF0ZSBhIHRoZW1lLlxuQG1peGluIGFuZ3VsYXItbWF0ZXJpYWwtdGhlbWUoJHRoZW1lKSB7XG4gIEBpbmNsdWRlIG1hdC1jb3JlLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1hdXRvY29tcGxldGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWJhZGdlLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1ib3R0b20tc2hlZXQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWJ1dHRvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtYnV0dG9uLXRvZ2dsZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtY2FyZC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtY2hlY2tib3gtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWNoaXBzLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC10YWJsZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtZGF0ZXBpY2tlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtZGlhbG9nLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1kaXZpZGVyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1leHBhbnNpb24tcGFuZWwtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWdyaWQtbGlzdC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtaWNvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtaW5wdXQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWxpc3QtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LW1lbnUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXBhZ2luYXRvci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtcHJvZ3Jlc3MtYmFyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1wcm9ncmVzcy1zcGlubmVyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1yYWRpby10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc2VsZWN0LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1zaWRlbmF2LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1zbGlkZS10b2dnbGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXNsaWRlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc3RlcHBlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc29ydC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdGFicy10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdG9vbGJhci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdG9vbHRpcC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdHJlZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc25hY2stYmFyLXRoZW1lKCR0aGVtZSk7XG59XG4iLCJAaW1wb3J0ICd+QGFuZ3VsYXIvbWF0ZXJpYWwvdGhlbWluZyc7XG5cbkBpbmNsdWRlIG1hdC1jb3JlKCk7XG5cbi8vIFVzZWQgaHR0cDovL21jZy5tYml0c29uLmNvbSB0byBnZW5lcmF0ZSB0aGUgbWF0ZXJpYWwgcGFsZXR0ZS5cblxuLy8gIzVFMzVCMSAtLSBQUklNQVJZX0NPTE9SXG4kdmVyaWx5LXByaW1hcnk6IChcbiAgICA1MCA6ICNlY2U3ZjYsXG4gICAgMTAwIDogI2NmYzJlOCxcbiAgICAyMDAgOiAjYWY5YWQ4LFxuICAgIDMwMCA6ICM4ZTcyYzgsXG4gICAgNDAwIDogIzc2NTNiZCxcbiAgICA1MDAgOiAjNWUzNWIxLFxuICAgIDYwMCA6ICM1NjMwYWEsXG4gICAgNzAwIDogIzRjMjhhMSxcbiAgICA4MDAgOiAjNDIyMjk4LFxuICAgIDkwMCA6ICMzMTE2ODgsXG4gICAgQTEwMCA6ICNjYmJlZmYsXG4gICAgQTIwMCA6ICNhMzhiZmYsXG4gICAgQTQwMCA6ICM3YTU4ZmYsXG4gICAgQTcwMCA6ICM2NjNlZmYsXG4gICAgY29udHJhc3Q6IChcbiAgICAgICAgNTAgOiAjMDAwMDAwLFxuICAgICAgICAxMDAgOiAjMDAwMDAwLFxuICAgICAgICAyMDAgOiAjMDAwMDAwLFxuICAgICAgICAzMDAgOiAjMDAwMDAwLFxuICAgICAgICA0MDAgOiAjZmZmZmZmLFxuICAgICAgICA1MDAgOiAjZmZmZmZmLFxuICAgICAgICA2MDAgOiAjZmZmZmZmLFxuICAgICAgICA3MDAgOiAjZmZmZmZmLFxuICAgICAgICA4MDAgOiAjZmZmZmZmLFxuICAgICAgICA5MDAgOiAjZmZmZmZmLFxuICAgICAgICBBMTAwIDogIzAwMDAwMCxcbiAgICAgICAgQTIwMCA6ICMwMDAwMDAsXG4gICAgICAgIEE0MDAgOiAjZmZmZmZmLFxuICAgICAgICBBNzAwIDogI2ZmZmZmZixcbiAgICApXG4pO1xuXG5cbi8vICNDNDEwNjEgLS0gU0VDT05EQVJZX0NPTE9SXG4kdmVyaWx5LXNlY29uZGFyeTogKFxuICA1MCA6ICNmOGUyZWMsXG4gIDEwMCA6ICNlZGI3ZDAsXG4gIDIwMCA6ICNlMjg4YjAsXG4gIDMwMCA6ICNkNjU4OTAsXG4gIDQwMCA6ICNjZDM0NzksXG4gIDUwMCA6ICNjNDEwNjEsXG4gIDYwMCA6ICNiZTBlNTksXG4gIDcwMCA6ICNiNjBjNGYsXG4gIDgwMCA6ICNhZjA5NDUsXG4gIDkwMCA6ICNhMjA1MzMsXG4gIEExMDAgOiAjZmZjZGQ5LFxuICBBMjAwIDogI2ZmOWFiMixcbiAgQTQwMCA6ICNmZjY3OGIsXG4gIEE3MDAgOiAjZmY0ZDc3LFxuICBjb250cmFzdDogKFxuICAgICAgNTAgOiAjMDAwMDAwLFxuICAgICAgMTAwIDogIzAwMDAwMCxcbiAgICAgIDIwMCA6ICMwMDAwMDAsXG4gICAgICAzMDAgOiAjMDAwMDAwLFxuICAgICAgNDAwIDogI2ZmZmZmZixcbiAgICAgIDUwMCA6ICNmZmZmZmYsXG4gICAgICA2MDAgOiAjZmZmZmZmLFxuICAgICAgNzAwIDogI2ZmZmZmZixcbiAgICAgIDgwMCA6ICNmZmZmZmYsXG4gICAgICA5MDAgOiAjZmZmZmZmLFxuICAgICAgQTEwMCA6ICMwMDAwMDAsXG4gICAgICBBMjAwIDogIzAwMDAwMCxcbiAgICAgIEE0MDAgOiAjMDAwMDAwLFxuICAgICAgQTcwMCA6ICMwMDAwMDAsXG4gIClcbik7XG5cblxuXG5cbiR2ZXJpbHktYXBwLXByaW1hcnk6IG1hdC1wYWxldHRlKCR2ZXJpbHktcHJpbWFyeSk7XG4kdmVyaWx5LWFwcC1hY2NlbnQ6ICBtYXQtcGFsZXR0ZSgkdmVyaWx5LXNlY29uZGFyeSk7XG5cbiR2ZXJpbHktYXBwLXdhcm46ICAgIG1hdC1wYWxldHRlKCRtYXQtcmVkKTtcblxuJHZlcmlseS1hcHAtdGhlbWU6IG1hdC1saWdodC10aGVtZSgkdmVyaWx5LWFwcC1wcmltYXJ5LCAkdmVyaWx5LWFwcC1hY2NlbnQsICR2ZXJpbHktYXBwLXdhcm4pO1xuXG5AaW5jbHVkZSBhbmd1bGFyLW1hdGVyaWFsLXRoZW1lKCR2ZXJpbHktYXBwLXRoZW1lKTsiLCIvKiBEZWZhdWx0IEFuZ3VsYXIgTWF0ZXJpYWwgcHJlYnVpbHQgdGhlbWUuICovXG4vKiBUaGVtZSBmb3IgdGhlIHJpcHBsZSBlbGVtZW50cy4qL1xuLyogc3R5bGVsaW50LWRpc2FibGUgbWF0ZXJpYWwvbm8tcHJlZml4ZXMgKi9cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vXCIpO1xuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9TW9udHNlcnJhdFwiKTtcbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVdvcmsrU2Fuc1wiKTtcbi5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgZm9udC1zaXplOiA2cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBmb250LXNpemU6IDI0cHg7IH1cblxuLm1hdC1oMSwgLm1hdC1oZWFkbGluZSwgLm1hdC10eXBvZ3JhcGh5IGgxIHtcbiAgZm9udDogNDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwIDAgMTZweDsgfVxuXG4ubWF0LWgyLCAubWF0LXRpdGxlLCAubWF0LXR5cG9ncmFwaHkgaDIge1xuICBmb250OiA1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDMsIC5tYXQtc3ViaGVhZGluZy0yLCAubWF0LXR5cG9ncmFwaHkgaDMge1xuICBmb250OiA0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDQsIC5tYXQtc3ViaGVhZGluZy0xLCAubWF0LXR5cG9ncmFwaHkgaDQge1xuICBmb250OiA0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDUsIC5tYXQtdHlwb2dyYXBoeSBoNSB7XG4gIGZvbnQ6IDQwMCAxMS42MnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIG1hcmdpbjogMCAwIDEycHg7IH1cblxuLm1hdC1oNiwgLm1hdC10eXBvZ3JhcGh5IGg2IHtcbiAgZm9udDogNDAwIDkuMzhweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxMnB4OyB9XG5cbi5tYXQtYm9keS1zdHJvbmcsIC5tYXQtYm9keS0yIHtcbiAgZm9udDogNTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWJvZHksIC5tYXQtYm9keS0xLCAubWF0LXR5cG9ncmFwaHkge1xuICBmb250OiA0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG4gIC5tYXQtYm9keSBwLCAubWF0LWJvZHktMSBwLCAubWF0LXR5cG9ncmFwaHkgcCB7XG4gICAgbWFyZ2luOiAwIDAgMTJweDsgfVxuXG4ubWF0LXNtYWxsLCAubWF0LWNhcHRpb24ge1xuICBmb250OiA0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtZGlzcGxheS00LCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTQge1xuICBmb250OiAzMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIG1hcmdpbjogMCAwIDU2cHg7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wNWVtOyB9XG5cbi5tYXQtZGlzcGxheS0zLCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTMge1xuICBmb250OiA0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCA2NHB4O1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsgfVxuXG4ubWF0LWRpc3BsYXktMiwgLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0yIHtcbiAgZm9udDogNDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwIDAgNjRweDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAwNWVtOyB9XG5cbi5tYXQtZGlzcGxheS0xLCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTEge1xuICBmb250OiA0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCA2NHB4OyB9XG5cbi5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lciB7XG4gIGZvbnQ6IDQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1idXR0b24sIC5tYXQtcmFpc2VkLWJ1dHRvbiwgLm1hdC1pY29uLWJ1dHRvbiwgLm1hdC1zdHJva2VkLWJ1dHRvbixcbi5tYXQtZmxhdC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtY2FyZCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWNhcmQtdGl0bGUge1xuICBmb250LXNpemU6IDI0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1jYXJkLWhlYWRlciAubWF0LWNhcmQtdGl0bGUge1xuICBmb250LXNpemU6IDIwcHg7IH1cblxuLm1hdC1jYXJkLXN1YnRpdGxlLFxuLm1hdC1jYXJkLWNvbnRlbnQge1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1jaGVja2JveCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7IH1cblxuLm1hdC1jaGlwIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNTAwOyB9XG4gIC5tYXQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbixcbiAgLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb24ge1xuICAgIGZvbnQtc2l6ZTogMThweDsgfVxuXG4ubWF0LXRhYmxlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtaGVhZGVyLWNlbGwge1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1jZWxsLCAubWF0LWZvb3Rlci1jZWxsIHtcbiAgZm9udC1zaXplOiAxNHB4OyB9XG5cbi5tYXQtY2FsZW5kYXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5IHtcbiAgZm9udC1zaXplOiAxM3B4OyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCxcbi5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aCB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LWRpYWxvZy10aXRsZSB7XG4gIGZvbnQ6IDUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudCB7XG4gIGZvbnQ6IDQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1mb3JtLWZpZWxkIHtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBmb250LXdlaWdodDogNDAwO1xuICBsaW5lLWhlaWdodDogMS4xMjU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtd3JhcHBlciB7XG4gIHBhZGRpbmctYm90dG9tOiAxLjM0Mzc1ZW07IH1cblxuLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sXG4ubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbiB7XG4gIGZvbnQtc2l6ZTogMTUwJTtcbiAgbGluZS1oZWlnaHQ6IDEuMTI1OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbixcbi5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiB7XG4gIGhlaWdodDogMS41ZW07XG4gIHdpZHRoOiAxLjVlbTsgfVxuICAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLFxuICAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uIHtcbiAgICBoZWlnaHQ6IDEuMTI1ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMTI1OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG4gIGJvcmRlci10b3A6IDAuODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzMzMzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIHtcbiAgdG9wOiAtMC44NDM3NWVtO1xuICBwYWRkaW5nLXRvcDogMC44NDM3NWVtOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gIHRvcDogMS4zNDM3NWVtOyB9XG5cbi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBib3R0b206IDEuMzQzNzVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xuICBmb250LXNpemU6IDc1JTtcbiAgbWFyZ2luLXRvcDogMC42NjY2NjY2N2VtO1xuICB0b3A6IGNhbGMoMTAwJSAtIDEuNzkxNjY2NjdlbSk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVyIHtcbiAgcGFkZGluZy1ib3R0b206IDEuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgcGFkZGluZzogMC40Mzc1ZW0gMDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzMzMzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzM1MzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdG9wOiAxLjI4MTI1ZW07IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBib3R0b206IDEuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcbiAgbWFyZ2luLXRvcDogMC41NDE2NjY2N2VtO1xuICB0b3A6IGNhbGMoMTAwJSAtIDEuNjY2NjY2NjdlbSk7IH1cblxuQG1lZGlhIHByaW50IHtcbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSk7IH1cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbDotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpOyB9XG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSk7IH0gfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gIHBhZGRpbmc6IDAuMjVlbSAwIDAuNzVlbSAwOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdG9wOiAxLjA5Mzc1ZW07XG4gIG1hcmdpbi10b3A6IC0wLjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzMzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgcGFkZGluZzogMWVtIDAgMWVtIDA7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0b3A6IDEuODQzNzVlbTtcbiAgbWFyZ2luLXRvcDogLTAuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzMzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZ3JpZC10aWxlLWhlYWRlcixcbi5tYXQtZ3JpZC10aWxlLWZvb3RlciB7XG4gIGZvbnQtc2l6ZTogMTRweDsgfVxuICAubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lLFxuICAubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIC5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksXG4gICAgLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDEycHg7IH1cblxuaW5wdXQubWF0LWlucHV0LWVsZW1lbnQge1xuICBtYXJnaW4tdG9wOiAtMC4wNjI1ZW07IH1cblxuLm1hdC1tZW51LWl0ZW0ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LXBhZ2luYXRvcixcbi5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEycHg7IH1cblxuLm1hdC1yYWRpby1idXR0b24ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1zZWxlY3Qge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1zZWxlY3QtdHJpZ2dlciB7XG4gIGhlaWdodDogMS4xMjVlbTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LXN0ZXBwZXItdmVydGljYWwsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc3RlcC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yIHtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfVxuXG4ubWF0LXN0ZXAtbGFiZWwtZXJyb3Ige1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNTAwOyB9XG5cbi5tYXQtdGFiLWdyb3VwIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1saW5rIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC10b29sYmFyLFxuLm1hdC10b29sYmFyIGgxLFxuLm1hdC10b29sYmFyIGgyLFxuLm1hdC10b29sYmFyIGgzLFxuLm1hdC10b29sYmFyIGg0LFxuLm1hdC10b29sYmFyIGg1LFxuLm1hdC10b29sYmFyIGg2IHtcbiAgZm9udDogNTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwOyB9XG5cbi5tYXQtdG9vbHRpcCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBwYWRkaW5nLXRvcDogNnB4O1xuICBwYWRkaW5nLWJvdHRvbTogNnB4OyB9XG5cbi5tYXQtdG9vbHRpcC1oYW5kc2V0IHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4OyB9XG5cbi5tYXQtbGlzdC1pdGVtIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtbGlzdC1vcHRpb24ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0ge1xuICBmb250LXNpemU6IDE2cHg7IH1cbiAgLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIC5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTZweDsgfVxuICAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0ge1xuICBmb250LXNpemU6IDEycHg7IH1cbiAgLm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICAubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTJweDsgfVxuICAubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG4gICAgLm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1zdWJoZWFkZXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LW9wdGlvbiB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNnB4OyB9XG5cbi5tYXQtb3B0Z3JvdXAtbGFiZWwge1xuICBmb250OiA1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc2ltcGxlLXNuYWNrYmFyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC10cmVlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtdHJlZS1ub2RlLFxuLm1hdC1uZXN0ZWQtdHJlZS1ub2RlIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zaXplOiAxNHB4OyB9XG5cbi5tYXQtcmlwcGxlIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cblxuLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSwgdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfVxuICBAbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7IH0gfVxuXG4uY2RrLXZpc3VhbGx5LWhpZGRlbiB7XG4gIGJvcmRlcjogMDtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xuICBvdXRsaW5lOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTsgfVxuXG4uY2RrLW92ZXJsYXktY29udGFpbmVyLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlOyB9XG5cbi5jZGstb3ZlcmxheS1jb250YWluZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDEwMDA7IH1cbiAgLmNkay1vdmVybGF5LWNvbnRhaW5lcjplbXB0eSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuXG4uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwMDA7IH1cblxuLmNkay1vdmVybGF5LXBhbmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1heC1oZWlnaHQ6IDEwMCU7IH1cblxuLmNkay1vdmVybGF5LWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO1xuICBvcGFjaXR5OiAwOyB9XG4gIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICBvcGFjaXR5OiAxOyB9XG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICAgICAgb3BhY2l0eTogMC42OyB9IH1cblxuLmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3Age1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOyB9XG5cbi5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcge1xuICBvcGFjaXR5OiAwOyB9XG5cbi5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBtaW4td2lkdGg6IDFweDtcbiAgbWluLWhlaWdodDogMXB4OyB9XG5cbi5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsOyB9XG5cbkBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQge1xuICAvKiEqLyB9XG5cbkBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIHtcbiAgLyohKi8gfVxuXG4uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGwge1xuICBhbmltYXRpb24tbmFtZTogY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7IH1cblxuLmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZDsgfVxuXG50ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUge1xuICByZXNpemU6IG5vbmU7IH1cblxudGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZyB7XG4gIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmc6IDJweCAwICFpbXBvcnRhbnQ7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7IH1cblxuLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKTsgfVxuXG4ubWF0LW9wdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG4gIC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCkge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7IH1cbiAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuICAubWF0LW9wdGlvbi5tYXQtYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG4gIC5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWQge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94IHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cbiAgLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVyIHtcbiAgICBjb2xvcjogI2ZhZmFmYTsgfVxuXG4ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gIGNvbG9yOiAjYjBiMGIwOyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsXG4ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLFxuLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxcbi5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjYzQxMDYxOyB9XG5cbi5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjNWUzNWIxOyB9XG5cbi5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCxcbi5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6ICNiMGIwYjA7IH1cblxuLm1hdC1lbGV2YXRpb24tejAge1xuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejEge1xuICBib3gtc2hhZG93OiAwcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyIHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MyB7XG4gIGJveC1zaGFkb3c6IDBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejQge1xuICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16NSB7XG4gIGJveC1zaGFkb3c6IDBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo2IHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo3IHtcbiAgYm94LXNoYWRvdzogMHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo4IHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo5IHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxMCB7XG4gIGJveC1zaGFkb3c6IDBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejExIHtcbiAgYm94LXNoYWRvdzogMHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MTIge1xuICBib3gtc2hhZG93OiAwcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxMyB7XG4gIGJveC1zaGFkb3c6IDBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejE0IHtcbiAgYm94LXNoYWRvdzogMHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MTUge1xuICBib3gtc2hhZG93OiAwcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxNiB7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxNyB7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxOCB7XG4gIGJveC1zaGFkb3c6IDBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxOSB7XG4gIGJveC1zaGFkb3c6IDBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyMCB7XG4gIGJveC1zaGFkb3c6IDBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MjEge1xuICBib3gtc2hhZG93OiAwcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejIyIHtcbiAgYm94LXNoYWRvdzogMHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyMyB7XG4gIGJveC1zaGFkb3c6IDBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MjQge1xuICBib3gtc2hhZG93OiAwcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1hcHAtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlciB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLm1hdC1hdXRvY29tcGxldGUtcGFuZWwge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcikge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlOyB9XG4gICAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWJhZGdlLWNvbnRlbnQge1xuICBjb2xvcjogd2hpdGU7XG4gIGJhY2tncm91bmQ6ICM1ZTM1YjE7IH1cbiAgQG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIG91dGxpbmU6IHNvbGlkIDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7IH0gfVxuXG4ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjYzQxMDYxO1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgYmFja2dyb3VuZDogI2Y0NDMzNjsgfVxuXG4ubWF0LWJhZGdlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjYjliOWI5O1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWJhZGdlLWNvbnRlbnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTZweDsgfVxuXG4ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB0b3A6IC04cHg7IH1cblxuLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgYm90dG9tOiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiAtMTZweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogYXV0bztcbiAgcmlnaHQ6IC0xNnB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMTZweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnQge1xuICByaWdodDogYXV0bztcbiAgbGVmdDogLTE2cHg7IH1cblxuLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IC04cHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IGF1dG87XG4gIHJpZ2h0OiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtOHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiBhdXRvO1xuICBsZWZ0OiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGxpbmUtaGVpZ2h0OiAyMnB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB0b3A6IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBib3R0b206IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogLTIycHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTIycHg7IH1cblxuLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMjJweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IGF1dG87XG4gIGxlZnQ6IC0yMnB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogLTExcHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTExcHg7IH1cblxuLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMTFweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IGF1dG87XG4gIGxlZnQ6IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgd2lkdGg6IDI4cHg7XG4gIGhlaWdodDogMjhweDtcbiAgbGluZS1oZWlnaHQ6IDI4cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgdG9wOiAtMTRweDsgfVxuXG4ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBib3R0b206IC0xNHB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiAtMjhweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogYXV0bztcbiAgcmlnaHQ6IC0yOHB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMjhweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnQge1xuICByaWdodDogYXV0bztcbiAgbGVmdDogLTI4cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IC0xNHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTE0cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IC0xNHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiBhdXRvO1xuICBsZWZ0OiAtMTRweDsgfVxuXG4ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXIge1xuICBib3gtc2hhZG93OiAwcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtYnV0dG9uLCAubWF0LWljb24tYnV0dG9uLCAubWF0LXN0cm9rZWQtYnV0dG9uIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4gIC5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5IHtcbiAgICBjb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtYWNjZW50LCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCB7XG4gICAgY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1idXR0b24ubWF0LXdhcm4sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4ge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG4gIC5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cbiAgLm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIG9wYWNpdHk6IDAuMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7IH1cblxuLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gIGJhY2tncm91bmQ6IGJsYWNrOyB9XG5cbi5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZmxhdC1idXR0b24sIC5tYXQtcmFpc2VkLWJ1dHRvbiwgLm1hdC1mYWIsIC5tYXQtbWluaS1mYWIge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWZhYi5tYXQtcHJpbWFyeSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSB7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtZmFiLm1hdC1hY2NlbnQsIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCB7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwgLm1hdC1mYWIubWF0LXdhcm4sIC5tYXQtbWluaS1mYWIubWF0LXdhcm4ge1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWZhYi5tYXQtcHJpbWFyeSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LCAubWF0LWZhYi5tYXQtYWNjZW50LCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLCAubWF0LWZhYi5tYXQtd2FybiwgLm1hdC1taW5pLWZhYi5tYXQtd2FybiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyB9XG5cbi5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSwgLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LXJhaXNlZC1idXR0b246bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWZhYjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pLCAubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICBib3gtc2hhZG93OiAwcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pLCAubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gIGJveC1zaGFkb3c6IDBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAge1xuICBib3gtc2hhZG93OiAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gIGJveC1zaGFkb3c6IG5vbmU7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cbiAgLm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7XG4gIGJhY2tncm91bmQ6IHdoaXRlOyB9XG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICBib3JkZXItbGVmdDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlICsgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gIGJvcmRlci1yaWdodDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlICsgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gIGJvcmRlci1yaWdodDogbm9uZTtcbiAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxuICAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsgfVxuICAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7IH1cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxcbi5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgYm9yZGVyOiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWNhcmQge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1jYXJkOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICAgIGJveC1zaGFkb3c6IDBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1jYXJkLm1hdC1jYXJkLWZsYXQ6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtY2FyZC1zdWJ0aXRsZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2hlY2tib3gtZnJhbWUge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1jaGVja2JveC1jaGVja21hcmsge1xuICBmaWxsOiAjZmFmYWZhOyB9XG5cbi5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgge1xuICBzdHJva2U6ICNmYWZhZmEgIWltcG9ydGFudDsgfVxuICBAbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBibGFjay1vbi13aGl0ZSkge1xuICAgIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgge1xuICAgICAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7IH0gfVxuXG4ubWF0LWNoZWNrYm94LW1peGVkbWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7IH1cblxuLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNiMGIwYjA7IH1cblxuLm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1lIHtcbiAgYm9yZGVyLWNvbG9yOiAjYjBiMGIwOyB9XG5cbi5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbkBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSkge1xuICAubWF0LWNoZWNrYm94LWRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7IH0gfVxuXG5AbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lOyB9IH1cblxuLm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWNoZWNrYm94Om5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmUge1xuICAgIGJveC1zaGFkb3c6IDBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuNTQ7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjQ7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlciB7XG4gICAgYmFja2dyb3VuZDogYmxhY2s7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3ZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3ZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxO1xuICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZSB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIG9wYWNpdHk6IDAuNDsgfVxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC10YWJsZSB7XG4gIGJhY2tncm91bmQ6IHdoaXRlOyB9XG5cbi5tYXQtdGFibGUgdGhlYWQsIC5tYXQtdGFibGUgdGJvZHksIC5tYXQtdGFibGUgdGZvb3QsXG5tYXQtaGVhZGVyLXJvdywgbWF0LXJvdywgbWF0LWZvb3Rlci1yb3csXG5bbWF0LWhlYWRlci1yb3ddLCBbbWF0LXJvd10sIFttYXQtZm9vdGVyLXJvd10sXG4ubWF0LXRhYmxlLXN0aWNreSB7XG4gIGJhY2tncm91bmQ6IGluaGVyaXQ7IH1cblxubWF0LXJvdywgbWF0LWhlYWRlci1yb3csIG1hdC1mb290ZXItcm93LFxudGgubWF0LWhlYWRlci1jZWxsLCB0ZC5tYXQtY2VsbCwgdGQubWF0LWZvb3Rlci1jZWxsIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWhlYWRlci1jZWxsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1jZWxsLCAubWF0LWZvb3Rlci1jZWxsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1jYWxlbmRhci1hcnJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1kYXRlcGlja2VyLXRvZ2dsZSxcbi5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b24sXG4ubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXIge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxuXG4ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLFxuLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLFxuLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDQpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCkge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xOCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoOTQsIDUzLCAxNzcsIDAuNCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHdoaXRlOyB9XG5cbi5tYXQtZGF0ZXBpY2tlci1jb250ZW50IHtcbiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTtcbiAgICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTk2LCAxNiwgOTcsIDAuNCk7IH1cbiAgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB3aGl0ZTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDQsIDY3LCA1NCwgMC40KTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB3aGl0ZTsgfVxuXG4ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaCB7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnQge1xuICAgIGNvbG9yOiAjYzQxMDYxOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuIHtcbiAgICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBib3gtc2hhZG93OiAwcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWRpdmlkZXIge1xuICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZGl2aWRlci12ZXJ0aWNhbCB7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbCB7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgICBib3gtc2hhZG93OiAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYWN0aW9uLXJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSkuY2RrLWtleWJvYXJkLWZvY3VzZWQsIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pLmNkay1wcm9ncmFtLWZvY3VzZWQsIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG5AbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSlcbi5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7IH0gfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sXG4ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjYpOyB9XG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPSd0cnVlJ10gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLFxuICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiB7XG4gICAgY29sb3I6IGluaGVyaXQ7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsgfVxuXG4ubWF0LWhpbnQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnQge1xuICAgIGNvbG9yOiAjYzQxMDYxOyB9XG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm4ge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWUzNWIxOyB9XG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVyIHtcbiAgY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudCxcbiAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZXJyb3Ige1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtaGludCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0cHggMTAwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDIpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7XG4gIGJhY2tncm91bmQtc2l6ZTogNHB4IDEwMCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDYpOyB9XG5cbi5tYXQtaWNvbi5tYXQtcHJpbWFyeSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtaWNvbi5tYXQtYWNjZW50IHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC1pY29uLm1hdC13YXJuIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxcbi5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWlucHV0LWVsZW1lbnQge1xuICBjYXJldC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxuICAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDIpOyB9XG4gIC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cbiAgLm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgY2FyZXQtY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxcbi5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudCB7XG4gIGNhcmV0LWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1saXN0LWl0ZW0tZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyB9XG5cbi5tYXQtbGlzdC1vcHRpb246aG92ZXIsIC5tYXQtbGlzdC1vcHRpb246Zm9jdXMsXG4ubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLFxuLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cyxcbi5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsXG4ubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3VzIHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG4ubWF0LW1lbnUtcGFuZWwge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTsgfVxuICAubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1tZW51LWl0ZW0ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVyIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsXG4ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLFxuLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksXG4ubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksXG4ubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSkge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cblxuLm1hdC1wYWdpbmF0b3IsXG4ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlciB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxcbi5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpO1xuICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxcbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCxcbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgZmlsbDogI2NmYzJlODsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2ZjMmU4OyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICBmaWxsOiAjZWRiN2QwOyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VkYjdkMDsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgZmlsbDogI2ZmY2RkMjsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjZGQyOyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLCAubWF0LXNwaW5uZXIgY2lyY2xlIHtcbiAgc3Ryb2tlOiAjNWUzNWIxOyB9XG5cbi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlIHtcbiAgc3Ryb2tlOiAjYzQxMDYxOyB9XG5cbi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGUsIC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGUge1xuICBzdHJva2U6ICNmNDQzMzY7IH1cblxuLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeTphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQ6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlIHtcbiAgYm9yZGVyLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm46YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LXNlbGVjdC12YWx1ZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtdmFsdWUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNlbGVjdC1hcnJvdyB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtc2VsZWN0LXBhbmVsIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cbiAgLm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSkge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93IHtcbiAgY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93IHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWRyYXdlci1jb250YWluZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWRyYXdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2gge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1zaWRlKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1kcmF3ZXItc2lkZSB7XG4gIGJvcmRlci1yaWdodDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZCB7XG4gICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWRyYXdlci1zaWRlIHtcbiAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBib3JkZXItcmlnaHQ6IG5vbmU7IH1cbiAgW2Rpcj0ncnRsJ10gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZCB7XG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5NiwgMTYsIDk3LCAwLjU0KTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg5NCwgNTMsIDE3NywgMC41NCk7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ0LCA2NywgNTQsIDAuNTQpOyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWNoZWNrZWQpIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gIGJveC1zaGFkb3c6IDBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuXG4ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbi5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYixcbi5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbi5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLFxuLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsXG4ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0IHtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5NiwgMTYsIDk3LCAwLjIpOyB9XG5cbi5tYXQtc2xpZGVyOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsXG4uY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCxcbi5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItZGlzYWJsZWQ6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsXG4ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLFxuLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuXG4ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXIge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTsgfVxuXG4ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpOyB9XG5cbi5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCwgLm1hdC1zdGVwLWhlYWRlcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNCk7IH1cblxuQG1lZGlhIChob3Zlcjogbm9uZSkge1xuICAubWF0LXN0ZXAtaGVhZGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lOyB9IH1cblxuLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtbGFiZWwsXG4ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpO1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCxcbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZSxcbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1zdGVwcGVyLWhvcml6b250YWwsIC5tYXQtc3RlcHBlci12ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lOjpiZWZvcmUge1xuICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSxcbi5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YWZ0ZXIsXG4ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LXNvcnQtaGVhZGVyLWFycm93IHtcbiAgY29sb3I6ICM3NTc1NzU7IH1cblxuLm1hdC10YWItbmF2LWJhcixcbi5tYXQtdGFiLWhlYWRlciB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLFxuLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBib3JkZXItYm90dG9tOiBub25lOyB9XG5cbi5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1saW5rIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC10YWItZ3JvdXBbY2xhc3MqPSdtYXQtYmFja2dyb3VuZC0nXSAubWF0LXRhYi1oZWFkZXIsXG4ubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICBib3JkZXItdG9wOiBub25lOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMDcsIDE5NCwgMjMyLCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzcsIDE4MywgMjA4LCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjA1LCAyMTAsIDAuMyk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwNywgMTk0LCAyMzIsIDAuMyk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3MsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rIHtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzcsIDE4MywgMjA4LCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsge1xuICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiB7XG4gIGJvcmRlci1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDIwNSwgMjEwLCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtzLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluaywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluayB7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IH1cblxuLm1hdC10b29sYmFyIHtcbiAgYmFja2dyb3VuZDogd2hpdGVzbW9rZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC10b29sYmFyLm1hdC1wcmltYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiAjNWUzNWIxO1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRvb2xiYXIubWF0LWFjY2VudCB7XG4gICAgYmFja2dyb3VuZDogI2M0MTA2MTtcbiAgICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC10b29sYmFyLm1hdC13YXJuIHtcbiAgICBiYWNrZ3JvdW5kOiAjZjQ0MzM2O1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSxcbiAgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4gIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yOyB9XG4gIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsXG4gIC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC1hcnJvdyxcbiAgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgY29sb3I6IGluaGVyaXQ7IH1cbiAgLm1hdC10b29sYmFyIC5tYXQtaW5wdXQtZWxlbWVudCB7XG4gICAgY2FyZXQtY29sb3I6IGN1cnJlbnRDb2xvcjsgfVxuXG4ubWF0LXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDk3LCA5NywgOTcsIDAuOSk7IH1cblxuLm1hdC10cmVlIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cblxuLm1hdC10cmVlLW5vZGUsXG4ubWF0LW5lc3RlZC10cmVlLW5vZGUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LXNuYWNrLWJhci1jb250YWluZXIge1xuICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICBiYWNrZ3JvdW5kOiAjMzIzMjMyO1xuICBib3gtc2hhZG93OiAwcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLyogVmVyaWx5IGJyYW5kaW5nIGJhc2ljcyAqL1xuKiB7XG4gIGZvbnQtZmFtaWx5OiAnV29yayBTYW5zJywgc2Fucy1zZXJpZjsgfVxuXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucyc7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgc3JjOiBsb2NhbChcIk1hdGVyaWFsIEljb25zXCIpLCBsb2NhbChcIk1hdGVyaWFsSWNvbnMtUmVndWxhclwiKSwgdXJsKC4vYXNzZXRzL21hdGVyaWFsX2ljb25zL01hdGVyaWFsSWNvbnMtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpOyB9XG5cbi5tYXRlcmlhbC1pY29ucyB7XG4gIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgLyogUHJlZmVycmVkIGljb24gc2l6ZSAqL1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgd29yZC13cmFwOiBub3JtYWw7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGRpcmVjdGlvbjogbHRyO1xuICAvKiBTdXBwb3J0IGZvciBhbGwgV2ViS2l0IGJyb3dzZXJzLiAqL1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLyogU3VwcG9ydCBmb3IgU2FmYXJpIGFuZCBDaHJvbWUuICovXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIC8qIFN1cHBvcnQgZm9yIElFLiAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6ICdsaWdhJzsgfVxuXG4vKiBBZGRlZCBmb3IgbmcyLWRyYWd1bGEgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZzItZHJhZ3VsYSAqL1xuLyogaW4tZmxpZ2h0IGNsb25lICovXG4uZ3UtbWlycm9yIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0xMDApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApO1xuICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsgfVxuXG4vKiBoaWdoLXBlcmZvcm1hbmNlIGRpc3BsYXk6bm9uZTsgaGVscGVyICovXG4uZ3UtaGlkZSB7XG4gIGxlZnQ6IC05OTk5cHggIWltcG9ydGFudDsgfVxuXG4vKiBhZGRlZCB0byBtaXJyb3JDb250YWluZXIgKGRlZmF1bHQgPSBib2R5KSB3aGlsZSBkcmFnZ2luZyAqL1xuLmd1LXVuc2VsZWN0YWJsZSB7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgY3Vyc29yOiBncmFiYmluZyAhaW1wb3J0YW50O1xuICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7XG4gIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsgfVxuXG4vKiBhZGRlZCB0byB0aGUgc291cmNlIGVsZW1lbnQgd2hpbGUgaXRzIG1pcnJvciBpcyBkcmFnZ2VkICovXG4uZ3UtdHJhbnNpdCB7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MjApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7XG4gIG9wYWNpdHk6IDAuMjsgfVxuXG4ubWF0LWFwcC1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDtcbiAgLyogR3JleSA5MDAgKi8gfVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwcHg7IH1cbiJdfQ== */", '', '']] /***/ }), @@ -598,11 +598,11 @@ if(false) {} /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { -__webpack_require__(/*! /usr/local/google/home/laurendukes/charmander-bch/medtimeline/src/styles.scss */"./src/styles.scss"); -module.exports = __webpack_require__(/*! /usr/local/google/home/laurendukes/charmander-bch/medtimeline/node_modules/dragula/dist/dragula.css */"./node_modules/dragula/dist/dragula.css"); +__webpack_require__(/*! /usr/local/google/home/hmulholland/Code/bch/medtimeline/src/styles.scss */"./src/styles.scss"); +module.exports = __webpack_require__(/*! /usr/local/google/home/hmulholland/Code/bch/medtimeline/node_modules/dragula/dist/dragula.css */"./node_modules/dragula/dist/dragula.css"); /***/ }) },[[2,"runtime"]]]); -//# sourceMappingURL=styles.js.map +//# sourceMappingURL=styles.js.map \ No newline at end of file diff --git a/docs/styles.js.map b/docs/styles.js.map index 805b63e5..20a5d6f2 100644 --- a/docs/styles.js.map +++ b/docs/styles.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./node_modules/dragula/dist/dragula.css","webpack:///./src/styles.scss","webpack:///./node_modules/dragula/dist/dragula.css?8ade","webpack:///./node_modules/style-loader/lib/addStyles.js","webpack:///./node_modules/style-loader/lib/urls.js","webpack:///./src/styles.scss?4266"],"names":[],"mappings":"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A;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,uDAAQ;;AAE9B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAiB,mBAAmB;AACpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA,mBAAmB,2BAA2B;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA;;AAEA;AACA;;AAEA,iBAAiB,2BAA2B;AAC5C;AACA;;AAEA,QAAQ,uBAAuB;AAC/B;AACA;AACA,GAAG;AACH;;AAEA,iBAAiB,uBAAuB;AACxC;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,cAAc;;AAEd,kDAAkD,sBAAsB;AACxE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA,KAAK,KAAwC,EAAE,EAE7C;;AAEF,QAAQ,sBAAiB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD;AACvD;;AAEA,6BAA6B,mBAAmB;;AAEhD;;AAEA;;AAEA;AACA;;;;;;;;;;;;;AC9YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,WAAW,EAAE;AACrD,wCAAwC,WAAW,EAAE;;AAErD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,sCAAsC;AACtC,GAAG;AACH;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;;;;;;;;;;;;ACvFA,cAAc,mBAAO,CAAC,4ZAA0N;;AAEhP,4CAA4C,QAAS;;AAErD;AACA;;;;AAIA,eAAe;;AAEf;AACA;;AAEA,aAAa,mBAAO,CAAC,mGAAgD;;AAErE;;AAEA,GAAG,KAAU,EAAE,E","file":"styles.js","sourcesContent":["module.exports = [[module.id, \".gu-mirror {\\n position: fixed !important;\\n margin: 0 !important;\\n z-index: 9999 !important;\\n opacity: 0.8;\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)\\\";\\n filter: alpha(opacity=80);\\n}\\n.gu-hide {\\n display: none !important;\\n}\\n.gu-unselectable {\\n -webkit-user-select: none !important;\\n -moz-user-select: none !important;\\n -ms-user-select: none !important;\\n user-select: none !important;\\n}\\n.gu-transit {\\n opacity: 0.2;\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)\\\";\\n filter: alpha(opacity=20);\\n}\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9kcmFndWxhL2Rpc3QvZHJhZ3VsYS5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSwwQkFBMEI7RUFDMUIsb0JBQW9CO0VBQ3BCLHdCQUF3QjtFQUN4QixZQUFZO0VBQ1osaUVBQWlFO0VBQ2pFLHlCQUF5QjtBQUMzQjtBQUNBO0VBQ0Usd0JBQXdCO0FBQzFCO0FBQ0E7RUFDRSxvQ0FBb0M7RUFDcEMsaUNBQWlDO0VBQ2pDLGdDQUFnQztFQUNoQyw0QkFBNEI7QUFDOUI7QUFDQTtFQUNFLFlBQVk7RUFDWixpRUFBaUU7RUFDakUseUJBQXlCO0FBQzNCIiwiZmlsZSI6Im5vZGVfbW9kdWxlcy9kcmFndWxhL2Rpc3QvZHJhZ3VsYS5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuZ3UtbWlycm9yIHtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICB6LWluZGV4OiA5OTk5ICFpbXBvcnRhbnQ7XG4gIG9wYWNpdHk6IDAuODtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT04MClcIjtcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTgwKTtcbn1cbi5ndS1oaWRlIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLmd1LXVuc2VsZWN0YWJsZSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgLW1vei11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICAtbXMtdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5ndS10cmFuc2l0IHtcbiAgb3BhY2l0eTogMC4yO1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTIwKVwiO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjApO1xufVxuIl19 */\", '', '']]","module.exports = [[module.id, \"\\n@import url(\\\"https://fonts.googleapis.com/css?family=Roboto+Mono\\\");\\n@import url(\\\"https://fonts.googleapis.com/css?family=Montserrat\\\");\\n@import url(\\\"https://fonts.googleapis.com/css?family=Work+Sans\\\");\\n/* Default Angular Material prebuilt theme. */\\n/* Theme for the ripple elements.*/\\n/* stylelint-disable material/no-prefixes */\\n/* stylelint-enable */\\n.mat-badge-content {\\n font-weight: 600;\\n font-size: 12px;\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-badge-small .mat-badge-content {\\n font-size: 6px; }\\n.mat-badge-large .mat-badge-content {\\n font-size: 24px; }\\n.mat-h1, .mat-headline, .mat-typography h1 {\\n font: 400 24px/32px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 16px; }\\n.mat-h2, .mat-title, .mat-typography h2 {\\n font: 500 20px/32px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 16px; }\\n.mat-h3, .mat-subheading-2, .mat-typography h3 {\\n font: 400 16px/28px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 16px; }\\n.mat-h4, .mat-subheading-1, .mat-typography h4 {\\n font: 400 15px/24px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 16px; }\\n.mat-h5, .mat-typography h5 {\\n font: 400 11.62px/20px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 12px; }\\n.mat-h6, .mat-typography h6 {\\n font: 400 9.38px/20px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 12px; }\\n.mat-body-strong, .mat-body-2 {\\n font: 500 14px/24px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-body, .mat-body-1, .mat-typography {\\n font: 400 14px/20px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-body p, .mat-body-1 p, .mat-typography p {\\n margin: 0 0 12px; }\\n.mat-small, .mat-caption {\\n font: 400 12px/20px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-display-4, .mat-typography .mat-display-4 {\\n font: 300 112px/112px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 56px;\\n letter-spacing: -0.05em; }\\n.mat-display-3, .mat-typography .mat-display-3 {\\n font: 400 56px/56px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 64px;\\n letter-spacing: -0.02em; }\\n.mat-display-2, .mat-typography .mat-display-2 {\\n font: 400 45px/48px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 64px;\\n letter-spacing: -0.005em; }\\n.mat-display-1, .mat-typography .mat-display-1 {\\n font: 400 34px/40px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0 0 64px; }\\n.mat-bottom-sheet-container {\\n font: 400 14px/20px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-button, .mat-raised-button, .mat-icon-button, .mat-stroked-button,\\n.mat-flat-button, .mat-fab, .mat-mini-fab {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 14px;\\n font-weight: 500; }\\n.mat-button-toggle {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-card {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-card-title {\\n font-size: 24px;\\n font-weight: 500; }\\n.mat-card-header .mat-card-title {\\n font-size: 20px; }\\n.mat-card-subtitle,\\n.mat-card-content {\\n font-size: 14px; }\\n.mat-checkbox {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-checkbox-layout .mat-checkbox-label {\\n line-height: 24px; }\\n.mat-chip {\\n font-size: 14px;\\n font-weight: 500; }\\n.mat-chip .mat-chip-trailing-icon.mat-icon,\\n .mat-chip .mat-chip-remove.mat-icon {\\n font-size: 18px; }\\n.mat-table {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-header-cell {\\n font-size: 12px;\\n font-weight: 500; }\\n.mat-cell, .mat-footer-cell {\\n font-size: 14px; }\\n.mat-calendar {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-calendar-body {\\n font-size: 13px; }\\n.mat-calendar-body-label,\\n.mat-calendar-period-button {\\n font-size: 14px;\\n font-weight: 500; }\\n.mat-calendar-table-header th {\\n font-size: 11px;\\n font-weight: 400; }\\n.mat-dialog-title {\\n font: 500 20px/32px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-expansion-panel-header {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 15px;\\n font-weight: 400; }\\n.mat-expansion-panel-content {\\n font: 400 14px/20px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-form-field {\\n font-size: inherit;\\n font-weight: 400;\\n line-height: 1.125;\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-form-field-wrapper {\\n padding-bottom: 1.34375em; }\\n.mat-form-field-prefix .mat-icon,\\n.mat-form-field-suffix .mat-icon {\\n font-size: 150%;\\n line-height: 1.125; }\\n.mat-form-field-prefix .mat-icon-button,\\n.mat-form-field-suffix .mat-icon-button {\\n height: 1.5em;\\n width: 1.5em; }\\n.mat-form-field-prefix .mat-icon-button .mat-icon,\\n .mat-form-field-suffix .mat-icon-button .mat-icon {\\n height: 1.125em;\\n line-height: 1.125; }\\n.mat-form-field-infix {\\n padding: 0.5em 0;\\n border-top: 0.84375em solid transparent; }\\n.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\\n.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\\n transform: translateY(-1.34375em) scale(0.75);\\n width: 133.33333333%; }\\n.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-1.34374em) scale(0.75);\\n width: 133.33334333%; }\\n.mat-form-field-label-wrapper {\\n top: -0.84375em;\\n padding-top: 0.84375em; }\\n.mat-form-field-label {\\n top: 1.34375em; }\\n.mat-form-field-underline {\\n bottom: 1.34375em; }\\n.mat-form-field-subscript-wrapper {\\n font-size: 75%;\\n margin-top: 0.66666667em;\\n top: calc(100% - 1.79166667em); }\\n.mat-form-field-appearance-legacy .mat-form-field-wrapper {\\n padding-bottom: 1.25em; }\\n.mat-form-field-appearance-legacy .mat-form-field-infix {\\n padding: 0.4375em 0; }\\n.mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.001px);\\n -ms-transform: translateY(-1.28125em) scale(0.75);\\n width: 133.33333333%; }\\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00101px);\\n -ms-transform: translateY(-1.28124em) scale(0.75);\\n width: 133.33334333%; }\\n.mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-1.28125em) scale(0.75) perspective(100px) translateZ(0.00102px);\\n -ms-transform: translateY(-1.28123em) scale(0.75);\\n width: 133.33335333%; }\\n.mat-form-field-appearance-legacy .mat-form-field-label {\\n top: 1.28125em; }\\n.mat-form-field-appearance-legacy .mat-form-field-underline {\\n bottom: 1.25em; }\\n.mat-form-field-appearance-legacy .mat-form-field-subscript-wrapper {\\n margin-top: 0.54166667em;\\n top: calc(100% - 1.66666667em); }\\n@media print {\\n .mat-form-field-appearance-legacy.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\\n transform: translateY(-1.28122em) scale(0.75); }\\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-1.28121em) scale(0.75); }\\n .mat-form-field-appearance-legacy.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-1.2812em) scale(0.75); } }\\n.mat-form-field-appearance-fill .mat-form-field-infix {\\n padding: 0.25em 0 0.75em 0; }\\n.mat-form-field-appearance-fill .mat-form-field-label {\\n top: 1.09375em;\\n margin-top: -0.5em; }\\n.mat-form-field-appearance-fill.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\\n transform: translateY(-0.59375em) scale(0.75);\\n width: 133.33333333%; }\\n.mat-form-field-appearance-fill.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-0.59374em) scale(0.75);\\n width: 133.33334333%; }\\n.mat-form-field-appearance-outline .mat-form-field-infix {\\n padding: 1em 0 1em 0; }\\n.mat-form-field-appearance-outline .mat-form-field-label {\\n top: 1.84375em;\\n margin-top: -0.25em; }\\n.mat-form-field-appearance-outline.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label,\\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server:focus + .mat-form-field-label-wrapper .mat-form-field-label {\\n transform: translateY(-1.59375em) scale(0.75);\\n width: 133.33333333%; }\\n.mat-form-field-appearance-outline.mat-form-field-can-float .mat-input-server[label]:not(:label-shown) + .mat-form-field-label-wrapper\\n.mat-form-field-label {\\n transform: translateY(-1.59374em) scale(0.75);\\n width: 133.33334333%; }\\n.mat-grid-tile-header,\\n.mat-grid-tile-footer {\\n font-size: 14px; }\\n.mat-grid-tile-header .mat-line,\\n .mat-grid-tile-footer .mat-line {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: block;\\n box-sizing: border-box; }\\n.mat-grid-tile-header .mat-line:nth-child(n+2),\\n .mat-grid-tile-footer .mat-line:nth-child(n+2) {\\n font-size: 12px; }\\ninput.mat-input-element {\\n margin-top: -0.0625em; }\\n.mat-menu-item {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 14px;\\n font-weight: 400; }\\n.mat-paginator,\\n.mat-paginator-page-size .mat-select-trigger {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 12px; }\\n.mat-radio-button {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-select {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-select-trigger {\\n height: 1.125em; }\\n.mat-slide-toggle-content {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-slider-thumb-label-text {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 12px;\\n font-weight: 500; }\\n.mat-stepper-vertical, .mat-stepper-horizontal {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-step-label {\\n font-size: 14px;\\n font-weight: 400; }\\n.mat-step-sub-label-error {\\n font-weight: normal; }\\n.mat-step-label-error {\\n font-size: 14px; }\\n.mat-step-label-selected {\\n font-size: 14px;\\n font-weight: 500; }\\n.mat-tab-group {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-tab-label, .mat-tab-link {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 14px;\\n font-weight: 500; }\\n.mat-toolbar,\\n.mat-toolbar h1,\\n.mat-toolbar h2,\\n.mat-toolbar h3,\\n.mat-toolbar h4,\\n.mat-toolbar h5,\\n.mat-toolbar h6 {\\n font: 500 20px/32px Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n margin: 0; }\\n.mat-tooltip {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 10px;\\n padding-top: 6px;\\n padding-bottom: 6px; }\\n.mat-tooltip-handset {\\n font-size: 14px;\\n padding-top: 8px;\\n padding-bottom: 8px; }\\n.mat-list-item {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-list-option {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-list-base .mat-list-item {\\n font-size: 16px; }\\n.mat-list-base .mat-list-item .mat-line {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: block;\\n box-sizing: border-box; }\\n.mat-list-base .mat-list-item .mat-line:nth-child(n+2) {\\n font-size: 14px; }\\n.mat-list-base .mat-list-option {\\n font-size: 16px; }\\n.mat-list-base .mat-list-option .mat-line {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: block;\\n box-sizing: border-box; }\\n.mat-list-base .mat-list-option .mat-line:nth-child(n+2) {\\n font-size: 14px; }\\n.mat-list-base .mat-subheader {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 14px;\\n font-weight: 500; }\\n.mat-list-base[dense] .mat-list-item {\\n font-size: 12px; }\\n.mat-list-base[dense] .mat-list-item .mat-line {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: block;\\n box-sizing: border-box; }\\n.mat-list-base[dense] .mat-list-item .mat-line:nth-child(n+2) {\\n font-size: 12px; }\\n.mat-list-base[dense] .mat-list-option {\\n font-size: 12px; }\\n.mat-list-base[dense] .mat-list-option .mat-line {\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n display: block;\\n box-sizing: border-box; }\\n.mat-list-base[dense] .mat-list-option .mat-line:nth-child(n+2) {\\n font-size: 12px; }\\n.mat-list-base[dense] .mat-subheader {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 12px;\\n font-weight: 500; }\\n.mat-option {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 16px; }\\n.mat-optgroup-label {\\n font: 500 14px/24px Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-simple-snackbar {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif;\\n font-size: 14px; }\\n.mat-simple-snackbar-action {\\n line-height: 1;\\n font-family: inherit;\\n font-size: inherit;\\n font-weight: 500; }\\n.mat-tree {\\n font-family: Roboto, \\\"Helvetica Neue\\\", sans-serif; }\\n.mat-tree-node,\\n.mat-nested-tree-node {\\n font-weight: 400;\\n font-size: 14px; }\\n.mat-ripple {\\n overflow: hidden;\\n position: relative; }\\n.mat-ripple.mat-ripple-unbounded {\\n overflow: visible; }\\n.mat-ripple-element {\\n position: absolute;\\n border-radius: 50%;\\n pointer-events: none;\\n transition: opacity, transform 0ms cubic-bezier(0, 0, 0.2, 1);\\n transform: scale(0); }\\n@media (-ms-high-contrast: active) {\\n .mat-ripple-element {\\n display: none; } }\\n.cdk-visually-hidden {\\n border: 0;\\n clip: rect(0 0 0 0);\\n height: 1px;\\n margin: -1px;\\n overflow: hidden;\\n padding: 0;\\n position: absolute;\\n width: 1px;\\n outline: 0;\\n -webkit-appearance: none;\\n -moz-appearance: none; }\\n.cdk-overlay-container, .cdk-global-overlay-wrapper {\\n pointer-events: none;\\n top: 0;\\n left: 0;\\n height: 100%;\\n width: 100%; }\\n.cdk-overlay-container {\\n position: fixed;\\n z-index: 1000; }\\n.cdk-overlay-container:empty {\\n display: none; }\\n.cdk-global-overlay-wrapper {\\n display: -ms-flexbox;\\n display: flex;\\n position: absolute;\\n z-index: 1000; }\\n.cdk-overlay-pane {\\n position: absolute;\\n pointer-events: auto;\\n box-sizing: border-box;\\n z-index: 1000;\\n display: -ms-flexbox;\\n display: flex;\\n max-width: 100%;\\n max-height: 100%; }\\n.cdk-overlay-backdrop {\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n left: 0;\\n right: 0;\\n z-index: 1000;\\n pointer-events: auto;\\n -webkit-tap-highlight-color: transparent;\\n transition: opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1);\\n opacity: 0; }\\n.cdk-overlay-backdrop.cdk-overlay-backdrop-showing {\\n opacity: 1; }\\n@media screen and (-ms-high-contrast: active) {\\n .cdk-overlay-backdrop.cdk-overlay-backdrop-showing {\\n opacity: 0.6; } }\\n.cdk-overlay-dark-backdrop {\\n background: rgba(0, 0, 0, 0.32); }\\n.cdk-overlay-transparent-backdrop, .cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing {\\n opacity: 0; }\\n.cdk-overlay-connected-position-bounding-box {\\n position: absolute;\\n z-index: 1000;\\n display: -ms-flexbox;\\n display: flex;\\n -ms-flex-direction: column;\\n flex-direction: column;\\n min-width: 1px;\\n min-height: 1px; }\\n.cdk-global-scrollblock {\\n position: fixed;\\n width: 100%;\\n overflow-y: scroll; }\\n@-webkit-keyframes cdk-text-field-autofill-start {\\n /*!*/ }\\n@keyframes cdk-text-field-autofill-start {\\n /*!*/ }\\n@-webkit-keyframes cdk-text-field-autofill-end {\\n /*!*/ }\\n@keyframes cdk-text-field-autofill-end {\\n /*!*/ }\\n.cdk-text-field-autofill-monitored:-webkit-autofill {\\n -webkit-animation-name: cdk-text-field-autofill-start;\\n animation-name: cdk-text-field-autofill-start; }\\n.cdk-text-field-autofill-monitored:not(:-webkit-autofill) {\\n -webkit-animation-name: cdk-text-field-autofill-end;\\n animation-name: cdk-text-field-autofill-end; }\\ntextarea.cdk-textarea-autosize {\\n resize: none; }\\ntextarea.cdk-textarea-autosize-measuring {\\n height: auto !important;\\n overflow: hidden !important;\\n padding: 2px 0 !important;\\n box-sizing: content-box !important; }\\n.mat-ripple-element {\\n background-color: rgba(0, 0, 0, 0.1); }\\n.mat-option {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-option:hover:not(.mat-option-disabled), .mat-option:focus:not(.mat-option-disabled) {\\n background: rgba(0, 0, 0, 0.04); }\\n.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled) {\\n background: rgba(0, 0, 0, 0.04); }\\n.mat-option.mat-active {\\n background: rgba(0, 0, 0, 0.04);\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-option.mat-option-disabled {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-primary .mat-option.mat-selected:not(.mat-option-disabled) {\\n color: #5e35b1; }\\n.mat-accent .mat-option.mat-selected:not(.mat-option-disabled) {\\n color: #c41061; }\\n.mat-warn .mat-option.mat-selected:not(.mat-option-disabled) {\\n color: #f44336; }\\n.mat-optgroup-label {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-optgroup-disabled .mat-optgroup-label {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-pseudo-checkbox {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-pseudo-checkbox::after {\\n color: #fafafa; }\\n.mat-pseudo-checkbox-disabled {\\n color: #b0b0b0; }\\n.mat-pseudo-checkbox-checked,\\n.mat-pseudo-checkbox-indeterminate,\\n.mat-accent .mat-pseudo-checkbox-checked,\\n.mat-accent .mat-pseudo-checkbox-indeterminate {\\n background: #c41061; }\\n.mat-primary .mat-pseudo-checkbox-checked,\\n.mat-primary .mat-pseudo-checkbox-indeterminate {\\n background: #5e35b1; }\\n.mat-warn .mat-pseudo-checkbox-checked,\\n.mat-warn .mat-pseudo-checkbox-indeterminate {\\n background: #f44336; }\\n.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,\\n.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled {\\n background: #b0b0b0; }\\n.mat-elevation-z0 {\\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z1 {\\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z2 {\\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z3 {\\n box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z4 {\\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z5 {\\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z6 {\\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z7 {\\n box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z8 {\\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z9 {\\n box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z10 {\\n box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z11 {\\n box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z12 {\\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z13 {\\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z14 {\\n box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z15 {\\n box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z16 {\\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z17 {\\n box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z18 {\\n box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z19 {\\n box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z20 {\\n box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z21 {\\n box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z22 {\\n box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z23 {\\n box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12); }\\n.mat-elevation-z24 {\\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); }\\n.mat-app-background {\\n background-color: #fafafa;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-theme-loaded-marker {\\n display: none; }\\n.mat-autocomplete-panel {\\n background: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-autocomplete-panel:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover) {\\n background: white; }\\n.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled) {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-badge-content {\\n color: white;\\n background: #5e35b1; }\\n@media (-ms-high-contrast: active) {\\n .mat-badge-content {\\n outline: solid 1px;\\n border-radius: 0; } }\\n.mat-badge-accent .mat-badge-content {\\n background: #c41061;\\n color: white; }\\n.mat-badge-warn .mat-badge-content {\\n color: white;\\n background: #f44336; }\\n.mat-badge {\\n position: relative; }\\n.mat-badge-hidden .mat-badge-content {\\n display: none; }\\n.mat-badge-disabled .mat-badge-content {\\n background: #b9b9b9;\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-badge-content {\\n position: absolute;\\n text-align: center;\\n display: inline-block;\\n border-radius: 50%;\\n transition: transform 200ms ease-in-out;\\n transform: scale(0.6);\\n overflow: hidden;\\n white-space: nowrap;\\n text-overflow: ellipsis;\\n pointer-events: none; }\\n.mat-badge-content.mat-badge-active {\\n transform: none; }\\n.mat-badge-small .mat-badge-content {\\n width: 16px;\\n height: 16px;\\n line-height: 16px; }\\n.mat-badge-small.mat-badge-above .mat-badge-content {\\n top: -8px; }\\n.mat-badge-small.mat-badge-below .mat-badge-content {\\n bottom: -8px; }\\n.mat-badge-small.mat-badge-before .mat-badge-content {\\n left: -16px; }\\n[dir='rtl'] .mat-badge-small.mat-badge-before .mat-badge-content {\\n left: auto;\\n right: -16px; }\\n.mat-badge-small.mat-badge-after .mat-badge-content {\\n right: -16px; }\\n[dir='rtl'] .mat-badge-small.mat-badge-after .mat-badge-content {\\n right: auto;\\n left: -16px; }\\n.mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content {\\n left: -8px; }\\n[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content {\\n left: auto;\\n right: -8px; }\\n.mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content {\\n right: -8px; }\\n[dir='rtl'] .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content {\\n right: auto;\\n left: -8px; }\\n.mat-badge-medium .mat-badge-content {\\n width: 22px;\\n height: 22px;\\n line-height: 22px; }\\n.mat-badge-medium.mat-badge-above .mat-badge-content {\\n top: -11px; }\\n.mat-badge-medium.mat-badge-below .mat-badge-content {\\n bottom: -11px; }\\n.mat-badge-medium.mat-badge-before .mat-badge-content {\\n left: -22px; }\\n[dir='rtl'] .mat-badge-medium.mat-badge-before .mat-badge-content {\\n left: auto;\\n right: -22px; }\\n.mat-badge-medium.mat-badge-after .mat-badge-content {\\n right: -22px; }\\n[dir='rtl'] .mat-badge-medium.mat-badge-after .mat-badge-content {\\n right: auto;\\n left: -22px; }\\n.mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content {\\n left: -11px; }\\n[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content {\\n left: auto;\\n right: -11px; }\\n.mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content {\\n right: -11px; }\\n[dir='rtl'] .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content {\\n right: auto;\\n left: -11px; }\\n.mat-badge-large .mat-badge-content {\\n width: 28px;\\n height: 28px;\\n line-height: 28px; }\\n.mat-badge-large.mat-badge-above .mat-badge-content {\\n top: -14px; }\\n.mat-badge-large.mat-badge-below .mat-badge-content {\\n bottom: -14px; }\\n.mat-badge-large.mat-badge-before .mat-badge-content {\\n left: -28px; }\\n[dir='rtl'] .mat-badge-large.mat-badge-before .mat-badge-content {\\n left: auto;\\n right: -28px; }\\n.mat-badge-large.mat-badge-after .mat-badge-content {\\n right: -28px; }\\n[dir='rtl'] .mat-badge-large.mat-badge-after .mat-badge-content {\\n right: auto;\\n left: -28px; }\\n.mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content {\\n left: -14px; }\\n[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content {\\n left: auto;\\n right: -14px; }\\n.mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content {\\n right: -14px; }\\n[dir='rtl'] .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content {\\n right: auto;\\n left: -14px; }\\n.mat-bottom-sheet-container {\\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);\\n background: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-button, .mat-icon-button, .mat-stroked-button {\\n color: inherit;\\n background: transparent; }\\n.mat-button.mat-primary, .mat-icon-button.mat-primary, .mat-stroked-button.mat-primary {\\n color: #5e35b1; }\\n.mat-button.mat-accent, .mat-icon-button.mat-accent, .mat-stroked-button.mat-accent {\\n color: #c41061; }\\n.mat-button.mat-warn, .mat-icon-button.mat-warn, .mat-stroked-button.mat-warn {\\n color: #f44336; }\\n.mat-button.mat-primary[disabled], .mat-button.mat-accent[disabled], .mat-button.mat-warn[disabled], .mat-button[disabled][disabled], .mat-icon-button.mat-primary[disabled], .mat-icon-button.mat-accent[disabled], .mat-icon-button.mat-warn[disabled], .mat-icon-button[disabled][disabled], .mat-stroked-button.mat-primary[disabled], .mat-stroked-button.mat-accent[disabled], .mat-stroked-button.mat-warn[disabled], .mat-stroked-button[disabled][disabled] {\\n color: rgba(0, 0, 0, 0.26); }\\n.mat-button.mat-primary .mat-button-focus-overlay, .mat-icon-button.mat-primary .mat-button-focus-overlay, .mat-stroked-button.mat-primary .mat-button-focus-overlay {\\n background-color: #5e35b1; }\\n.mat-button.mat-accent .mat-button-focus-overlay, .mat-icon-button.mat-accent .mat-button-focus-overlay, .mat-stroked-button.mat-accent .mat-button-focus-overlay {\\n background-color: #c41061; }\\n.mat-button.mat-warn .mat-button-focus-overlay, .mat-icon-button.mat-warn .mat-button-focus-overlay, .mat-stroked-button.mat-warn .mat-button-focus-overlay {\\n background-color: #f44336; }\\n.mat-button[disabled] .mat-button-focus-overlay, .mat-icon-button[disabled] .mat-button-focus-overlay, .mat-stroked-button[disabled] .mat-button-focus-overlay {\\n background-color: transparent; }\\n.mat-button .mat-ripple-element, .mat-icon-button .mat-ripple-element, .mat-stroked-button .mat-ripple-element {\\n opacity: 0.1;\\n background-color: currentColor; }\\n.mat-button-focus-overlay {\\n background: black; }\\n.mat-stroked-button:not([disabled]) {\\n border-color: rgba(0, 0, 0, 0.12); }\\n.mat-flat-button, .mat-raised-button, .mat-fab, .mat-mini-fab {\\n color: rgba(0, 0, 0, 0.87);\\n background-color: white; }\\n.mat-flat-button.mat-primary, .mat-raised-button.mat-primary, .mat-fab.mat-primary, .mat-mini-fab.mat-primary {\\n color: white; }\\n.mat-flat-button.mat-accent, .mat-raised-button.mat-accent, .mat-fab.mat-accent, .mat-mini-fab.mat-accent {\\n color: white; }\\n.mat-flat-button.mat-warn, .mat-raised-button.mat-warn, .mat-fab.mat-warn, .mat-mini-fab.mat-warn {\\n color: white; }\\n.mat-flat-button.mat-primary[disabled], .mat-flat-button.mat-accent[disabled], .mat-flat-button.mat-warn[disabled], .mat-flat-button[disabled][disabled], .mat-raised-button.mat-primary[disabled], .mat-raised-button.mat-accent[disabled], .mat-raised-button.mat-warn[disabled], .mat-raised-button[disabled][disabled], .mat-fab.mat-primary[disabled], .mat-fab.mat-accent[disabled], .mat-fab.mat-warn[disabled], .mat-fab[disabled][disabled], .mat-mini-fab.mat-primary[disabled], .mat-mini-fab.mat-accent[disabled], .mat-mini-fab.mat-warn[disabled], .mat-mini-fab[disabled][disabled] {\\n color: rgba(0, 0, 0, 0.26); }\\n.mat-flat-button.mat-primary, .mat-raised-button.mat-primary, .mat-fab.mat-primary, .mat-mini-fab.mat-primary {\\n background-color: #5e35b1; }\\n.mat-flat-button.mat-accent, .mat-raised-button.mat-accent, .mat-fab.mat-accent, .mat-mini-fab.mat-accent {\\n background-color: #c41061; }\\n.mat-flat-button.mat-warn, .mat-raised-button.mat-warn, .mat-fab.mat-warn, .mat-mini-fab.mat-warn {\\n background-color: #f44336; }\\n.mat-flat-button.mat-primary[disabled], .mat-flat-button.mat-accent[disabled], .mat-flat-button.mat-warn[disabled], .mat-flat-button[disabled][disabled], .mat-raised-button.mat-primary[disabled], .mat-raised-button.mat-accent[disabled], .mat-raised-button.mat-warn[disabled], .mat-raised-button[disabled][disabled], .mat-fab.mat-primary[disabled], .mat-fab.mat-accent[disabled], .mat-fab.mat-warn[disabled], .mat-fab[disabled][disabled], .mat-mini-fab.mat-primary[disabled], .mat-mini-fab.mat-accent[disabled], .mat-mini-fab.mat-warn[disabled], .mat-mini-fab[disabled][disabled] {\\n background-color: rgba(0, 0, 0, 0.12); }\\n.mat-flat-button.mat-primary .mat-ripple-element, .mat-raised-button.mat-primary .mat-ripple-element, .mat-fab.mat-primary .mat-ripple-element, .mat-mini-fab.mat-primary .mat-ripple-element {\\n background-color: rgba(255, 255, 255, 0.1); }\\n.mat-flat-button.mat-accent .mat-ripple-element, .mat-raised-button.mat-accent .mat-ripple-element, .mat-fab.mat-accent .mat-ripple-element, .mat-mini-fab.mat-accent .mat-ripple-element {\\n background-color: rgba(255, 255, 255, 0.1); }\\n.mat-flat-button.mat-warn .mat-ripple-element, .mat-raised-button.mat-warn .mat-ripple-element, .mat-fab.mat-warn .mat-ripple-element, .mat-mini-fab.mat-warn .mat-ripple-element {\\n background-color: rgba(255, 255, 255, 0.1); }\\n.mat-stroked-button:not([class*='mat-elevation-z']), .mat-flat-button:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\\n.mat-raised-button:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\\n.mat-raised-button:not([disabled]):active:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }\\n.mat-raised-button[disabled]:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\\n.mat-fab:not([class*='mat-elevation-z']), .mat-mini-fab:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\\n.mat-fab:not([disabled]):active:not([class*='mat-elevation-z']), .mat-mini-fab:not([disabled]):active:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }\\n.mat-fab[disabled]:not([class*='mat-elevation-z']), .mat-mini-fab[disabled]:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\\n.mat-button-toggle-standalone,\\n.mat-button-toggle-group {\\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\\n.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,\\n.mat-button-toggle-group-appearance-standard {\\n box-shadow: none; }\\n.mat-button-toggle {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-button-toggle .mat-button-toggle-focus-overlay {\\n background-color: rgba(0, 0, 0, 0.12); }\\n.mat-button-toggle-appearance-standard {\\n color: rgba(0, 0, 0, 0.87);\\n background: white; }\\n.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay {\\n background-color: black; }\\n.mat-button-toggle-group-appearance-standard .mat-button-toggle + .mat-button-toggle {\\n border-left: solid 1px rgba(0, 0, 0, 0.12); }\\n[dir='rtl'] .mat-button-toggle-group-appearance-standard .mat-button-toggle + .mat-button-toggle {\\n border-left: none;\\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\\n.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle + .mat-button-toggle {\\n border-left: none;\\n border-right: none;\\n border-top: solid 1px rgba(0, 0, 0, 0.12); }\\n.mat-button-toggle-checked {\\n background-color: #e0e0e0;\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-button-toggle-checked.mat-button-toggle-appearance-standard {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-button-toggle-disabled {\\n color: rgba(0, 0, 0, 0.26);\\n background-color: #eeeeee; }\\n.mat-button-toggle-disabled.mat-button-toggle-appearance-standard {\\n background: white; }\\n.mat-button-toggle-disabled.mat-button-toggle-checked {\\n background-color: #bdbdbd; }\\n.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,\\n.mat-button-toggle-group-appearance-standard {\\n border: solid 1px rgba(0, 0, 0, 0.12); }\\n.mat-card {\\n background: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-card:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }\\n.mat-card.mat-card-flat:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\\n.mat-card-subtitle {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-checkbox-frame {\\n border-color: rgba(0, 0, 0, 0.54); }\\n.mat-checkbox-checkmark {\\n fill: #fafafa; }\\n.mat-checkbox-checkmark-path {\\n stroke: #fafafa !important; }\\n@media (-ms-high-contrast: black-on-white) {\\n .mat-checkbox-checkmark-path {\\n stroke: #000 !important; } }\\n.mat-checkbox-mixedmark {\\n background-color: #fafafa; }\\n.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background, .mat-checkbox-checked.mat-primary .mat-checkbox-background {\\n background-color: #5e35b1; }\\n.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background, .mat-checkbox-checked.mat-accent .mat-checkbox-background {\\n background-color: #c41061; }\\n.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background, .mat-checkbox-checked.mat-warn .mat-checkbox-background {\\n background-color: #f44336; }\\n.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background, .mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background {\\n background-color: #b0b0b0; }\\n.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame {\\n border-color: #b0b0b0; }\\n.mat-checkbox-disabled .mat-checkbox-label {\\n color: rgba(0, 0, 0, 0.54); }\\n@media (-ms-high-contrast: active) {\\n .mat-checkbox-disabled {\\n opacity: 0.5; } }\\n@media (-ms-high-contrast: active) {\\n .mat-checkbox-background {\\n background: none; } }\\n.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element {\\n background-color: #5e35b1; }\\n.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element {\\n background-color: #c41061; }\\n.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element {\\n background-color: #f44336; }\\n.mat-chip.mat-standard-chip {\\n background-color: #e0e0e0;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-chip.mat-standard-chip .mat-chip-remove {\\n color: rgba(0, 0, 0, 0.87);\\n opacity: 0.4; }\\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled):active {\\n box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }\\n.mat-chip.mat-standard-chip:not(.mat-chip-disabled) .mat-chip-remove:hover {\\n opacity: 0.54; }\\n.mat-chip.mat-standard-chip.mat-chip-disabled {\\n opacity: 0.4; }\\n.mat-chip.mat-standard-chip::after {\\n background: black; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary {\\n background-color: #5e35b1;\\n color: white; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-chip-remove {\\n color: white;\\n opacity: 0.4; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-primary .mat-ripple-element {\\n background: rgba(255, 255, 255, 0.1); }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn {\\n background-color: #f44336;\\n color: white; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-chip-remove {\\n color: white;\\n opacity: 0.4; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-warn .mat-ripple-element {\\n background: rgba(255, 255, 255, 0.1); }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent {\\n background-color: #c41061;\\n color: white; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-chip-remove {\\n color: white;\\n opacity: 0.4; }\\n.mat-chip.mat-standard-chip.mat-chip-selected.mat-accent .mat-ripple-element {\\n background: rgba(255, 255, 255, 0.1); }\\n.mat-table {\\n background: white; }\\n.mat-table thead, .mat-table tbody, .mat-table tfoot,\\nmat-header-row, mat-row, mat-footer-row,\\n[mat-header-row], [mat-row], [mat-footer-row],\\n.mat-table-sticky {\\n background: inherit; }\\nmat-row, mat-header-row, mat-footer-row,\\nth.mat-header-cell, td.mat-cell, td.mat-footer-cell {\\n border-bottom-color: rgba(0, 0, 0, 0.12); }\\n.mat-header-cell {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-cell, .mat-footer-cell {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-calendar-arrow {\\n border-top-color: rgba(0, 0, 0, 0.54); }\\n.mat-datepicker-toggle,\\n.mat-datepicker-content .mat-calendar-next-button,\\n.mat-datepicker-content .mat-calendar-previous-button {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-calendar-table-header {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-calendar-table-header-divider::after {\\n background: rgba(0, 0, 0, 0.12); }\\n.mat-calendar-body-label {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-calendar-body-cell-content {\\n color: rgba(0, 0, 0, 0.87);\\n border-color: transparent; }\\n.mat-calendar-body-disabled > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected) {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected),\\n.cdk-keyboard-focused .mat-calendar-body-active > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected),\\n.cdk-program-focused .mat-calendar-body-active > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected) {\\n background-color: rgba(0, 0, 0, 0.04); }\\n.mat-calendar-body-today:not(.mat-calendar-body-selected) {\\n border-color: rgba(0, 0, 0, 0.38); }\\n.mat-calendar-body-disabled > .mat-calendar-body-today:not(.mat-calendar-body-selected) {\\n border-color: rgba(0, 0, 0, 0.18); }\\n.mat-calendar-body-selected {\\n background-color: #5e35b1;\\n color: white; }\\n.mat-calendar-body-disabled > .mat-calendar-body-selected {\\n background-color: rgba(94, 53, 177, 0.4); }\\n.mat-calendar-body-today.mat-calendar-body-selected {\\n box-shadow: inset 0 0 0 1px white; }\\n.mat-datepicker-content {\\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);\\n background-color: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-datepicker-content.mat-accent .mat-calendar-body-selected {\\n background-color: #c41061;\\n color: white; }\\n.mat-datepicker-content.mat-accent .mat-calendar-body-disabled > .mat-calendar-body-selected {\\n background-color: rgba(196, 16, 97, 0.4); }\\n.mat-datepicker-content.mat-accent .mat-calendar-body-today.mat-calendar-body-selected {\\n box-shadow: inset 0 0 0 1px white; }\\n.mat-datepicker-content.mat-warn .mat-calendar-body-selected {\\n background-color: #f44336;\\n color: white; }\\n.mat-datepicker-content.mat-warn .mat-calendar-body-disabled > .mat-calendar-body-selected {\\n background-color: rgba(244, 67, 54, 0.4); }\\n.mat-datepicker-content.mat-warn .mat-calendar-body-today.mat-calendar-body-selected {\\n box-shadow: inset 0 0 0 1px white; }\\n.mat-datepicker-content-touch {\\n box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }\\n.mat-datepicker-toggle-active {\\n color: #5e35b1; }\\n.mat-datepicker-toggle-active.mat-accent {\\n color: #c41061; }\\n.mat-datepicker-toggle-active.mat-warn {\\n color: #f44336; }\\n.mat-dialog-container {\\n box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);\\n background: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-divider {\\n border-top-color: rgba(0, 0, 0, 0.12); }\\n.mat-divider-vertical {\\n border-right-color: rgba(0, 0, 0, 0.12); }\\n.mat-expansion-panel {\\n background: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-expansion-panel:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }\\n.mat-action-row {\\n border-top-color: rgba(0, 0, 0, 0.12); }\\n.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']).cdk-keyboard-focused, .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']).cdk-program-focused, .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled='true']):hover {\\n background: rgba(0, 0, 0, 0.04); }\\n@media (hover: none) {\\n .mat-expansion-panel:not(.mat-expanded):not([aria-disabled='true'])\\n.mat-expansion-panel-header:hover {\\n background: white; } }\\n.mat-expansion-panel-header-title {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-expansion-panel-header-description,\\n.mat-expansion-indicator::after {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-expansion-panel-header[aria-disabled='true'] {\\n color: rgba(0, 0, 0, 0.26); }\\n.mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-title,\\n .mat-expansion-panel-header[aria-disabled='true'] .mat-expansion-panel-header-description {\\n color: inherit; }\\n.mat-form-field-label {\\n color: rgba(0, 0, 0, 0.6); }\\n.mat-hint {\\n color: rgba(0, 0, 0, 0.6); }\\n.mat-form-field.mat-focused .mat-form-field-label {\\n color: #5e35b1; }\\n.mat-form-field.mat-focused .mat-form-field-label.mat-accent {\\n color: #c41061; }\\n.mat-form-field.mat-focused .mat-form-field-label.mat-warn {\\n color: #f44336; }\\n.mat-focused .mat-form-field-required-marker {\\n color: #c41061; }\\n.mat-form-field-ripple {\\n background-color: rgba(0, 0, 0, 0.87); }\\n.mat-form-field.mat-focused .mat-form-field-ripple {\\n background-color: #5e35b1; }\\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-accent {\\n background-color: #c41061; }\\n.mat-form-field.mat-focused .mat-form-field-ripple.mat-warn {\\n background-color: #f44336; }\\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid) .mat-form-field-infix::after {\\n color: #5e35b1; }\\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-accent .mat-form-field-infix::after {\\n color: #c41061; }\\n.mat-form-field-type-mat-native-select.mat-focused:not(.mat-form-field-invalid).mat-warn .mat-form-field-infix::after {\\n color: #f44336; }\\n.mat-form-field.mat-form-field-invalid .mat-form-field-label {\\n color: #f44336; }\\n.mat-form-field.mat-form-field-invalid .mat-form-field-label.mat-accent,\\n .mat-form-field.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker {\\n color: #f44336; }\\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple,\\n.mat-form-field.mat-form-field-invalid .mat-form-field-ripple.mat-accent {\\n background-color: #f44336; }\\n.mat-error {\\n color: #f44336; }\\n.mat-form-field-appearance-legacy .mat-form-field-label {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-form-field-appearance-legacy .mat-hint {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-form-field-appearance-legacy .mat-form-field-underline {\\n background-color: rgba(0, 0, 0, 0.42); }\\n.mat-form-field-appearance-legacy.mat-form-field-disabled .mat-form-field-underline {\\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);\\n background-size: 4px 100%;\\n background-repeat: repeat-x; }\\n.mat-form-field-appearance-standard .mat-form-field-underline {\\n background-color: rgba(0, 0, 0, 0.42); }\\n.mat-form-field-appearance-standard.mat-form-field-disabled .mat-form-field-underline {\\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.42) 0%, rgba(0, 0, 0, 0.42) 33%, transparent 0%);\\n background-size: 4px 100%;\\n background-repeat: repeat-x; }\\n.mat-form-field-appearance-fill .mat-form-field-flex {\\n background-color: rgba(0, 0, 0, 0.04); }\\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-flex {\\n background-color: rgba(0, 0, 0, 0.02); }\\n.mat-form-field-appearance-fill .mat-form-field-underline::before {\\n background-color: rgba(0, 0, 0, 0.42); }\\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-label {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-form-field-appearance-fill.mat-form-field-disabled .mat-form-field-underline::before {\\n background-color: transparent; }\\n.mat-form-field-appearance-outline .mat-form-field-outline {\\n color: rgba(0, 0, 0, 0.12); }\\n.mat-form-field-appearance-outline .mat-form-field-outline-thick {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick {\\n color: #5e35b1; }\\n.mat-form-field-appearance-outline.mat-focused.mat-accent .mat-form-field-outline-thick {\\n color: #c41061; }\\n.mat-form-field-appearance-outline.mat-focused.mat-warn .mat-form-field-outline-thick {\\n color: #f44336; }\\n.mat-form-field-appearance-outline.mat-form-field-invalid.mat-form-field-invalid .mat-form-field-outline-thick {\\n color: #f44336; }\\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-label {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline {\\n color: rgba(0, 0, 0, 0.06); }\\n.mat-icon.mat-primary {\\n color: #5e35b1; }\\n.mat-icon.mat-accent {\\n color: #c41061; }\\n.mat-icon.mat-warn {\\n color: #f44336; }\\n.mat-form-field-type-mat-native-select .mat-form-field-infix::after {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-input-element:disabled,\\n.mat-form-field-type-mat-native-select.mat-form-field-disabled .mat-form-field-infix::after {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-input-element {\\n caret-color: #5e35b1; }\\n.mat-input-element::-webkit-input-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element::-moz-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element:-ms-input-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element::-ms-input-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element::placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element::-moz-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element::-webkit-input-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-input-element:-ms-input-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-accent .mat-input-element {\\n caret-color: #c41061; }\\n.mat-warn .mat-input-element,\\n.mat-form-field-invalid .mat-input-element {\\n caret-color: #f44336; }\\n.mat-form-field-type-mat-native-select.mat-form-field-invalid .mat-form-field-infix::after {\\n color: #f44336; }\\n.mat-list-base .mat-list-item {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-list-base .mat-list-option {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-list-base .mat-subheader {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-list-item-disabled {\\n background-color: #eeeeee; }\\n.mat-list-option:hover, .mat-list-option:focus,\\n.mat-nav-list .mat-list-item:hover,\\n.mat-nav-list .mat-list-item:focus,\\n.mat-action-list .mat-list-item:hover,\\n.mat-action-list .mat-list-item:focus {\\n background: rgba(0, 0, 0, 0.04); }\\n.mat-menu-panel {\\n background: white; }\\n.mat-menu-panel:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\\n.mat-menu-item {\\n background: transparent;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-menu-item[disabled], .mat-menu-item[disabled]::after {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-menu-item .mat-icon-no-color,\\n.mat-menu-item-submenu-trigger::after {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-menu-item:hover:not([disabled]),\\n.mat-menu-item.cdk-program-focused:not([disabled]),\\n.mat-menu-item.cdk-keyboard-focused:not([disabled]),\\n.mat-menu-item-highlighted:not([disabled]) {\\n background: rgba(0, 0, 0, 0.04); }\\n.mat-paginator {\\n background: white; }\\n.mat-paginator,\\n.mat-paginator-page-size .mat-select-trigger {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-paginator-decrement,\\n.mat-paginator-increment {\\n border-top: 2px solid rgba(0, 0, 0, 0.54);\\n border-right: 2px solid rgba(0, 0, 0, 0.54); }\\n.mat-paginator-first,\\n.mat-paginator-last {\\n border-top: 2px solid rgba(0, 0, 0, 0.54); }\\n.mat-icon-button[disabled] .mat-paginator-decrement,\\n.mat-icon-button[disabled] .mat-paginator-increment,\\n.mat-icon-button[disabled] .mat-paginator-first,\\n.mat-icon-button[disabled] .mat-paginator-last {\\n border-color: rgba(0, 0, 0, 0.38); }\\n.mat-progress-bar-background {\\n fill: #cfc2e8; }\\n.mat-progress-bar-buffer {\\n background-color: #cfc2e8; }\\n.mat-progress-bar-fill::after {\\n background-color: #5e35b1; }\\n.mat-progress-bar.mat-accent .mat-progress-bar-background {\\n fill: #edb7d0; }\\n.mat-progress-bar.mat-accent .mat-progress-bar-buffer {\\n background-color: #edb7d0; }\\n.mat-progress-bar.mat-accent .mat-progress-bar-fill::after {\\n background-color: #c41061; }\\n.mat-progress-bar.mat-warn .mat-progress-bar-background {\\n fill: #ffcdd2; }\\n.mat-progress-bar.mat-warn .mat-progress-bar-buffer {\\n background-color: #ffcdd2; }\\n.mat-progress-bar.mat-warn .mat-progress-bar-fill::after {\\n background-color: #f44336; }\\n.mat-progress-spinner circle, .mat-spinner circle {\\n stroke: #5e35b1; }\\n.mat-progress-spinner.mat-accent circle, .mat-spinner.mat-accent circle {\\n stroke: #c41061; }\\n.mat-progress-spinner.mat-warn circle, .mat-spinner.mat-warn circle {\\n stroke: #f44336; }\\n.mat-radio-outer-circle {\\n border-color: rgba(0, 0, 0, 0.54); }\\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle {\\n border-color: #5e35b1; }\\n.mat-radio-button.mat-primary .mat-radio-inner-circle,\\n.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\\n.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-persistent-ripple,\\n.mat-radio-button.mat-primary:active .mat-radio-persistent-ripple {\\n background-color: #5e35b1; }\\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle {\\n border-color: #c41061; }\\n.mat-radio-button.mat-accent .mat-radio-inner-circle,\\n.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\\n.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-persistent-ripple,\\n.mat-radio-button.mat-accent:active .mat-radio-persistent-ripple {\\n background-color: #c41061; }\\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle {\\n border-color: #f44336; }\\n.mat-radio-button.mat-warn .mat-radio-inner-circle,\\n.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple),\\n.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-persistent-ripple,\\n.mat-radio-button.mat-warn:active .mat-radio-persistent-ripple {\\n background-color: #f44336; }\\n.mat-radio-button.mat-radio-disabled.mat-radio-checked .mat-radio-outer-circle,\\n.mat-radio-button.mat-radio-disabled .mat-radio-outer-circle {\\n border-color: rgba(0, 0, 0, 0.38); }\\n.mat-radio-button.mat-radio-disabled .mat-radio-ripple .mat-ripple-element,\\n.mat-radio-button.mat-radio-disabled .mat-radio-inner-circle {\\n background-color: rgba(0, 0, 0, 0.38); }\\n.mat-radio-button.mat-radio-disabled .mat-radio-label-content {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-radio-button .mat-ripple-element {\\n background-color: black; }\\n.mat-select-value {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-select-placeholder {\\n color: rgba(0, 0, 0, 0.42); }\\n.mat-select-disabled .mat-select-value {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-select-arrow {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-select-panel {\\n background: white; }\\n.mat-select-panel:not([class*='mat-elevation-z']) {\\n box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }\\n.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple) {\\n background: rgba(0, 0, 0, 0.12); }\\n.mat-form-field.mat-focused.mat-primary .mat-select-arrow {\\n color: #5e35b1; }\\n.mat-form-field.mat-focused.mat-accent .mat-select-arrow {\\n color: #c41061; }\\n.mat-form-field.mat-focused.mat-warn .mat-select-arrow {\\n color: #f44336; }\\n.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow {\\n color: #f44336; }\\n.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-drawer-container {\\n background-color: #fafafa;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-drawer {\\n background-color: white;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-drawer.mat-drawer-push {\\n background-color: white; }\\n.mat-drawer:not(.mat-drawer-side) {\\n box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }\\n.mat-drawer-side {\\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\\n.mat-drawer-side.mat-drawer-end {\\n border-left: solid 1px rgba(0, 0, 0, 0.12);\\n border-right: none; }\\n[dir='rtl'] .mat-drawer-side {\\n border-left: solid 1px rgba(0, 0, 0, 0.12);\\n border-right: none; }\\n[dir='rtl'] .mat-drawer-side.mat-drawer-end {\\n border-left: none;\\n border-right: solid 1px rgba(0, 0, 0, 0.12); }\\n.mat-drawer-backdrop.mat-drawer-shown {\\n background-color: rgba(0, 0, 0, 0.6); }\\n.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb {\\n background-color: #c41061; }\\n.mat-slide-toggle.mat-checked .mat-slide-toggle-bar {\\n background-color: rgba(196, 16, 97, 0.54); }\\n.mat-slide-toggle.mat-checked .mat-ripple-element {\\n background-color: #c41061; }\\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-thumb {\\n background-color: #5e35b1; }\\n.mat-slide-toggle.mat-primary.mat-checked .mat-slide-toggle-bar {\\n background-color: rgba(94, 53, 177, 0.54); }\\n.mat-slide-toggle.mat-primary.mat-checked .mat-ripple-element {\\n background-color: #5e35b1; }\\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-thumb {\\n background-color: #f44336; }\\n.mat-slide-toggle.mat-warn.mat-checked .mat-slide-toggle-bar {\\n background-color: rgba(244, 67, 54, 0.54); }\\n.mat-slide-toggle.mat-warn.mat-checked .mat-ripple-element {\\n background-color: #f44336; }\\n.mat-slide-toggle:not(.mat-checked) .mat-ripple-element {\\n background-color: black; }\\n.mat-slide-toggle-thumb {\\n box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12);\\n background-color: #fafafa; }\\n.mat-slide-toggle-bar {\\n background-color: rgba(0, 0, 0, 0.38); }\\n.mat-slider-track-background {\\n background-color: rgba(0, 0, 0, 0.26); }\\n.mat-primary .mat-slider-track-fill,\\n.mat-primary .mat-slider-thumb,\\n.mat-primary .mat-slider-thumb-label {\\n background-color: #5e35b1; }\\n.mat-primary .mat-slider-thumb-label-text {\\n color: white; }\\n.mat-accent .mat-slider-track-fill,\\n.mat-accent .mat-slider-thumb,\\n.mat-accent .mat-slider-thumb-label {\\n background-color: #c41061; }\\n.mat-accent .mat-slider-thumb-label-text {\\n color: white; }\\n.mat-warn .mat-slider-track-fill,\\n.mat-warn .mat-slider-thumb,\\n.mat-warn .mat-slider-thumb-label {\\n background-color: #f44336; }\\n.mat-warn .mat-slider-thumb-label-text {\\n color: white; }\\n.mat-slider-focus-ring {\\n background-color: rgba(196, 16, 97, 0.2); }\\n.mat-slider:hover .mat-slider-track-background,\\n.cdk-focused .mat-slider-track-background {\\n background-color: rgba(0, 0, 0, 0.38); }\\n.mat-slider-disabled .mat-slider-track-background,\\n.mat-slider-disabled .mat-slider-track-fill,\\n.mat-slider-disabled .mat-slider-thumb {\\n background-color: rgba(0, 0, 0, 0.26); }\\n.mat-slider-disabled:hover .mat-slider-track-background {\\n background-color: rgba(0, 0, 0, 0.26); }\\n.mat-slider-min-value .mat-slider-focus-ring {\\n background-color: rgba(0, 0, 0, 0.12); }\\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,\\n.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label {\\n background-color: rgba(0, 0, 0, 0.87); }\\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,\\n.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label {\\n background-color: rgba(0, 0, 0, 0.26); }\\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb {\\n border-color: rgba(0, 0, 0, 0.26);\\n background-color: transparent; }\\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb, .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb {\\n border-color: rgba(0, 0, 0, 0.38); }\\n.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb, .mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb {\\n border-color: rgba(0, 0, 0, 0.26); }\\n.mat-slider-has-ticks .mat-slider-wrapper::after {\\n border-color: rgba(0, 0, 0, 0.7); }\\n.mat-slider-horizontal .mat-slider-ticks {\\n background-image: repeating-linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent);\\n background-image: -moz-repeating-linear-gradient(0.0001deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent); }\\n.mat-slider-vertical .mat-slider-ticks {\\n background-image: repeating-linear-gradient(to bottom, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.7) 2px, transparent 0, transparent); }\\n.mat-step-header.cdk-keyboard-focused, .mat-step-header.cdk-program-focused, .mat-step-header:hover {\\n background-color: rgba(0, 0, 0, 0.04); }\\n@media (hover: none) {\\n .mat-step-header:hover {\\n background: none; } }\\n.mat-step-header .mat-step-label,\\n.mat-step-header .mat-step-optional {\\n color: rgba(0, 0, 0, 0.54); }\\n.mat-step-header .mat-step-icon {\\n background-color: rgba(0, 0, 0, 0.54);\\n color: white; }\\n.mat-step-header .mat-step-icon-selected,\\n.mat-step-header .mat-step-icon-state-done,\\n.mat-step-header .mat-step-icon-state-edit {\\n background-color: #5e35b1;\\n color: white; }\\n.mat-step-header .mat-step-icon-state-error {\\n background-color: transparent;\\n color: #f44336; }\\n.mat-step-header .mat-step-label.mat-step-label-active {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-step-header .mat-step-label.mat-step-label-error {\\n color: #f44336; }\\n.mat-stepper-horizontal, .mat-stepper-vertical {\\n background-color: white; }\\n.mat-stepper-vertical-line::before {\\n border-left-color: rgba(0, 0, 0, 0.12); }\\n.mat-horizontal-stepper-header::before,\\n.mat-horizontal-stepper-header::after,\\n.mat-stepper-horizontal-line {\\n border-top-color: rgba(0, 0, 0, 0.12); }\\n.mat-sort-header-arrow {\\n color: #757575; }\\n.mat-tab-nav-bar,\\n.mat-tab-header {\\n border-bottom: 1px solid rgba(0, 0, 0, 0.12); }\\n.mat-tab-group-inverted-header .mat-tab-nav-bar,\\n.mat-tab-group-inverted-header .mat-tab-header {\\n border-top: 1px solid rgba(0, 0, 0, 0.12);\\n border-bottom: none; }\\n.mat-tab-label, .mat-tab-link {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-tab-label.mat-tab-disabled, .mat-tab-link.mat-tab-disabled {\\n color: rgba(0, 0, 0, 0.38); }\\n.mat-tab-header-pagination-chevron {\\n border-color: rgba(0, 0, 0, 0.87); }\\n.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\\n border-color: rgba(0, 0, 0, 0.38); }\\n.mat-tab-group[class*='mat-background-'] .mat-tab-header,\\n.mat-tab-nav-bar[class*='mat-background-'] {\\n border-bottom: none;\\n border-top: none; }\\n.mat-tab-group.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\\n background-color: rgba(207, 194, 232, 0.3); }\\n.mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar {\\n background-color: #5e35b1; }\\n.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar {\\n background-color: white; }\\n.mat-tab-group.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\\n background-color: rgba(237, 183, 208, 0.3); }\\n.mat-tab-group.mat-accent .mat-ink-bar, .mat-tab-nav-bar.mat-accent .mat-ink-bar {\\n background-color: #c41061; }\\n.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar, .mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar {\\n background-color: white; }\\n.mat-tab-group.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\\n background-color: rgba(255, 205, 210, 0.3); }\\n.mat-tab-group.mat-warn .mat-ink-bar, .mat-tab-nav-bar.mat-warn .mat-ink-bar {\\n background-color: #f44336; }\\n.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar, .mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar {\\n background-color: white; }\\n.mat-tab-group.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-primary .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-background-primary .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\\n background-color: rgba(207, 194, 232, 0.3); }\\n.mat-tab-group.mat-background-primary .mat-tab-header, .mat-tab-group.mat-background-primary .mat-tab-links, .mat-tab-nav-bar.mat-background-primary .mat-tab-header, .mat-tab-nav-bar.mat-background-primary .mat-tab-links {\\n background-color: #5e35b1; }\\n.mat-tab-group.mat-background-primary .mat-tab-label, .mat-tab-group.mat-background-primary .mat-tab-link, .mat-tab-nav-bar.mat-background-primary .mat-tab-label, .mat-tab-nav-bar.mat-background-primary .mat-tab-link {\\n color: white; }\\n.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled {\\n color: rgba(255, 255, 255, 0.4); }\\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron {\\n border-color: white; }\\n.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\\n border-color: rgba(255, 255, 255, 0.4); }\\n.mat-tab-group.mat-background-primary .mat-ripple-element, .mat-tab-nav-bar.mat-background-primary .mat-ripple-element {\\n background-color: rgba(255, 255, 255, 0.12); }\\n.mat-tab-group.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-accent .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-background-accent .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\\n background-color: rgba(237, 183, 208, 0.3); }\\n.mat-tab-group.mat-background-accent .mat-tab-header, .mat-tab-group.mat-background-accent .mat-tab-links, .mat-tab-nav-bar.mat-background-accent .mat-tab-header, .mat-tab-nav-bar.mat-background-accent .mat-tab-links {\\n background-color: #c41061; }\\n.mat-tab-group.mat-background-accent .mat-tab-label, .mat-tab-group.mat-background-accent .mat-tab-link, .mat-tab-nav-bar.mat-background-accent .mat-tab-label, .mat-tab-nav-bar.mat-background-accent .mat-tab-link {\\n color: white; }\\n.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled {\\n color: rgba(255, 255, 255, 0.4); }\\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron {\\n border-color: white; }\\n.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\\n border-color: rgba(255, 255, 255, 0.4); }\\n.mat-tab-group.mat-background-accent .mat-ripple-element, .mat-tab-nav-bar.mat-background-accent .mat-ripple-element {\\n background-color: rgba(255, 255, 255, 0.12); }\\n.mat-tab-group.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-group.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-group.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-keyboard-focused:not(.mat-tab-disabled), .mat-tab-nav-bar.mat-background-warn .mat-tab-label.cdk-program-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-keyboard-focused:not(.mat-tab-disabled),\\n.mat-tab-nav-bar.mat-background-warn .mat-tab-link.cdk-program-focused:not(.mat-tab-disabled) {\\n background-color: rgba(255, 205, 210, 0.3); }\\n.mat-tab-group.mat-background-warn .mat-tab-header, .mat-tab-group.mat-background-warn .mat-tab-links, .mat-tab-nav-bar.mat-background-warn .mat-tab-header, .mat-tab-nav-bar.mat-background-warn .mat-tab-links {\\n background-color: #f44336; }\\n.mat-tab-group.mat-background-warn .mat-tab-label, .mat-tab-group.mat-background-warn .mat-tab-link, .mat-tab-nav-bar.mat-background-warn .mat-tab-label, .mat-tab-nav-bar.mat-background-warn .mat-tab-link {\\n color: white; }\\n.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled, .mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled, .mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled, .mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled {\\n color: rgba(255, 255, 255, 0.4); }\\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron {\\n border-color: white; }\\n.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron, .mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron {\\n border-color: rgba(255, 255, 255, 0.4); }\\n.mat-tab-group.mat-background-warn .mat-ripple-element, .mat-tab-nav-bar.mat-background-warn .mat-ripple-element {\\n background-color: rgba(255, 255, 255, 0.12); }\\n.mat-toolbar {\\n background: whitesmoke;\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-toolbar.mat-primary {\\n background: #5e35b1;\\n color: white; }\\n.mat-toolbar.mat-accent {\\n background: #c41061;\\n color: white; }\\n.mat-toolbar.mat-warn {\\n background: #f44336;\\n color: white; }\\n.mat-toolbar .mat-form-field-underline,\\n .mat-toolbar .mat-form-field-ripple,\\n .mat-toolbar .mat-focused .mat-form-field-ripple {\\n background-color: currentColor; }\\n.mat-toolbar .mat-form-field-label,\\n .mat-toolbar .mat-focused .mat-form-field-label,\\n .mat-toolbar .mat-select-value,\\n .mat-toolbar .mat-select-arrow,\\n .mat-toolbar .mat-form-field.mat-focused .mat-select-arrow {\\n color: inherit; }\\n.mat-toolbar .mat-input-element {\\n caret-color: currentColor; }\\n.mat-tooltip {\\n background: rgba(97, 97, 97, 0.9); }\\n.mat-tree {\\n background: white; }\\n.mat-tree-node,\\n.mat-nested-tree-node {\\n color: rgba(0, 0, 0, 0.87); }\\n.mat-snack-bar-container {\\n color: rgba(255, 255, 255, 0.7);\\n background: #323232;\\n box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }\\n.mat-simple-snackbar-action {\\n color: #c41061; }\\n/* Verily branding basics */\\n* {\\n font-family: 'Work Sans', sans-serif; }\\n@font-face {\\n font-family: 'Material Icons';\\n font-style: normal;\\n font-weight: 400;\\n src: local(\\\"Material Icons\\\"), local(\\\"MaterialIcons-Regular\\\"), url('MaterialIcons-Regular.woff') format(\\\"woff\\\"); }\\n.material-icons {\\n font-family: 'Material Icons';\\n font-weight: normal;\\n font-style: normal;\\n font-size: 24px;\\n /* Preferred icon size */\\n display: inline-block;\\n line-height: 1;\\n text-transform: none;\\n letter-spacing: normal;\\n word-wrap: normal;\\n white-space: nowrap;\\n direction: ltr;\\n /* Support for all WebKit browsers. */\\n -webkit-font-smoothing: antialiased;\\n /* Support for Safari and Chrome. */\\n text-rendering: optimizeLegibility;\\n /* Support for Firefox. */\\n -moz-osx-font-smoothing: grayscale;\\n /* Support for IE. */\\n font-feature-settings: 'liga'; }\\n/* Added for ng2-dragula support, see https://github.com/valor-software/ng2-dragula */\\n/* in-flight clone */\\n.gu-mirror {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\\\";\\n filter: alpha(opacity=100);\\n margin: 0 !important;\\n opacity: 1 !important;\\n pointer-events: none;\\n position: fixed !important;\\n z-index: 9999 !important; }\\n/* high-performance display:none; helper */\\n.gu-hide {\\n left: -9999px !important; }\\n/* added to mirrorContainer (default = body) while dragging */\\n.gu-unselectable {\\n -ms-user-select: none !important;\\n -moz-user-select: none !important;\\n -webkit-user-select: none !important;\\n user-select: none !important;\\n cursor: grabbing !important;\\n cursor: -webkit-grabbing; }\\n/* added to the source element while its mirror is dragged */\\n.gu-transit {\\n -ms-filter: \\\"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)\\\";\\n filter: alpha(opacity=20);\\n opacity: 0.2; }\\n.mat-app-background {\\n background-color: #202020;\\n /* Grey 900 */ }\\nbody {\\n margin: 0px; }\\n\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvbGF1cmVuZHVrZXMvY2hhcm1hbmRlci1iY2gvbWVkdGltZWxpbmUvc3JjL3N0eWxlcy5zY3NzIiwiL3Vzci9sb2NhbC9nb29nbGUvaG9tZS9sYXVyZW5kdWtlcy9jaGFybWFuZGVyLWJjaC9tZWR0aW1lbGluZS9ub2RlX21vZHVsZXMvQGFuZ3VsYXIvbWF0ZXJpYWwvX3RoZW1pbmcuc2NzcyIsIi91c3IvbG9jYWwvZ29vZ2xlL2hvbWUvbGF1cmVuZHVrZXMvY2hhcm1hbmRlci1iY2gvbWVkdGltZWxpbmUvc3JjL3ZlcmlseS1jb2xvcnMtbWF0ZXJpYWwtdGhlbWUuc2NzcyIsInNyYy9zdHlsZXMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsa0VBQVk7QUFDWixpRUFBWTtBQUNaLGdFQUFZO0FBSlosNkNBQUE7QUN5MUNBLGtDQUFBO0FBb2hEQSwyQ0FBQTtBQXdDQSxxQkFBQTtBQXIrQkU7RUFDRSxnQkFoTHVCO0VBaUx2QixlQWxMc0I7RUFtTHRCLGlEQXBpQitELEVBQUE7QUF1aUJqRTtFQUNFLGNBQW1DLEVBQUE7QUFHckM7RUFDRSxlQUFtQyxFQUFBO0FBeFRyQztFQTFORSx3REExQitEO0VBc1AvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQS9ORSx3REExQitEO0VBMlAvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXBPRSx3REExQitEO0VBZ1EvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXpPRSx3REExQitEO0VBcVEvRCxnQkFBZ0IsRUFBQTtBQU1sQjtFQWpQRSwyREExQitEO0VBbVIvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQTVQRSwwREExQitEO0VBOFIvRCxnQkFBZ0IsRUFBQTtBQUdsQjtFQXZRRSx3REExQitELEVBQUE7QUFxU2pFO0VBM1FFLHdEQTFCK0QsRUFBQTtBQXFTakU7SUFJSSxnQkFBZ0IsRUFBQTtBQUlwQjtFQW5SRSx3REExQitELEVBQUE7QUFtVGpFO0VBelJFLDBEQTFCK0Q7RUFx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QUE4RDtFQWhuSGhFLDJIQUVtRSxFQUFBO0FBbW5IbkU7RUFDRSxjQy8vSFcsRUFBQTtBRjFDZiwyQkFBQTtBQUNBO0VBQ0Usb0NBQW9DLEVBQUE7QUFJdEM7RUFDRSw2QkFBNkI7RUFDN0Isa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQiw4R0FFd0UsRUFBQTtBQUcxRTtFQUNFLDZCQUE2QjtFQUM3QixtQkFBbUI7RUFDbkIsa0JBQWtCO0VBQ2xCLGVBQWU7RUFBRyx3QkFBQTtFQUNsQixxQkFBcUI7RUFDckIsY0FBYztFQUNkLG9CQUFvQjtFQUNwQixzQkFBc0I7RUFDdEIsaUJBQWlCO0VBQ2pCLG1CQUFtQjtFQUNuQixjQUFjO0VBRWQscUNBQUE7RUFDQSxtQ0FBbUM7RUFDbkMsbUNBQUE7RUFDQSxrQ0FBa0M7RUFFbEMseUJBQUE7RUFDQSxrQ0FBa0M7RUFFbEMsb0JBQUE7RUFDQSw2QkFBNkIsRUFBQTtBQUcvQixxRkFBQTtBQUNBLG9CQUFBO0FBQ0E7RUFDRSxrRUFBa0U7RUFDbEUsMEJBQTBCO0VBQzFCLG9CQUFvQjtFQUNwQixxQkFBcUI7RUFDckIsb0JBQW9CO0VBQ3BCLDBCQUEwQjtFQUMxQix3QkFBd0IsRUFBQTtBQUcxQiwwQ0FBQTtBQUNBO0VBQ0Usd0JBQXdCLEVBQUE7QUFHMUIsNkRBQUE7QUFDQTtFQUNFLGdDQUFnQztFQUNoQyxpQ0FBaUM7RUFDakMsb0NBQW9DO0VBQ3BDLDRCQUE0QjtFQUM1QiwyQkFBMkI7RUFFM0Isd0JBQXdCLEVBQUE7QUFFMUIsNERBQUE7QUFDQTtFQUNFLGlFQUFpRTtFQUNqRSx5QkFBeUI7RUFDekIsWUFBWSxFQUFBO0FBR2Q7RUFDRSx5QkFBeUI7RUFBRSxhQUFBLEVBQWM7QUFHM0M7RUFDRSxXQUFXLEVBQUEiLCJmaWxlIjoic3JjL3N0eWxlcy5zY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogRGVmYXVsdCBBbmd1bGFyIE1hdGVyaWFsIHByZWJ1aWx0IHRoZW1lLiAqL1xuQGltcG9ydCBcIi4vdmVyaWx5LWNvbG9ycy1tYXRlcmlhbC10aGVtZS5zY3NzXCI7XG5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vJyk7XG5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PU1vbnRzZXJyYXQnKTtcbkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9V29yaytTYW5zJyk7XG5cbi8qIFZlcmlseSBicmFuZGluZyBiYXNpY3MgKi9cbioge1xuICBmb250LWZhbWlseTogJ1dvcmsgU2FucycsIHNhbnMtc2VyaWY7XG59XG5cbi8vIFNlbGYtaG9zdCB0aGUgQW5ndWxhciBNYXRlcmlhbCBpY29ucy5cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogNDAwO1xuICBzcmM6IGxvY2FsKCdNYXRlcmlhbCBJY29ucycpLFxuICAgIGxvY2FsKCdNYXRlcmlhbEljb25zLVJlZ3VsYXInKSxcbiAgICB1cmwoLi9hc3NldHMvbWF0ZXJpYWxfaWNvbnMvTWF0ZXJpYWxJY29ucy1SZWd1bGFyLndvZmYpIGZvcm1hdCgnd29mZicpLFxufVxuXG4ubWF0ZXJpYWwtaWNvbnMge1xuICBmb250LWZhbWlseTogJ01hdGVyaWFsIEljb25zJztcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXNpemU6IDI0cHg7ICAvKiBQcmVmZXJyZWQgaWNvbiBzaXplICovXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICB3b3JkLXdyYXA6IG5vcm1hbDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgZGlyZWN0aW9uOiBsdHI7XG5cbiAgLyogU3VwcG9ydCBmb3IgYWxsIFdlYktpdCBicm93c2Vycy4gKi9cbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC8qIFN1cHBvcnQgZm9yIFNhZmFyaSBhbmQgQ2hyb21lLiAqL1xuICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuXG4gIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG5cbiAgLyogU3VwcG9ydCBmb3IgSUUuICovXG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogJ2xpZ2EnO1xufVxuXG4vKiBBZGRlZCBmb3IgbmcyLWRyYWd1bGEgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZzItZHJhZ3VsYSAqL1xuLyogaW4tZmxpZ2h0IGNsb25lICovXG4uZ3UtbWlycm9yIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0xMDApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApO1xuICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDtcbn1cblxuLyogaGlnaC1wZXJmb3JtYW5jZSBkaXNwbGF5Om5vbmU7IGhlbHBlciAqL1xuLmd1LWhpZGUge1xuICBsZWZ0OiAtOTk5OXB4ICFpbXBvcnRhbnQ7XG59XG5cbi8qIGFkZGVkIHRvIG1pcnJvckNvbnRhaW5lciAoZGVmYXVsdCA9IGJvZHkpIHdoaWxlIGRyYWdnaW5nICovXG4uZ3UtdW5zZWxlY3RhYmxlIHtcbiAgLW1zLXVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICB1c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICBjdXJzb3I6IGdyYWJiaW5nICFpbXBvcnRhbnQ7XG4gIGN1cnNvcjogLW1vei1ncmFiYmluZztcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nO1xufVxuLyogYWRkZWQgdG8gdGhlIHNvdXJjZSBlbGVtZW50IHdoaWxlIGl0cyBtaXJyb3IgaXMgZHJhZ2dlZCAqL1xuLmd1LXRyYW5zaXQge1xuICAtbXMtZmlsdGVyOiBcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShPcGFjaXR5PTIwKVwiO1xuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjApO1xuICBvcGFjaXR5OiAwLjI7XG59XG5cbi5tYXQtYXBwLWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjAyMDIwOyAvKiBHcmV5IDkwMCAqL1xufVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwcHg7XG59XG4iLCIvLyBJbXBvcnQgYWxsIHRoZSB0aGVtaW5nIGZ1bmN0aW9uYWxpdHkuXG4vLyBXZSBjYW4gdXNlIHJlbGF0aXZlIGltcG9ydHMgZm9yIGltcG9ydHMgZnJvbSB0aGUgY2RrIGJlY2F1c2Ugd2UgYnVuZGxlIGV2ZXJ5dGhpbmdcbi8vIHVwIGludG8gYSBzaW5nbGUgZmxhdCBzY3NzIGZpbGUgZm9yIG1hdGVyaWFsLlxuLy8gV2Ugd2FudCBvdmVybGF5cyB0byBhbHdheXMgYXBwZWFyIG92ZXIgdXNlciBjb250ZW50LCBzbyBzZXQgYSBiYXNlbGluZVxuLy8gdmVyeSBoaWdoIHotaW5kZXggZm9yIHRoZSBvdmVybGF5IGNvbnRhaW5lciwgd2hpY2ggaXMgd2hlcmUgd2UgY3JlYXRlIHRoZSBuZXdcbi8vIHN0YWNraW5nIGNvbnRleHQgZm9yIGFsbCBvdmVybGF5cy5cbiRjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcjogMTAwMDtcbiRjZGstei1pbmRleC1vdmVybGF5OiAxMDAwO1xuJGNkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3A6IDEwMDA7XG5cbi8vIEJhY2tncm91bmQgY29sb3IgZm9yIGFsbCBvZiB0aGUgYmFja2Ryb3BzXG4kY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcC1iYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpO1xuXG4vLyBEZWZhdWx0IGJhY2tkcm9wIGFuaW1hdGlvbiBpcyBiYXNlZCBvbiB0aGUgTWF0ZXJpYWwgRGVzaWduIHN3aWZ0LWVhc2Utb3V0LlxuJGJhY2tkcm9wLWFuaW1hdGlvbi1kdXJhdGlvbjogNDAwbXMgIWRlZmF1bHQ7XG4kYmFja2Ryb3AtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSkgIWRlZmF1bHQ7XG5cblxuQG1peGluIGNkay1vdmVybGF5KCkge1xuICAuY2RrLW92ZXJsYXktY29udGFpbmVyLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICAgIC8vIERpc2FibGUgZXZlbnRzIGZyb20gYmVpbmcgY2FwdHVyZWQgb24gdGhlIG92ZXJsYXkgY29udGFpbmVyLlxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgLy8gVGhlIGNvbnRhaW5lciBzaG91bGQgYmUgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0LlxuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC8vIFRoZSBvdmVybGF5LWNvbnRhaW5lciBpcyBhbiBpbnZpc2libGUgZWxlbWVudCB3aGljaCBjb250YWlucyBhbGwgaW5kaXZpZHVhbCBvdmVybGF5cy5cbiAgLmNkay1vdmVybGF5LWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5LWNvbnRhaW5lcjtcblxuICAgICY6ZW1wdHkge1xuICAgICAgLy8gSGlkZSB0aGUgZWxlbWVudCB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgY2hpbGQgbm9kZXMuIFRoaXMgZG9lc24ndFxuICAgICAgLy8gaW5jbHVkZSBvdmVybGF5cyB0aGF0IGhhdmUgYmVlbiBkZXRhY2hlZCwgcmF0aGVyIHRoYW4gZGlzcG9zZWQuXG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIHVzZSBhbiBleHRyYSB3cmFwcGVyIGVsZW1lbnQgaW4gb3JkZXIgdG8gdXNlIG1ha2UgdGhlIG92ZXJsYXkgaXRzZWxmIGEgZmxleCBpdGVtLlxuICAvLyBUaGlzIG1ha2VzIGNlbnRlcmluZyB0aGUgb3ZlcmxheSBlYXN5IHdpdGhvdXQgcnVubmluZyBpbnRvIHRoZSBzdWJwaXhlbCByZW5kZXJpbmdcbiAgLy8gcHJvYmxlbXMgdGllZCB0byB1c2luZyBgdHJhbnNmb3JtYCBhbmQgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBvdGhlciBwb3NpdGlvblxuICAvLyBzdHJhdGVnaWVzLlxuICAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5O1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgb3ZlcmxheSBwYW5lLlxuICAuY2RrLW92ZXJsYXktcGFuZSB7XG4gICAgLy8gTm90ZTogaXQncyBpbXBvcnRhbnQgZm9yIHRoaXMgb25lIHRvIHN0YXJ0IG9mZiBgYWJzb2x1dGVgLFxuICAgIC8vIGluIG9yZGVyIGZvciB1cyB0byBiZSBhYmxlIHRvIG1lYXN1cmUgaXQgY29ycmVjdGx5LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHotaW5kZXg6ICRjZGstei1pbmRleC1vdmVybGF5O1xuXG4gICAgLy8gRm9yIGNvbm5lY3RlZC1wb3NpdGlvbiBvdmVybGF5cywgd2Ugc2V0IGBkaXNwbGF5OiBmbGV4YCBpblxuICAgIC8vIG9yZGVyIHRvIGZvcmNlIGBtYXgtd2lkdGhgIGFuZCBgbWF4LWhlaWdodGAgdG8gdGFrZSBlZmZlY3QuXG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgfVxuXG4gIC5jZGstb3ZlcmxheS1iYWNrZHJvcCB7XG4gICAgLy8gVE9ETyhqZWxib3Vybik6IHJldXNlIHNpZGVuYXYgZnVsbHNjcmVlbiBtaXhpbi5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgei1pbmRleDogJGNkay16LWluZGV4LW92ZXJsYXktYmFja2Ryb3A7XG4gICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5ICRiYWNrZHJvcC1hbmltYXRpb24tZHVyYXRpb24gJGJhY2tkcm9wLWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb247XG4gICAgb3BhY2l0eTogMDtcblxuICAgICYuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyB7XG4gICAgICBvcGFjaXR5OiAxO1xuXG4gICAgICAvLyBJbiBoaWdoIGNvbnRyYXN0IG1vZGUgdGhlIHJnYmEgYmFja2dyb3VuZCB3aWxsIGJlY29tZSBzb2xpZCBzbyB3ZSBuZWVkIHRvIGZhbGwgYmFja1xuICAgICAgLy8gdG8gbWFraW5nIGl0IG9wYXF1ZSB1c2luZyBgb3BhY2l0eWAuIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgdGhlIGBjZGstaGlnaC1jb250cmFzdGBcbiAgICAgIC8vIG1peGluLCBiZWNhdXNlIHdlIGNhbid0IG5vcm1hbGl6ZSB0aGUgaW1wb3J0IHBhdGggdG8gdGhlIF9hMTF5LnNjc3MgYm90aCBmb3IgdGhlXG4gICAgICAvLyBzb3VyY2UgYW5kIHdoZW4gdGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkLiBTZWUgIzEwOTA4LlxuICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wIHtcbiAgICBiYWNrZ3JvdW5kOiAkY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcC1iYWNrZ3JvdW5kO1xuICB9XG5cbiAgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIHtcbiAgICAvLyBOb3RlOiBhcyBvZiBGaXJlZm94IDU3LCBoYXZpbmcgdGhlIGJhY2tkcm9wIGJlIGBiYWNrZ3JvdW5kOiBub25lYCB3aWxsIHByZXZlbnQgaXQgZnJvbVxuICAgIC8vIGNhcHR1cmluZyB0aGUgdXNlcidzIG1vdXNlIHNjcm9sbCBldmVudHMuIFNpbmNlIHdlIGFsc28gY2FuJ3QgdXNlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gYHJnYmEoMCwgMCwgMCwgMClgLCB3ZSB3b3JrIGFyb3VuZCB0aGUgaW5jb25zaXN0ZW5jeSBieSBub3Qgc2V0dGluZyB0aGUgYmFja2dyb3VuZCBhdFxuICAgIC8vIGFsbCBhbmQgdXNpbmcgYG9wYWNpdHlgIHRvIG1ha2UgdGhlIGVsZW1lbnQgdHJhbnNwYXJlbnQuXG4gICAgJiwgJi5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcmxheSBwYXJlbnQgZWxlbWVudCB1c2VkIHdpdGggdGhlIGNvbm5lY3RlZCBwb3NpdGlvbiBzdHJhdGVneS4gVXNlZCB0byBjb25zdHJhaW4gdGhlXG4gIC8vIG92ZXJsYXkgZWxlbWVudCdzIHNpemUgdG8gZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuXG4gIC5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogJGNkay16LWluZGV4LW92ZXJsYXk7XG5cbiAgICAvLyBXZSB1c2UgYGRpc3BsYXk6IGZsZXhgIG9uIHRoaXMgZWxlbWVudCBleGNsdXNpdmVseSBmb3IgY2VudGVyaW5nIGNvbm5lY3RlZCBvdmVybGF5cy5cbiAgICAvLyBXaGVuICpub3QqIGNlbnRlcmluZywgYSB0b3AvbGVmdC9ib3R0b20vcmlnaHQgd2lsbCBiZSBzZXQgd2hpY2ggb3ZlcnJpZGVzIHRoZSBub3JtYWxcbiAgICAvLyBmbGV4IGxheW91dC5cbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLy8gV2UgdXNlIHRoZSBgY29sdW1uYCBkaXJlY3Rpb24gaGVyZSB0byBhdm9pZCBzb21lIGZsZXhib3ggaXNzdWVzIGluIEVkZ2VcbiAgICAvLyB3aGVuIHVzaW5nIHRoZSBcImdyb3cgYWZ0ZXIgb3BlblwiIG9wdGlvbnMuXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgIC8vIEFkZCBzb21lIGRpbWVuc2lvbnMgc28gdGhlIGVsZW1lbnQgaGFzIGFuIGBpbm5lclRleHRgIHdoaWNoIHNvbWUgcGVvcGxlIGRlcGVuZCBvbiBpbiB0ZXN0cy5cbiAgICBtaW4td2lkdGg6IDFweDtcbiAgICBtaW4taGVpZ2h0OiAxcHg7XG4gIH1cblxuICAvLyBVc2VkIHdoZW4gZGlzYWJsaW5nIGdsb2JhbCBzY3JvbGxpbmcuXG4gIC5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG5cbiAgICAvLyBOZWNlc3NhcnkgZm9yIHRoZSBjb250ZW50IG5vdCB0byBsb3NlIGl0cyB3aWR0aC4gTm90ZSB0aGF0IHdlJ3JlIHVzaW5nIDEwMCUsIGluc3RlYWQgb2ZcbiAgICAvLyAxMDB2dywgYmVjYXVzZSAxMDB2dyBpbmNsdWRlcyB0aGUgd2lkdGggcGx1cyB0aGUgc2Nyb2xsYmFyLCB3aGVyZWFzIDEwMCUgaXMgdGhlIHdpZHRoXG4gICAgLy8gdGhhdCB0aGUgZWxlbWVudCBoYWQgYmVmb3JlIHdlIG1hZGUgaXQgYGZpeGVkYC5cbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC8vIE5vdGU6IHRoaXMgd2lsbCBhbHdheXMgYWRkIGEgc2Nyb2xsYmFyIHRvIHdoYXRldmVyIGVsZW1lbnQgaXQgaXMgb24sIHdoaWNoIGNhblxuICAgIC8vIHBvdGVudGlhbGx5IHJlc3VsdCBpbiBkb3VibGUgc2Nyb2xsYmFycy4gSXQgc2hvdWxkbid0IGJlIGFuIGlzc3VlLCBiZWNhdXNlIHdlIHdvbid0XG4gICAgLy8gYmxvY2sgc2Nyb2xsaW5nIG9uIGEgcGFnZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHNjcm9sbGJhciBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICB9XG59XG5cbkBtaXhpbiBjZGstYTExeSB7XG4gIC5jZGstdmlzdWFsbHktaGlkZGVuIHtcbiAgICBib3JkZXI6IDA7XG4gICAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgICBoZWlnaHQ6IDFweDtcbiAgICBtYXJnaW46IC0xcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMXB4O1xuXG4gICAgLy8gQXZvaWQgYnJvd3NlcnMgcmVuZGVyaW5nIHRoZSBmb2N1cyByaW5nIGluIHNvbWUgY2FzZXMuXG4gICAgb3V0bGluZTogMDtcblxuICAgIC8vIEF2b2lkIHNvbWUgY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIgd2lsbCBzdGlsbCByZW5kZXIgdGhlIG5hdGl2ZSBjb250cm9scyAoc2VlICM5MDQ5KS5cbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICB9XG59XG5cbi8vIEFwcGxpZXMgc3R5bGVzIGZvciB1c2VycyBpbiBoaWdoIGNvbnRyYXN0IG1vZGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgYXBwbGllc1xuLy8gdG8gTWljcm9zb2Z0IGJyb3dzZXJzLiBDaHJvbWUgY2FuIGJlIGluY2x1ZGVkIGJ5IGNoZWNraW5nIGZvciB0aGUgYGh0bWxbaGNdYFxuLy8gYXR0cmlidXRlLCBob3dldmVyIENocm9tZSBoYW5kbGVzIGhpZ2ggY29udHJhc3QgZGlmZmVyZW50bHkuXG4vL1xuLy8gQHBhcmFtIHRhcmdldCBXaGljaCBraW5kIG9mIGhpZ2ggY29udHJhc3Qgc2V0dGluZyB0byB0YXJnZXQuIERlZmF1bHRzIHRvIGBhY3RpdmVgLCBjYW4gYmVcbi8vICAgIGB3aGl0ZS1vbi1ibGFja2Agb3IgYGJsYWNrLW9uLXdoaXRlYC5cbkBtaXhpbiBjZGstaGlnaC1jb250cmFzdCgkdGFyZ2V0OiBhY3RpdmUpIHtcbiAgQG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDogJHRhcmdldCkge1xuICAgIEBjb250ZW50O1xuICB9XG59XG5cbi8vIENvcmUgc3R5bGVzIHRoYXQgZW5hYmxlIG1vbml0b3JpbmcgYXV0b2ZpbGwgc3RhdGUgb2YgdGV4dCBmaWVsZHMuXG5AbWl4aW4gY2RrLXRleHQtZmllbGQge1xuICAvLyBLZXlmcmFtZXMgdGhhdCBhcHBseSBubyBzdHlsZXMsIGJ1dCBhbGxvdyB1cyB0byBtb25pdG9yIHdoZW4gYW4gdGV4dCBmaWVsZCBiZWNvbWVzIGF1dG9maWxsZWRcbiAgLy8gYnkgd2F0Y2hpbmcgZm9yIHRoZSBhbmltYXRpb24gZXZlbnRzIHRoYXQgYXJlIGZpcmVkIHdoZW4gdGhleSBzdGFydC4gTm90ZTogdGhlIC8qISovIGNvbW1lbnQgaXNcbiAgLy8gbmVlZGVkIHRvIHByZXZlbnQgTGliU2FzcyBmcm9tIHN0cmlwcGluZyB0aGUga2V5ZnJhbWVzIG91dC5cbiAgLy8gQmFzZWQgb246IGh0dHBzOi8vbWVkaXVtLmNvbS9AYnJ1bm4vZGV0ZWN0aW5nLWF1dG9maWxsZWQtZmllbGRzLWluLWphdmFzY3JpcHQtYWVkNTk4ZDI1ZGE3XG4gIEBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgey8qISovfVxuICBAa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCB7LyohKi99XG5cbiAgLmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxsIHtcbiAgICBhbmltYXRpb24tbmFtZTogY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7XG4gIH1cblxuICAuY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCkge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQ7XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIHJlc2l6ZSBoYW5kbGUgb24gYXV0b3NpemluZyB0ZXh0YXJlYXMsIGJlY2F1c2Ugd2hhdGV2ZXIgaGVpZ2h0XG4gIC8vIHRoZSB1c2VyIHJlc2l6ZWQgdG8gd2lsbCBiZSBvdmVyd3JpdHRlbiBvbmNlIHRoZXkgc3RhcnQgdHlwaW5nIGFnYWluLlxuICB0ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUge1xuICAgIHJlc2l6ZTogbm9uZTtcbiAgfVxuXG4gIC8vIFRoaXMgY2xhc3MgaXMgdGVtcG9yYXJpbHkgYXBwbGllZCB0byB0aGUgdGV4dGFyZWEgd2hlbiBpdCBpcyBiZWluZyBtZWFzdXJlZC4gSXQgaXMgaW1tZWRpYXRlbHlcbiAgLy8gcmVtb3ZlZCB3aGVuIG1lYXN1cmluZyBpcyBjb21wbGV0ZS4gV2UgdXNlIGAhaW1wb3J0YW50YCBydWxlcyBoZXJlIHRvIG1ha2Ugc3VyZSB1c2VyLXNwZWNpZmllZFxuICAvLyBydWxlcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIG1lYXN1cmVtZW50LlxuICB0ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nIHtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgLy8gSGF2aW5nIDJweCB0b3AgYW5kIGJvdHRvbSBwYWRkaW5nIHNlZW1zIHRvIGZpeCBhIGJ1ZyB3aGVyZSBDaHJvbWUgZ2V0cyBhbiBpbmNvcnJlY3RcbiAgICAvLyBtZWFzdXJlbWVudC4gV2UganVzdCBoYXZlIHRvIGFjY291bnQgZm9yIGl0IGxhdGVyIGFuZCBzdWJ0cmFjdCBpdCBvZmYgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICBwYWRkaW5nOiAycHggMCAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLy8gVXNlZCB0byBnZW5lcmF0ZSBVSURzIGZvciBrZXlmcmFtZXMgdXNlZCB0byBjaGFuZ2UgdGhlIHRleHQgZmllbGQgYXV0b2ZpbGwgc3R5bGVzLlxuJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50OiAwO1xuXG4vLyBNaXhpbiB1c2VkIHRvIGFwcGx5IGN1c3RvbSBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycyB0byBhbiBhdXRvZmlsbGVkIHRleHQgZmllbGQuXG4vLyBCYXNlZCBvbjogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjc4MTU0OS9cbi8vIHJlbW92aW5nLWlucHV0LWJhY2tncm91bmQtY29sb3VyLWZvci1jaHJvbWUtYXV0b2NvbXBsZXRlI2Fuc3dlci0zNzQzMjI2MFxuQG1peGluIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yKCRiYWNrZ3JvdW5kLCAkZm9yZWdyb3VuZDonJykge1xuICBAa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLSN7JGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50fSB7XG4gICAgdG8ge1xuICAgICAgYmFja2dyb3VuZDogJGJhY2tncm91bmQ7XG4gICAgICBAaWYgJGZvcmVncm91bmQgIT0gJycgeyBjb2xvcjogJGZvcmVncm91bmQ7IH1cbiAgICB9XG4gIH1cblxuICAmOi13ZWJraXQtYXV0b2ZpbGwge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvci0jeyRjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1jb2xvci1mcmFtZS1jb3VudH07XG4gICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogYm90aDtcbiAgfVxuXG4gICYuY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGwge1xuICAgIGFuaW1hdGlvbi1uYW1lOiBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3ItI3skY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtY29sb3ItZnJhbWUtY291bnR9O1xuICB9XG5cbiAgJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50OlxuICAgICAgJGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWNvbG9yLWZyYW1lLWNvdW50ICsgMSAhZ2xvYmFsO1xufVxuXG5cbi8vIENvcmUgc3R5bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXBwbHkgbWF0ZXJpYWwgZGVzaWduIHRyZWF0bWVudHMgdG8gYW55IGVsZW1lbnQuXG4vLyBNZWRpYSBxdWVyaWVzXG4vLyBUT0RPKGpvc2VwaHBlcnJvdHQpOiBDaGFuZ2UgJG1hdC14c21hbGwgYW5kICRtYXQtc21hbGwgdXNhZ2VzIHRvIHJlbHkgb24gQnJlYWtwb2ludE9ic2VydmVyLFxuJG1hdC14c21hbGw6ICdtYXgtd2lkdGg6IDU5OXB4JztcbiRtYXQtc21hbGw6ICdtYXgtd2lkdGg6IDk1OXB4JztcblxuLy8gVE9ETzogUmV2aXNpdCBhbGwgei1pbmRpY2VzIGJlZm9yZSBiZXRhXG4vLyB6LWluZGV4IG1hc3RlciBsaXN0XG5cbiR6LWluZGV4LWZhYjogMjAgIWRlZmF1bHQ7XG4kei1pbmRleC1kcmF3ZXI6IDEwMCAhZGVmYXVsdDtcblxuLy8gR2xvYmFsIGNvbnN0YW50c1xuJHBpOiAzLjE0MTU5MjY1O1xuXG4vLyBQYWRkaW5nIGJldHdlZW4gaW5wdXQgdG9nZ2xlcyBhbmQgdGhlaXIgbGFiZWxzXG4kbWF0LXRvZ2dsZS1wYWRkaW5nOiA4cHggIWRlZmF1bHQ7XG4vLyBXaWR0aCBhbmQgaGVpZ2h0IG9mIGlucHV0IHRvZ2dsZXNcbiRtYXQtdG9nZ2xlLXNpemU6IDIwcHggIWRlZmF1bHQ7XG5cbi8vIEVhc2luZyBDdXJ2ZXNcbi8vIFRPRE8oamVsYm91cm4pOiBhbGwgb2YgdGhlc2UgbmVlZCB0byBiZSByZXZpc2l0ZWRcblxuLy8gVGhlIGRlZmF1bHQgYW5pbWF0aW9uIGN1cnZlcyB1c2VkIGJ5IG1hdGVyaWFsIGRlc2lnbi5cbiRtYXQtbGluZWFyLW91dC1zbG93LWluLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSAhZGVmYXVsdDtcbiRtYXQtZmFzdC1vdXQtc2xvdy1pbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkgIWRlZmF1bHQ7XG4kbWF0LWZhc3Qtb3V0LWxpbmVhci1pbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpICFkZWZhdWx0O1xuXG4kZWFzZS1pbi1vdXQtY3VydmUtZnVuY3Rpb246IGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSAhZGVmYXVsdDtcblxuJHN3aWZ0LWVhc2Utb3V0LWR1cmF0aW9uOiA0MDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpICFkZWZhdWx0O1xuJHN3aWZ0LWVhc2Utb3V0OiBhbGwgJHN3aWZ0LWVhc2Utb3V0LWR1cmF0aW9uICRzd2lmdC1lYXNlLW91dC10aW1pbmctZnVuY3Rpb24gIWRlZmF1bHQ7XG5cbiRzd2lmdC1lYXNlLWluLWR1cmF0aW9uOiAzMDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMikgIWRlZmF1bHQ7XG4kc3dpZnQtZWFzZS1pbjogYWxsICRzd2lmdC1lYXNlLWluLWR1cmF0aW9uICRzd2lmdC1lYXNlLWluLXRpbWluZy1mdW5jdGlvbiAhZGVmYXVsdDtcblxuJHN3aWZ0LWVhc2UtaW4tb3V0LWR1cmF0aW9uOiA1MDBtcyAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLW91dC10aW1pbmctZnVuY3Rpb246ICRlYXNlLWluLW91dC1jdXJ2ZS1mdW5jdGlvbiAhZGVmYXVsdDtcbiRzd2lmdC1lYXNlLWluLW91dDogYWxsICRzd2lmdC1lYXNlLWluLW91dC1kdXJhdGlvbiAkc3dpZnQtZWFzZS1pbi1vdXQtdGltaW5nLWZ1bmN0aW9uICFkZWZhdWx0O1xuXG4kc3dpZnQtbGluZWFyLWR1cmF0aW9uOiA4MG1zICFkZWZhdWx0O1xuJHN3aWZ0LWxpbmVhci10aW1pbmctZnVuY3Rpb246IGxpbmVhciAhZGVmYXVsdDtcbiRzd2lmdC1saW5lYXI6IGFsbCAkc3dpZnQtbGluZWFyLWR1cmF0aW9uICRzd2lmdC1saW5lYXItdGltaW5nLWZ1bmN0aW9uICFkZWZhdWx0O1xuXG5cblxuLy8gQSBjb2xsZWN0aW9uIG9mIG1peGlucyBhbmQgQ1NTIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBhcHBseSBlbGV2YXRpb24gdG8gYSBtYXRlcmlhbFxuLy8gZWxlbWVudC5cbi8vIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vZW52aXJvbm1lbnQvZWxldmF0aW9uLmh0bWxcbi8vIEV4YW1wbGVzOlxuLy9cbi8vXG4vLyAubWF0LWZvbyB7XG4vLyAgIEBpbmNsdWRlICRtYXQtZWxldmF0aW9uKDIpO1xuLy9cbi8vICAgJjphY3RpdmUge1xuLy8gICAgIEBpbmNsdWRlICRtYXQtZWxldmF0aW9uKDgpO1xuLy8gICB9XG4vLyB9XG4vL1xuLy8gPGRpdiBpZD1cImV4dGVybmFsLWNhcmRcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejJcIj48cD5Tb21lIGNvbnRlbnQ8L3A+PC9kaXY+XG4vL1xuLy8gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBkZXNpZ24gYmVoaW5kIGhvdyBlbGV2YXRpb24gaXMgaW1wbGVtZW50ZWQsIHNlZSB0aGUgZGVzaWduIGRvYyBhdFxuLy8gaHR0cHM6Ly9nb28uZ2wvS3EwazlaLlxuXG4vLyBDb2xvcnMgZm9yIHVtYnJhLCBwZW51bWJyYSwgYW5kIGFtYmllbnQgc2hhZG93cy4gQXMgZGVzY3JpYmVkIGluIHRoZSBkZXNpZ24gZG9jLCBlYWNoIGVsZXZhdGlvblxuLy8gbGV2ZWwgaXMgY3JlYXRlZCB1c2luZyBhIHNldCBvZiAzIHNoYWRvdyB2YWx1ZXMsIG9uZSBmb3IgdW1icmEgKHRoZSBzaGFkb3cgcmVwcmVzZW50aW5nIHRoZVxuLy8gc3BhY2UgY29tcGxldGVseSBvYnNjdXJlZCBieSBhbiBvYmplY3QgcmVsYXRpdmUgdG8gaXRzIGxpZ2h0IHNvdXJjZSksIG9uZSBmb3IgcGVudW1icmEgKHRoZVxuLy8gc3BhY2UgcGFydGlhbGx5IG9ic2N1cmVkIGJ5IGFuIG9iamVjdCksIGFuZCBvbmUgZm9yIGFtYmllbnQgKHRoZSBzcGFjZSB3aGljaCBjb250YWlucyB0aGUgb2JqZWN0XG4vLyBpdHNlbGYpLiBGb3IgYSBmdXJ0aGVyIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRlcm1zIGFuZCB0aGVpciBtZWFuaW5ncywgc2VlXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VbWJyYSxfcGVudW1icmFfYW5kX2FudHVtYnJhLlxuXG4vLyBNYXBzIGZvciB0aGUgZGlmZmVyZW50IHNoYWRvdyBzZXRzIGFuZCB0aGVpciB2YWx1ZXMgd2l0aGluIGVhY2ggei1zcGFjZS4gVGhlc2UgdmFsdWVzIHdlcmVcbi8vIGNyZWF0ZWQgYnkgdGFraW5nIGEgZmV3IHJlZmVyZW5jZSBzaGFkb3cgc2V0cyBjcmVhdGVkIGJ5IEdvb2dsZSdzIERlc2lnbmVycyBhbmQgaW50ZXJwb2xhdGluZ1xuLy8gYWxsIG9mIHRoZSB2YWx1ZXMgYmV0d2VlbiB0aGVtLlxuXG5AZnVuY3Rpb24gX2dldC11bWJyYS1tYXAoJGNvbG9yLCAkb3BhY2l0eSkge1xuICAkc2hhZG93LWNvbG9yOiBpZih0eXBlLW9mKCRjb2xvcikgPT0gY29sb3IsIHJnYmEoJGNvbG9yLCAkb3BhY2l0eSAqIDAuMiksICRjb2xvcik7XG5cbiAgQHJldHVybiAoXG4gICAgMDogJzBweCAwcHggMHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOiAnMHB4IDJweCAxcHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyOiAnMHB4IDNweCAxcHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAzOiAnMHB4IDNweCAzcHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA0OiAnMHB4IDJweCA0cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA1OiAnMHB4IDNweCA1cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA2OiAnMHB4IDNweCA1cHggLTFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA3OiAnMHB4IDRweCA1cHggLTJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA4OiAnMHB4IDVweCA1cHggLTNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA5OiAnMHB4IDVweCA2cHggLTNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMDogJzBweCA2cHggNnB4IC0zcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTE6ICcwcHggNnB4IDdweCAtNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDEyOiAnMHB4IDdweCA4cHggLTRweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMzogJzBweCA3cHggOHB4IC00cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTQ6ICcwcHggN3B4IDlweCAtNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE1OiAnMHB4IDhweCA5cHggLTVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNjogJzBweCA4cHggMTBweCAtNXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE3OiAnMHB4IDhweCAxMXB4IC01cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTg6ICcwcHggOXB4IDExcHggLTVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOTogJzBweCA5cHggMTJweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIwOiAnMHB4IDEwcHggMTNweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIxOiAnMHB4IDEwcHggMTNweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIyOiAnMHB4IDEwcHggMTRweCAtNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIzOiAnMHB4IDExcHggMTRweCAtN3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI0OiAnMHB4IDExcHggMTVweCAtN3B4ICN7JHNoYWRvdy1jb2xvcn0nXG4gICk7XG59XG5cbkBmdW5jdGlvbiBfZ2V0LXBlbnVtYnJhLW1hcCgkY29sb3IsICRvcGFjaXR5KSB7XG4gICRzaGFkb3ctY29sb3I6IGlmKHR5cGUtb2YoJGNvbG9yKSA9PSBjb2xvciwgcmdiYSgkY29sb3IsICRvcGFjaXR5ICogMC4xNCksICRjb2xvcik7XG5cbiAgQHJldHVybiAoXG4gICAgMDogJzBweCAwcHggMHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxOiAnMHB4IDFweCAxcHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI6ICcwcHggMnB4IDJweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMzogJzBweCAzcHggNHB4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICA0OiAnMHB4IDRweCA1cHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDU6ICcwcHggNXB4IDhweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNjogJzBweCA2cHggMTBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNzogJzBweCA3cHggMTBweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgODogJzBweCA4cHggMTBweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgOTogJzBweCA5cHggMTJweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTA6ICcwcHggMTBweCAxNHB4IDFweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMTogJzBweCAxMXB4IDE1cHggMXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDEyOiAnMHB4IDEycHggMTdweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTM6ICcwcHggMTNweCAxOXB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNDogJzBweCAxNHB4IDIxcHggMnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE1OiAnMHB4IDE1cHggMjJweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTY6ICcwcHggMTZweCAyNHB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNzogJzBweCAxN3B4IDI2cHggMnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE4OiAnMHB4IDE4cHggMjhweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTk6ICcwcHggMTlweCAyOXB4IDJweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMDogJzBweCAyMHB4IDMxcHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIxOiAnMHB4IDIxcHggMzNweCAzcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMjI6ICcwcHggMjJweCAzNXB4IDNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMzogJzBweCAyM3B4IDM2cHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDI0OiAnMHB4IDI0cHggMzhweCAzcHggI3skc2hhZG93LWNvbG9yfSdcbiAgKTtcbn1cblxuQGZ1bmN0aW9uIF9nZXQtYW1iaWVudC1tYXAoJGNvbG9yLCAkb3BhY2l0eSkge1xuICAkc2hhZG93LWNvbG9yOiBpZih0eXBlLW9mKCRjb2xvcikgPT0gY29sb3IsIHJnYmEoJGNvbG9yLCAkb3BhY2l0eSAqIDAuMTIpLCAkY29sb3IpO1xuXG4gIEByZXR1cm4gKFxuICAgIDA6ICcwcHggMHB4IDBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTogJzBweCAxcHggM3B4IDBweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyOiAnMHB4IDFweCA1cHggMHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDM6ICcwcHggMXB4IDhweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNDogJzBweCAxcHggMTBweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNTogJzBweCAxcHggMTRweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNjogJzBweCAxcHggMThweCAwcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgNzogJzBweCAycHggMTZweCAxcHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgODogJzBweCAzcHggMTRweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgOTogJzBweCAzcHggMTZweCAycHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTA6ICcwcHggNHB4IDE4cHggM3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDExOiAnMHB4IDRweCAyMHB4IDNweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxMjogJzBweCA1cHggMjJweCA0cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTM6ICcwcHggNXB4IDI0cHggNHB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE0OiAnMHB4IDVweCAyNnB4IDRweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxNTogJzBweCA2cHggMjhweCA1cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTY6ICcwcHggNnB4IDMwcHggNXB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDE3OiAnMHB4IDZweCAzMnB4IDVweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAxODogJzBweCA3cHggMzRweCA2cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMTk6ICcwcHggN3B4IDM2cHggNnB4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIwOiAnMHB4IDhweCAzOHB4IDdweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyMTogJzBweCA4cHggNDBweCA3cHggI3skc2hhZG93LWNvbG9yfScsXG4gICAgMjI6ICcwcHggOHB4IDQycHggN3B4ICN7JHNoYWRvdy1jb2xvcn0nLFxuICAgIDIzOiAnMHB4IDlweCA0NHB4IDhweCAjeyRzaGFkb3ctY29sb3J9JyxcbiAgICAyNDogJzBweCA5cHggNDZweCA4cHggI3skc2hhZG93LWNvbG9yfSdcbiAgKTtcbn1cblxuLy8gVGhlIGRlZmF1bHQgZHVyYXRpb24gdmFsdWUgZm9yIGVsZXZhdGlvbiB0cmFuc2l0aW9ucy5cbiRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb246IDI4MG1zICFkZWZhdWx0O1xuXG4vLyBUaGUgZGVmYXVsdCBlYXNpbmcgdmFsdWUgZm9yIGVsZXZhdGlvbiB0cmFuc2l0aW9ucy5cbiRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiAkbWF0LWZhc3Qtb3V0LXNsb3ctaW4tdGltaW5nLWZ1bmN0aW9uO1xuXG4vLyBUaGUgZGVmYXVsdCBjb2xvciBmb3IgZWxldmF0aW9uIHNoYWRvd3MuXG4kbWF0LWVsZXZhdGlvbi1jb2xvcjogYmxhY2sgIWRlZmF1bHQ7XG5cbi8vIFRoZSBkZWZhdWx0IG9wYWNpdHkgc2NhbGluZyB2YWx1ZSBmb3IgZWxldmF0aW9uIHNoYWRvd3MuXG4kbWF0LWVsZXZhdGlvbi1vcGFjaXR5OiAxICFkZWZhdWx0O1xuXG4vLyBQcmVmaXggZm9yIGVsZXZhdGlvbi1yZWxhdGVkIHNlbGVjdG9ycy5cbiRfbWF0LWVsZXZhdGlvbi1wcmVmaXg6ICdtYXQtZWxldmF0aW9uLXonO1xuXG4vLyBBcHBsaWVzIHRoZSBjb3JyZWN0IGNzcyBydWxlcyB0byBhbiBlbGVtZW50IHRvIGdpdmUgaXQgdGhlIGVsZXZhdGlvbiBzcGVjaWZpZWQgYnkgJHpWYWx1ZS5cbi8vIFRoZSAkelZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNC5cbkBtaXhpbiBtYXQtZWxldmF0aW9uKCR6VmFsdWUsICRjb2xvcjogJG1hdC1lbGV2YXRpb24tY29sb3IsICRvcGFjaXR5OiAkbWF0LWVsZXZhdGlvbi1vcGFjaXR5KSB7XG4gIEBpZiB0eXBlLW9mKCR6VmFsdWUpICE9IG51bWJlciBvciBub3QgdW5pdGxlc3MoJHpWYWx1ZSkge1xuICAgIEBlcnJvciAnJHpWYWx1ZSBtdXN0IGJlIGEgdW5pdGxlc3MgbnVtYmVyJztcbiAgfVxuICBAaWYgJHpWYWx1ZSA8IDAgb3IgJHpWYWx1ZSA+IDI0IHtcbiAgICBAZXJyb3IgJyR6VmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI0JztcbiAgfVxuXG4gIGJveC1zaGFkb3c6ICN7bWFwLWdldChfZ2V0LXVtYnJhLW1hcCgkY29sb3IsICRvcGFjaXR5KSwgJHpWYWx1ZSl9LFxuICAgICAgICAgICAgICAje21hcC1nZXQoX2dldC1wZW51bWJyYS1tYXAoJGNvbG9yLCAkb3BhY2l0eSksICR6VmFsdWUpfSxcbiAgICAgICAgICAgICAgI3ttYXAtZ2V0KF9nZXQtYW1iaWVudC1tYXAoJGNvbG9yLCAkb3BhY2l0eSksICR6VmFsdWUpfTtcbn1cblxuQG1peGluIF9tYXQtdGhlbWUtZWxldmF0aW9uKCR6VmFsdWUsICR0aGVtZSwgJG9wYWNpdHk6ICRtYXQtZWxldmF0aW9uLW9wYWNpdHkpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGVsZXZhdGlvbi1jb2xvcjogbWFwLWdldCgkZm9yZWdyb3VuZCwgZWxldmF0aW9uKTtcbiAgJGVsZXZhdGlvbi1jb2xvci1vci1kZWZhdWx0OiBpZigkZWxldmF0aW9uLWNvbG9yID09IG51bGwsICRtYXQtZWxldmF0aW9uLWNvbG9yLCAkZWxldmF0aW9uLWNvbG9yKTtcblxuICBAaW5jbHVkZSBtYXQtZWxldmF0aW9uKCR6VmFsdWUsICRlbGV2YXRpb24tY29sb3Itb3ItZGVmYXVsdCwgJG9wYWNpdHkpO1xufVxuXG4vLyBBcHBsaWVzIHRoZSBlbGV2YXRpb24gdG8gYW4gZWxlbWVudCBpbiBhIG1hbm5lciB0aGF0IGFsbG93c1xuLy8gY29uc3VtZXJzIHRvIG92ZXJyaWRlIGl0IHZpYSB0aGUgTWF0ZXJpYWwgZWxldmF0aW9uIGNsYXNzZXMuXG5AbWl4aW4gbWF0LW92ZXJyaWRhYmxlLWVsZXZhdGlvbihcbiAgICAkelZhbHVlLFxuICAgICRjb2xvcjogJG1hdC1lbGV2YXRpb24tY29sb3IsXG4gICAgJG9wYWNpdHk6ICRtYXQtZWxldmF0aW9uLW9wYWNpdHkpIHtcbiAgJjpub3QoW2NsYXNzKj0nI3skX21hdC1lbGV2YXRpb24tcHJlZml4fSddKSB7XG4gICAgQGluY2x1ZGUgbWF0LWVsZXZhdGlvbigkelZhbHVlLCAkY29sb3IsICRvcGFjaXR5KTtcbiAgfVxufVxuXG5AbWl4aW4gX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oJHpWYWx1ZSwgJHRoZW1lLCAkb3BhY2l0eTogJG1hdC1lbGV2YXRpb24tb3BhY2l0eSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkZWxldmF0aW9uLWNvbG9yOiBtYXAtZ2V0KCRmb3JlZ3JvdW5kLCBlbGV2YXRpb24pO1xuICAkZWxldmF0aW9uLWNvbG9yLW9yLWRlZmF1bHQ6IGlmKCRlbGV2YXRpb24tY29sb3IgPT0gbnVsbCwgJG1hdC1lbGV2YXRpb24tY29sb3IsICRlbGV2YXRpb24tY29sb3IpO1xuXG4gIEBpbmNsdWRlIG1hdC1vdmVycmlkYWJsZS1lbGV2YXRpb24oJHpWYWx1ZSwgJGVsZXZhdGlvbi1jb2xvci1vci1kZWZhdWx0LCAkb3BhY2l0eSk7XG59XG5cbi8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgdHJhbnNpdGlvbiBwcm9wZXJ0eSBmb3IgZWxldmF0aW9uLlxuLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIGEgY29tcG9uZW50IG5lZWRzIHRvIHRyYW5zaXRpb25cbi8vIG1vcmUgdGhhbiBvbmUgcHJvcGVydHkuXG4vL1xuLy8gLmZvbyB7XG4vLyAgIHRyYW5zaXRpb246IG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi1wcm9wZXJ0eS12YWx1ZSgpLCBvcGFjaXR5IDEwMG1zIGVhc2U7XG4vLyB9XG5AZnVuY3Rpb24gbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXByb3BlcnR5LXZhbHVlKFxuICAgICRkdXJhdGlvbjogJG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi1kdXJhdGlvbixcbiAgICAkZWFzaW5nOiAkbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbikge1xuICBAcmV0dXJuIGJveC1zaGFkb3cgI3skZHVyYXRpb259ICN7JGVhc2luZ307XG59XG5cbi8vIEFwcGxpZXMgdGhlIGNvcnJlY3QgY3NzIHJ1bGVzIG5lZWRlZCB0byBoYXZlIGFuIGVsZW1lbnQgdHJhbnNpdGlvbiBiZXR3ZWVuIGVsZXZhdGlvbnMuXG4vLyBUaGlzIG1peGluIHNob3VsZCBiZSBhcHBsaWVkIHRvIGVsZW1lbnRzIHdob3NlIGVsZXZhdGlvbiB2YWx1ZXMgd2lsbCBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZWlyXG4vLyBjb250ZXh0IChlLmcuIHdoZW4gYWN0aXZlIG9yIGRpc2FibGVkKS5cbi8vXG4vLyBOT1RFKHRyYXZpc2thdWZtYW4pOiBCb3RoIHRoaXMgbWl4aW4gYW5kIHRoZSBhYm92ZSBmdW5jdGlvbiB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzIHNvIHRoZXkgY2FuXG4vLyBiZSB1c2VkIGluIHRoZSBzYW1lIHdheSBieSBjbGllbnRzLlxuQG1peGluIG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbihcbiAgICAkZHVyYXRpb246ICRtYXQtZWxldmF0aW9uLXRyYW5zaXRpb24tZHVyYXRpb24sXG4gICAgJGVhc2luZzogJG1hdC1lbGV2YXRpb24tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24pIHtcbiAgdHJhbnNpdGlvbjogbWF0LWVsZXZhdGlvbi10cmFuc2l0aW9uLXByb3BlcnR5LXZhbHVlKCRkdXJhdGlvbiwgJGVhc2luZyk7XG59XG5cbi8vIENvbG9yIHBhbGV0dGVzIGZyb20gdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLlxuLy8gU2VlIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduL2NvbG9yL1xuLy9cbi8vIENvbnRyYXN0IGNvbG9ycyBhcmUgaGFyZC1jb2RlZCBiZWNhdXNlIGl0IGlzIHRvbyBkaWZmaWN1bHQgKHByb2JhYmx5IGltcG9zc2libGUpIHRvXG4vLyBjYWxjdWxhdGUgdGhlbS4gVGhlc2UgY29udHJhc3QgY29sb3JzIGFyZSBwdWxsZWQgZnJvbSB0aGUgcHVibGljIE1hdGVyaWFsIERlc2lnbiBzcGVjIHN3YXRjaGVzLlxuLy8gV2hpbGUgdGhlIGNvbnRyYXN0IGNvbG9ycyBpbiB0aGUgc3BlYyBhcmUgbm90IHByZXNjcmlwdGl2ZSwgd2UgdXNlIHRoZW0gZm9yIGNvbnZlbmllbmNlLlxuXG5cbi8vIEBkZXByZWNhdGVkIHJlbmFtZWQgdG8gJGRhcmstcHJpbWFyeS10ZXh0LlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJGJsYWNrLTg3LW9wYWNpdHk6IHJnYmEoYmxhY2ssIDAuODcpO1xuLy8gQGRlcHJlY2F0ZWQgcmVuYW1lZCB0byAkbGlnaHQtcHJpbWFyeS10ZXh0LlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJHdoaXRlLTg3LW9wYWNpdHk6IHJnYmEod2hpdGUsIDAuODcpO1xuLy8gQGRlcHJlY2F0ZWQgdXNlICRkYXJrLVtzZWNvbmRhcnktdGV4dCxkaXNhYmxlZC10ZXh0LGRpdmlkZXJzLGZvY3VzZWRdIGluc3RlYWQuXG4vLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wXG4kYmxhY2stMTItb3BhY2l0eTogcmdiYShibGFjaywgMC4xMik7XG4vLyBAZGVwcmVjYXRlZCB1c2UgJGxpZ2h0LVtzZWNvbmRhcnktdGV4dCxkaXNhYmxlZC10ZXh0LGRpdmlkZXJzLGZvY3VzZWRdIGluc3RlYWQuXG4vLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wXG4kd2hpdGUtMTItb3BhY2l0eTogcmdiYSh3aGl0ZSwgMC4xMik7XG4vLyBAZGVwcmVjYXRlZCB1c2UgJGRhcmstW3NlY29uZGFyeS10ZXh0LGRpc2FibGVkLXRleHQsZGl2aWRlcnMsZm9jdXNlZF0gaW5zdGVhZC5cbi8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjBcbiRibGFjay02LW9wYWNpdHk6IHJnYmEoYmxhY2ssIDAuMDYpO1xuLy8gQGRlcHJlY2F0ZWQgdXNlICRsaWdodC1bc2Vjb25kYXJ5LXRleHQsZGlzYWJsZWQtdGV4dCxkaXZpZGVycyxmb2N1c2VkXSBpbnN0ZWFkLlxuLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMFxuJHdoaXRlLTYtb3BhY2l0eTogcmdiYSh3aGl0ZSwgMC4wNik7XG5cbiRkYXJrLXByaW1hcnktdGV4dDogcmdiYShibGFjaywgMC44Nyk7XG4kZGFyay1zZWNvbmRhcnktdGV4dDogcmdiYShibGFjaywgMC41NCk7XG4kZGFyay1kaXNhYmxlZC10ZXh0OiByZ2JhKGJsYWNrLCAwLjM4KTtcbiRkYXJrLWRpdmlkZXJzOiByZ2JhKGJsYWNrLCAwLjEyKTtcbiRkYXJrLWZvY3VzZWQ6IHJnYmEoYmxhY2ssIDAuMTIpO1xuJGxpZ2h0LXByaW1hcnktdGV4dDogd2hpdGU7XG4kbGlnaHQtc2Vjb25kYXJ5LXRleHQ6IHJnYmEod2hpdGUsIDAuNyk7XG4kbGlnaHQtZGlzYWJsZWQtdGV4dDogcmdiYSh3aGl0ZSwgMC41KTtcbiRsaWdodC1kaXZpZGVyczogcmdiYSh3aGl0ZSwgMC4xMik7XG4kbGlnaHQtZm9jdXNlZDogcmdiYSh3aGl0ZSwgMC4xMik7XG5cbiRtYXQtcmVkOiAoXG4gIDUwOiAjZmZlYmVlLFxuICAxMDA6ICNmZmNkZDIsXG4gIDIwMDogI2VmOWE5YSxcbiAgMzAwOiAjZTU3MzczLFxuICA0MDA6ICNlZjUzNTAsXG4gIDUwMDogI2Y0NDMzNixcbiAgNjAwOiAjZTUzOTM1LFxuICA3MDA6ICNkMzJmMmYsXG4gIDgwMDogI2M2MjgyOCxcbiAgOTAwOiAjYjcxYzFjLFxuICBBMTAwOiAjZmY4YTgwLFxuICBBMjAwOiAjZmY1MjUyLFxuICBBNDAwOiAjZmYxNzQ0LFxuICBBNzAwOiAjZDUwMDAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtcGluazogKFxuICA1MDogI2ZjZTRlYyxcbiAgMTAwOiAjZjhiYmQwLFxuICAyMDA6ICNmNDhmYjEsXG4gIDMwMDogI2YwNjI5MixcbiAgNDAwOiAjZWM0MDdhLFxuICA1MDA6ICNlOTFlNjMsXG4gIDYwMDogI2Q4MWI2MCxcbiAgNzAwOiAjYzIxODViLFxuICA4MDA6ICNhZDE0NTcsXG4gIDkwMDogIzg4MGU0ZixcbiAgQTEwMDogI2ZmODBhYixcbiAgQTIwMDogI2ZmNDA4MSxcbiAgQTQwMDogI2Y1MDA1NyxcbiAgQTcwMDogI2M1MTE2MixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LXB1cnBsZTogKFxuICA1MDogI2YzZTVmNSxcbiAgMTAwOiAjZTFiZWU3LFxuICAyMDA6ICNjZTkzZDgsXG4gIDMwMDogI2JhNjhjOCxcbiAgNDAwOiAjYWI0N2JjLFxuICA1MDA6ICM5YzI3YjAsXG4gIDYwMDogIzhlMjRhYSxcbiAgNzAwOiAjN2IxZmEyLFxuICA4MDA6ICM2YTFiOWEsXG4gIDkwMDogIzRhMTQ4YyxcbiAgQTEwMDogI2VhODBmYyxcbiAgQTIwMDogI2UwNDBmYixcbiAgQTQwMDogI2Q1MDBmOSxcbiAgQTcwMDogI2FhMDBmZixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtZGVlcC1wdXJwbGU6IChcbiAgNTA6ICNlZGU3ZjYsXG4gIDEwMDogI2QxYzRlOSxcbiAgMjAwOiAjYjM5ZGRiLFxuICAzMDA6ICM5NTc1Y2QsXG4gIDQwMDogIzdlNTdjMixcbiAgNTAwOiAjNjczYWI3LFxuICA2MDA6ICM1ZTM1YjEsXG4gIDcwMDogIzUxMmRhOCxcbiAgODAwOiAjNDUyN2EwLFxuICA5MDA6ICMzMTFiOTIsXG4gIEExMDA6ICNiMzg4ZmYsXG4gIEEyMDA6ICM3YzRkZmYsXG4gIEE0MDA6ICM2NTFmZmYsXG4gIEE3MDA6ICM2MjAwZWEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWluZGlnbzogKFxuICA1MDogI2U4ZWFmNixcbiAgMTAwOiAjYzVjYWU5LFxuICAyMDA6ICM5ZmE4ZGEsXG4gIDMwMDogIzc5ODZjYixcbiAgNDAwOiAjNWM2YmMwLFxuICA1MDA6ICMzZjUxYjUsXG4gIDYwMDogIzM5NDlhYixcbiAgNzAwOiAjMzAzZjlmLFxuICA4MDA6ICMyODM1OTMsXG4gIDkwMDogIzFhMjM3ZSxcbiAgQTEwMDogIzhjOWVmZixcbiAgQTIwMDogIzUzNmRmZSxcbiAgQTQwMDogIzNkNWFmZSxcbiAgQTcwMDogIzMwNGZmZSxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtYmx1ZTogKFxuICA1MDogI2UzZjJmZCxcbiAgMTAwOiAjYmJkZWZiLFxuICAyMDA6ICM5MGNhZjksXG4gIDMwMDogIzY0YjVmNixcbiAgNDAwOiAjNDJhNWY1LFxuICA1MDA6ICMyMTk2ZjMsXG4gIDYwMDogIzFlODhlNSxcbiAgNzAwOiAjMTk3NmQyLFxuICA4MDA6ICMxNTY1YzAsXG4gIDkwMDogIzBkNDdhMSxcbiAgQTEwMDogIzgyYjFmZixcbiAgQTIwMDogIzQ0OGFmZixcbiAgQTQwMDogIzI5NzlmZixcbiAgQTcwMDogIzI5NjJmZixcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWxpZ2h0LWJsdWU6IChcbiAgNTA6ICNlMWY1ZmUsXG4gIDEwMDogI2IzZTVmYyxcbiAgMjAwOiAjODFkNGZhLFxuICAzMDA6ICM0ZmMzZjcsXG4gIDQwMDogIzI5YjZmNixcbiAgNTAwOiAjMDNhOWY0LFxuICA2MDA6ICMwMzliZTUsXG4gIDcwMDogIzAyODhkMSxcbiAgODAwOiAjMDI3N2JkLFxuICA5MDA6ICMwMTU3OWIsXG4gIEExMDA6ICM4MGQ4ZmYsXG4gIEEyMDA6ICM0MGM0ZmYsXG4gIEE0MDA6ICMwMGIwZmYsXG4gIEE3MDA6ICMwMDkxZWEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtY3lhbjogKFxuICA1MDogI2UwZjdmYSxcbiAgMTAwOiAjYjJlYmYyLFxuICAyMDA6ICM4MGRlZWEsXG4gIDMwMDogIzRkZDBlMSxcbiAgNDAwOiAjMjZjNmRhLFxuICA1MDA6ICMwMGJjZDQsXG4gIDYwMDogIzAwYWNjMSxcbiAgNzAwOiAjMDA5N2E3LFxuICA4MDA6ICMwMDgzOGYsXG4gIDkwMDogIzAwNjA2NCxcbiAgQTEwMDogIzg0ZmZmZixcbiAgQTIwMDogIzE4ZmZmZixcbiAgQTQwMDogIzAwZTVmZixcbiAgQTcwMDogIzAwYjhkNCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LXRlYWw6IChcbiAgNTA6ICNlMGYyZjEsXG4gIDEwMDogI2IyZGZkYixcbiAgMjAwOiAjODBjYmM0LFxuICAzMDA6ICM0ZGI2YWMsXG4gIDQwMDogIzI2YTY5YSxcbiAgNTAwOiAjMDA5Njg4LFxuICA2MDA6ICMwMDg5N2IsXG4gIDcwMDogIzAwNzk2YixcbiAgODAwOiAjMDA2OTVjLFxuICA5MDA6ICMwMDRkNDAsXG4gIEExMDA6ICNhN2ZmZWIsXG4gIEEyMDA6ICM2NGZmZGEsXG4gIEE0MDA6ICMxZGU5YjYsXG4gIEE3MDA6ICMwMGJmYTUsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE3MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgKVxuKTtcblxuJG1hdC1ncmVlbjogKFxuICA1MDogI2U4ZjVlOSxcbiAgMTAwOiAjYzhlNmM5LFxuICAyMDA6ICNhNWQ2YTcsXG4gIDMwMDogIzgxYzc4NCxcbiAgNDAwOiAjNjZiYjZhLFxuICA1MDA6ICM0Y2FmNTAsXG4gIDYwMDogIzQzYTA0NyxcbiAgNzAwOiAjMzg4ZTNjLFxuICA4MDA6ICMyZTdkMzIsXG4gIDkwMDogIzFiNWUyMCxcbiAgQTEwMDogI2I5ZjZjYSxcbiAgQTIwMDogIzY5ZjBhZSxcbiAgQTQwMDogIzAwZTY3NixcbiAgQTcwMDogIzAwYzg1MyxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtbGlnaHQtZ3JlZW46IChcbiAgNTA6ICNmMWY4ZTksXG4gIDEwMDogI2RjZWRjOCxcbiAgMjAwOiAjYzVlMWE1LFxuICAzMDA6ICNhZWQ1ODEsXG4gIDQwMDogIzljY2M2NSxcbiAgNTAwOiAjOGJjMzRhLFxuICA2MDA6ICM3Y2IzNDIsXG4gIDcwMDogIzY4OWYzOCxcbiAgODAwOiAjNTU4YjJmLFxuICA5MDA6ICMzMzY5MWUsXG4gIEExMDA6ICNjY2ZmOTAsXG4gIEEyMDA6ICNiMmZmNTksXG4gIEE0MDA6ICM3NmZmMDMsXG4gIEE3MDA6ICM2NGRkMTcsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA3MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQtbGltZTogKFxuICA1MDogI2Y5ZmJlNyxcbiAgMTAwOiAjZjBmNGMzLFxuICAyMDA6ICNlNmVlOWMsXG4gIDMwMDogI2RjZTc3NSxcbiAgNDAwOiAjZDRlMTU3LFxuICA1MDA6ICNjZGRjMzksXG4gIDYwMDogI2MwY2EzMyxcbiAgNzAwOiAjYWZiNDJiLFxuICA4MDA6ICM5ZTlkMjQsXG4gIDkwMDogIzgyNzcxNyxcbiAgQTEwMDogI2Y0ZmY4MSxcbiAgQTIwMDogI2VlZmY0MSxcbiAgQTQwMDogI2M2ZmYwMCxcbiAgQTcwMDogI2FlZWEwMCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDkwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEE0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gIClcbik7XG5cbiRtYXQteWVsbG93OiAoXG4gIDUwOiAjZmZmZGU3LFxuICAxMDA6ICNmZmY5YzQsXG4gIDIwMDogI2ZmZjU5ZCxcbiAgMzAwOiAjZmZmMTc2LFxuICA0MDA6ICNmZmVlNTgsXG4gIDUwMDogI2ZmZWIzYixcbiAgNjAwOiAjZmRkODM1LFxuICA3MDA6ICNmYmMwMmQsXG4gIDgwMDogI2Y5YTgyNSxcbiAgOTAwOiAjZjU3ZjE3LFxuICBBMTAwOiAjZmZmZjhkLFxuICBBMjAwOiAjZmZmZjAwLFxuICBBNDAwOiAjZmZlYTAwLFxuICBBNzAwOiAjZmZkNjAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWFtYmVyOiAoXG4gIDUwOiAjZmZmOGUxLFxuICAxMDA6ICNmZmVjYjMsXG4gIDIwMDogI2ZmZTA4MixcbiAgMzAwOiAjZmZkNTRmLFxuICA0MDA6ICNmZmNhMjgsXG4gIDUwMDogI2ZmYzEwNyxcbiAgNjAwOiAjZmZiMzAwLFxuICA3MDA6ICNmZmEwMDAsXG4gIDgwMDogI2ZmOGYwMCxcbiAgOTAwOiAjZmY2ZjAwLFxuICBBMTAwOiAjZmZlNTdmLFxuICBBMjAwOiAjZmZkNzQwLFxuICBBNDAwOiAjZmZjNDAwLFxuICBBNzAwOiAjZmZhYjAwLFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgODAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LW9yYW5nZTogKFxuICA1MDogI2ZmZjNlMCxcbiAgMTAwOiAjZmZlMGIyLFxuICAyMDA6ICNmZmNjODAsXG4gIDMwMDogI2ZmYjc0ZCxcbiAgNDAwOiAjZmZhNzI2LFxuICA1MDA6ICNmZjk4MDAsXG4gIDYwMDogI2ZiOGMwMCxcbiAgNzAwOiAjZjU3YzAwLFxuICA4MDA6ICNlZjZjMDAsXG4gIDkwMDogI2U2NTEwMCxcbiAgQTEwMDogI2ZmZDE4MCxcbiAgQTIwMDogI2ZmYWI0MCxcbiAgQTQwMDogI2ZmOTEwMCxcbiAgQTcwMDogI2ZmNmQwMCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDUwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDYwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogYmxhY2ssXG4gIClcbik7XG5cbiRtYXQtZGVlcC1vcmFuZ2U6IChcbiAgNTA6ICNmYmU5ZTcsXG4gIDEwMDogI2ZmY2NiYyxcbiAgMjAwOiAjZmZhYjkxLFxuICAzMDA6ICNmZjhhNjUsXG4gIDQwMDogI2ZmNzA0MyxcbiAgNTAwOiAjZmY1NzIyLFxuICA2MDA6ICNmNDUxMWUsXG4gIDcwMDogI2U2NGExOSxcbiAgODAwOiAjZDg0MzE1LFxuICA5MDA6ICNiZjM2MGMsXG4gIEExMDA6ICNmZjllODAsXG4gIEEyMDA6ICNmZjZlNDAsXG4gIEE0MDA6ICNmZjNkMDAsXG4gIEE3MDA6ICNkZDJjMDAsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWJyb3duOiAoXG4gIDUwOiAjZWZlYmU5LFxuICAxMDA6ICNkN2NjYzgsXG4gIDIwMDogI2JjYWFhNCxcbiAgMzAwOiAjYTE4ODdmLFxuICA0MDA6ICM4ZDZlNjMsXG4gIDUwMDogIzc5NTU0OCxcbiAgNjAwOiAjNmQ0YzQxLFxuICA3MDA6ICM1ZDQwMzcsXG4gIDgwMDogIzRlMzQyZSxcbiAgOTAwOiAjM2UyNzIzLFxuICBBMTAwOiAjZDdjY2M4LFxuICBBMjAwOiAjYmNhYWE0LFxuICBBNDAwOiAjOGQ2ZTYzLFxuICBBNzAwOiAjNWQ0MDM3LFxuICBjb250cmFzdDogKFxuICAgIDUwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMTAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgMzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4kbWF0LWdyZXk6IChcbiAgNTA6ICNmYWZhZmEsXG4gIDEwMDogI2Y1ZjVmNSxcbiAgMjAwOiAjZWVlZWVlLFxuICAzMDA6ICNlMGUwZTAsXG4gIDQwMDogI2JkYmRiZCxcbiAgNTAwOiAjOWU5ZTllLFxuICA2MDA6ICM3NTc1NzUsXG4gIDcwMDogIzYxNjE2MSxcbiAgODAwOiAjNDI0MjQyLFxuICA5MDA6ICMyMTIxMjEsXG4gIEExMDA6ICNmZmZmZmYsXG4gIEEyMDA6ICNlZWVlZWUsXG4gIEE0MDA6ICNiZGJkYmQsXG4gIEE3MDA6ICM2MTYxNjEsXG4gIGNvbnRyYXN0OiAoXG4gICAgNTA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAxMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICAzMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA0MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICA2MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDgwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA5MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgQTEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIEEyMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBNDAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgKVxuKTtcblxuLy8gQWxpYXMgZm9yIGFsdGVybmF0ZSBzcGVsbGluZy5cbiRtYXQtZ3JheTogJG1hdC1ncmV5O1xuXG4kbWF0LWJsdWUtZ3JleTogKFxuICA1MDogI2VjZWZmMSxcbiAgMTAwOiAjY2ZkOGRjLFxuICAyMDA6ICNiMGJlYzUsXG4gIDMwMDogIzkwYTRhZSxcbiAgNDAwOiAjNzg5MDljLFxuICA1MDA6ICM2MDdkOGIsXG4gIDYwMDogIzU0NmU3YSxcbiAgNzAwOiAjNDU1YTY0LFxuICA4MDA6ICMzNzQ3NGYsXG4gIDkwMDogIzI2MzIzOCxcbiAgQTEwMDogI2NmZDhkYyxcbiAgQTIwMDogI2IwYmVjNSxcbiAgQTQwMDogIzc4OTA5YyxcbiAgQTcwMDogIzQ1NWE2NCxcbiAgY29udHJhc3Q6IChcbiAgICA1MDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDEwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDIwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDMwMDogJGRhcmstcHJpbWFyeS10ZXh0LFxuICAgIDQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA1MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgNjAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIDcwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICA4MDA6ICRsaWdodC1wcmltYXJ5LXRleHQsXG4gICAgOTAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICAgIEExMDA6ICRkYXJrLXByaW1hcnktdGV4dCxcbiAgICBBMjAwOiAkZGFyay1wcmltYXJ5LXRleHQsXG4gICAgQTQwMDogJGxpZ2h0LXByaW1hcnktdGV4dCxcbiAgICBBNzAwOiAkbGlnaHQtcHJpbWFyeS10ZXh0LFxuICApXG4pO1xuXG4vLyBBbGlhcyBmb3IgYWx0ZXJuYXRlIHNwZWxsaW5nLlxuJG1hdC1ibHVlLWdyYXk6ICRtYXQtYmx1ZS1ncmV5O1xuXG5cbi8vIEJhY2tncm91bmQgcGFsZXR0ZSBmb3IgbGlnaHQgdGhlbWVzLlxuJG1hdC1saWdodC10aGVtZS1iYWNrZ3JvdW5kOiAoXG4gIHN0YXR1cy1iYXI6IG1hcF9nZXQoJG1hdC1ncmV5LCAzMDApLFxuICBhcHAtYmFyOiAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgMTAwKSxcbiAgYmFja2dyb3VuZDogbWFwX2dldCgkbWF0LWdyZXksIDUwKSxcbiAgaG92ZXI6ICAgICAgcmdiYShibGFjaywgMC4wNCksIC8vIFRPRE8oa2FyYSk6IGNoZWNrIHN0eWxlIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYXG4gIGNhcmQ6ICAgICAgIHdoaXRlLFxuICBkaWFsb2c6ICAgICB3aGl0ZSxcbiAgZGlzYWJsZWQtYnV0dG9uOiByZ2JhKGJsYWNrLCAwLjEyKSxcbiAgcmFpc2VkLWJ1dHRvbjogd2hpdGUsXG4gIGZvY3VzZWQtYnV0dG9uOiAkZGFyay1mb2N1c2VkLFxuICBzZWxlY3RlZC1idXR0b246IG1hcF9nZXQoJG1hdC1ncmV5LCAzMDApLFxuICBzZWxlY3RlZC1kaXNhYmxlZC1idXR0b246IG1hcF9nZXQoJG1hdC1ncmV5LCA0MDApLFxuICBkaXNhYmxlZC1idXR0b24tdG9nZ2xlOiBtYXBfZ2V0KCRtYXQtZ3JleSwgMjAwKSxcbiAgdW5zZWxlY3RlZC1jaGlwOiBtYXBfZ2V0KCRtYXQtZ3JleSwgMzAwKSxcbiAgZGlzYWJsZWQtbGlzdC1vcHRpb246IG1hcF9nZXQoJG1hdC1ncmV5LCAyMDApLFxuKTtcblxuLy8gQmFja2dyb3VuZCBwYWxldHRlIGZvciBkYXJrIHRoZW1lcy5cbiRtYXQtZGFyay10aGVtZS1iYWNrZ3JvdW5kOiAoXG4gIHN0YXR1cy1iYXI6IGJsYWNrLFxuICBhcHAtYmFyOiAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgOTAwKSxcbiAgYmFja2dyb3VuZDogIzMwMzAzMCxcbiAgaG92ZXI6ICAgICAgcmdiYSh3aGl0ZSwgMC4wNCksIC8vIFRPRE8oa2FyYSk6IGNoZWNrIHN0eWxlIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYXG4gIGNhcmQ6ICAgICAgIG1hcF9nZXQoJG1hdC1ncmV5LCA4MDApLFxuICBkaWFsb2c6ICAgICBtYXBfZ2V0KCRtYXQtZ3JleSwgODAwKSxcbiAgZGlzYWJsZWQtYnV0dG9uOiByZ2JhKHdoaXRlLCAwLjEyKSxcbiAgcmFpc2VkLWJ1dHRvbjogbWFwLWdldCgkbWF0LWdyZXksIDgwMCksXG4gIGZvY3VzZWQtYnV0dG9uOiAkbGlnaHQtZm9jdXNlZCxcbiAgc2VsZWN0ZWQtYnV0dG9uOiBtYXBfZ2V0KCRtYXQtZ3JleSwgOTAwKSxcbiAgc2VsZWN0ZWQtZGlzYWJsZWQtYnV0dG9uOiBtYXBfZ2V0KCRtYXQtZ3JleSwgODAwKSxcbiAgZGlzYWJsZWQtYnV0dG9uLXRvZ2dsZTogYmxhY2ssXG4gIHVuc2VsZWN0ZWQtY2hpcDogbWFwX2dldCgkbWF0LWdyZXksIDcwMCksXG4gIGRpc2FibGVkLWxpc3Qtb3B0aW9uOiBibGFjayxcbik7XG5cbi8vIEZvcmVncm91bmQgcGFsZXR0ZSBmb3IgbGlnaHQgdGhlbWVzLlxuJG1hdC1saWdodC10aGVtZS1mb3JlZ3JvdW5kOiAoXG4gIGJhc2U6ICAgICAgICAgICAgICBibGFjayxcbiAgZGl2aWRlcjogICAgICAgICAgICRkYXJrLWRpdmlkZXJzLFxuICBkaXZpZGVyczogICAgICAgICAgJGRhcmstZGl2aWRlcnMsXG4gIGRpc2FibGVkOiAgICAgICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBkaXNhYmxlZC1idXR0b246ICAgcmdiYShibGFjaywgMC4yNiksXG4gIGRpc2FibGVkLXRleHQ6ICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBlbGV2YXRpb246ICAgICAgICAgYmxhY2ssXG4gIGhpbnQtdGV4dDogICAgICAgICAkZGFyay1kaXNhYmxlZC10ZXh0LFxuICBzZWNvbmRhcnktdGV4dDogICAgJGRhcmstc2Vjb25kYXJ5LXRleHQsXG4gIGljb246ICAgICAgICAgICAgICByZ2JhKGJsYWNrLCAwLjU0KSxcbiAgaWNvbnM6ICAgICAgICAgICAgIHJnYmEoYmxhY2ssIDAuNTQpLFxuICB0ZXh0OiAgICAgICAgICAgICAgcmdiYShibGFjaywgMC44NyksXG4gIHNsaWRlci1taW46ICAgICAgICByZ2JhKGJsYWNrLCAwLjg3KSxcbiAgc2xpZGVyLW9mZjogICAgICAgIHJnYmEoYmxhY2ssIDAuMjYpLFxuICBzbGlkZXItb2ZmLWFjdGl2ZTogcmdiYShibGFjaywgMC4zOCksXG4pO1xuXG4vLyBGb3JlZ3JvdW5kIHBhbGV0dGUgZm9yIGRhcmsgdGhlbWVzLlxuJG1hdC1kYXJrLXRoZW1lLWZvcmVncm91bmQ6IChcbiAgYmFzZTogICAgICAgICAgICAgIHdoaXRlLFxuICBkaXZpZGVyOiAgICAgICAgICAgJGxpZ2h0LWRpdmlkZXJzLFxuICBkaXZpZGVyczogICAgICAgICAgJGxpZ2h0LWRpdmlkZXJzLFxuICBkaXNhYmxlZDogICAgICAgICAgJGxpZ2h0LWRpc2FibGVkLXRleHQsXG4gIGRpc2FibGVkLWJ1dHRvbjogICByZ2JhKHdoaXRlLCAwLjMpLFxuICBkaXNhYmxlZC10ZXh0OiAgICAgJGxpZ2h0LWRpc2FibGVkLXRleHQsXG4gIGVsZXZhdGlvbjogICAgICAgICBibGFjayxcbiAgaGludC10ZXh0OiAgICAgICAgICRsaWdodC1kaXNhYmxlZC10ZXh0LFxuICBzZWNvbmRhcnktdGV4dDogICAgJGxpZ2h0LXNlY29uZGFyeS10ZXh0LFxuICBpY29uOiAgICAgICAgICAgICAgd2hpdGUsXG4gIGljb25zOiAgICAgICAgICAgICB3aGl0ZSxcbiAgdGV4dDogICAgICAgICAgICAgIHdoaXRlLFxuICBzbGlkZXItbWluOiAgICAgICAgd2hpdGUsXG4gIHNsaWRlci1vZmY6ICAgICAgICByZ2JhKHdoaXRlLCAwLjMpLFxuICBzbGlkZXItb2ZmLWFjdGl2ZTogcmdiYSh3aGl0ZSwgMC4zKSxcbik7XG5cblxuXG4vLyBGb3IgYSBnaXZlbiBodWUgaW4gYSBwYWxldHRlLCByZXR1cm4gdGhlIGNvbnRyYXN0IGNvbG9yIGZyb20gdGhlIG1hcCBvZiBjb250cmFzdCBwYWxldHRlcy5cbi8vIEBwYXJhbSAkY29sb3ItbWFwXG4vLyBAcGFyYW0gJGh1ZVxuQGZ1bmN0aW9uIG1hdC1jb250cmFzdCgkcGFsZXR0ZSwgJGh1ZSkge1xuICBAcmV0dXJuIG1hcC1nZXQobWFwLWdldCgkcGFsZXR0ZSwgY29udHJhc3QpLCAkaHVlKTtcbn1cblxuXG4vLyBDcmVhdGVzIGEgbWFwIG9mIGh1ZXMgdG8gY29sb3JzIGZvciBhIHRoZW1lLiBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIGEgdGhlbWUgcGFsZXR0ZSBpbiB0ZXJtc1xuLy8gb2YgdGhlIE1hdGVyaWFsIERlc2lnbiBodWVzLlxuLy8gQHBhcmFtICRjb2xvci1tYXBcbi8vIEBwYXJhbSAkcHJpbWFyeVxuLy8gQHBhcmFtICRsaWdodGVyXG5AZnVuY3Rpb24gbWF0LXBhbGV0dGUoJGJhc2UtcGFsZXR0ZSwgJGRlZmF1bHQ6IDUwMCwgJGxpZ2h0ZXI6IDEwMCwgJGRhcmtlcjogNzAwKSB7XG4gICRyZXN1bHQ6IG1hcF9tZXJnZSgkYmFzZS1wYWxldHRlLCAoXG4gICAgZGVmYXVsdDogbWFwLWdldCgkYmFzZS1wYWxldHRlLCAkZGVmYXVsdCksXG4gICAgbGlnaHRlcjogbWFwLWdldCgkYmFzZS1wYWxldHRlLCAkbGlnaHRlciksXG4gICAgZGFya2VyOiBtYXAtZ2V0KCRiYXNlLXBhbGV0dGUsICRkYXJrZXIpLFxuXG4gICAgZGVmYXVsdC1jb250cmFzdDogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRkZWZhdWx0KSxcbiAgICBsaWdodGVyLWNvbnRyYXN0OiBtYXQtY29udHJhc3QoJGJhc2UtcGFsZXR0ZSwgJGxpZ2h0ZXIpLFxuICAgIGRhcmtlci1jb250cmFzdDogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRkYXJrZXIpXG4gICkpO1xuXG4gIC8vIEZvciBlYWNoIGh1ZSBpbiB0aGUgcGFsZXR0ZSwgYWRkIGEgXCItY29udHJhc3RcIiBjb2xvciB0byB0aGUgbWFwLlxuICBAZWFjaCAkaHVlLCAkY29sb3IgaW4gJGJhc2UtcGFsZXR0ZSB7XG4gICAgJHJlc3VsdDogbWFwX21lcmdlKCRyZXN1bHQsIChcbiAgICAgICcjeyRodWV9LWNvbnRyYXN0JzogbWF0LWNvbnRyYXN0KCRiYXNlLXBhbGV0dGUsICRodWUpXG4gICAgKSk7XG4gIH1cblxuICBAcmV0dXJuICRyZXN1bHQ7XG59XG5cblxuLy8gR2V0cyBhIGNvbG9yIGZyb20gYSB0aGVtZSBwYWxldHRlICh0aGUgb3V0cHV0IG9mIG1hdC1wYWxldHRlKS5cbi8vIFRoZSBodWUgY2FuIGJlIG9uZSBvZiB0aGUgc3RhbmRhcmQgdmFsdWVzICg1MDAsIEE0MDAsIGV0Yy4pLCBvbmUgb2YgdGhlIHRocmVlIHByZWNvbmZpZ3VyZWRcbi8vIGh1ZXMgKGRlZmF1bHQsIGxpZ2h0ZXIsIGRhcmtlciksIG9yIGFueSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgcHJlZml4ZWQgd2l0aCBcIi1jb250cmFzdFwiLlxuLy9cbi8vIEBwYXJhbSAkY29sb3ItbWFwIFRoZSB0aGVtZSBwYWxldHRlIChvdXRwdXQgb2YgbWF0LXBhbGV0dGUpLlxuLy8gQHBhcmFtICRodWUgVGhlIGh1ZSBmcm9tIHRoZSBwYWxldHRlIHRvIHVzZS4gSWYgdGhpcyBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgaXQgd2lsbFxuLy8gICAgIGJlIHRyZWF0ZWQgYXMgb3BhY2l0eS5cbi8vIEBwYXJhbSAkb3BhY2l0eSBUaGUgYWxwaGEgY2hhbm5lbCB2YWx1ZSBmb3IgdGhlIGNvbG9yLlxuQGZ1bmN0aW9uIG1hdC1jb2xvcigkcGFsZXR0ZSwgJGh1ZTogZGVmYXVsdCwgJG9wYWNpdHk6IG51bGwpIHtcbiAgLy8gSWYgaHVlS2V5IGlzIGEgbnVtYmVyIGJldHdlZW4gemVybyBhbmQgb25lLCB0aGVuIGl0IGFjdHVhbGx5IGNvbnRhaW5zIGFuXG4gIC8vIG9wYWNpdHkgdmFsdWUsIHNvIHJlY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGRlZmF1bHQgaHVlIGFuZCB0aGF0IGdpdmVuIG9wYWNpdHkuXG4gIEBpZiB0eXBlLW9mKCRodWUpID09IG51bWJlciBhbmQgJGh1ZSA+PSAwIGFuZCAkaHVlIDw9IDEge1xuICAgIEByZXR1cm4gbWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LCAkaHVlKTtcbiAgfVxuXG4gICRjb2xvcjogbWFwLWdldCgkcGFsZXR0ZSwgJGh1ZSk7XG5cbiAgQGlmICh0eXBlLW9mKCRjb2xvcikgIT0gY29sb3IpIHtcbiAgICAvLyBJZiB0aGUgJGNvbG9yIHJlc29sdmVkIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgZnJvbSBhIGNvbG9yIChlLmcuIGEgQ1NTIHZhcmlhYmxlKSxcbiAgICAvLyB3ZSBjYW4ndCBhcHBseSB0aGUgb3BhY2l0eSBhbnl3YXkgc28gd2UgcmV0dXJuIHRoZSB2YWx1ZSBhcyBpcywgb3RoZXJ3aXNlIFNhc3MgY2FuXG4gICAgLy8gdGhyb3cgYW4gZXJyb3Igb3Igb3V0cHV0IHNvbWV0aGluZyBpbnZhbGlkLlxuICAgIEByZXR1cm4gJGNvbG9yO1xuICB9XG5cbiAgQHJldHVybiByZ2JhKCRjb2xvciwgaWYoJG9wYWNpdHkgPT0gbnVsbCwgb3BhY2l0eSgkY29sb3IpLCAkb3BhY2l0eSkpO1xufVxuXG5cbi8vIENyZWF0ZXMgYSBjb250YWluZXIgb2JqZWN0IGZvciBhIGxpZ2h0IHRoZW1lIHRvIGJlIGdpdmVuIHRvIGluZGl2aWR1YWwgY29tcG9uZW50IHRoZW1lIG1peGlucy5cbkBmdW5jdGlvbiBtYXQtbGlnaHQtdGhlbWUoJHByaW1hcnksICRhY2NlbnQsICR3YXJuOiBtYXQtcGFsZXR0ZSgkbWF0LXJlZCkpIHtcbiAgQHJldHVybiAoXG4gICAgcHJpbWFyeTogJHByaW1hcnksXG4gICAgYWNjZW50OiAkYWNjZW50LFxuICAgIHdhcm46ICR3YXJuLFxuICAgIGlzLWRhcms6IGZhbHNlLFxuICAgIGZvcmVncm91bmQ6ICRtYXQtbGlnaHQtdGhlbWUtZm9yZWdyb3VuZCxcbiAgICBiYWNrZ3JvdW5kOiAkbWF0LWxpZ2h0LXRoZW1lLWJhY2tncm91bmQsXG4gICk7XG59XG5cblxuLy8gQ3JlYXRlcyBhIGNvbnRhaW5lciBvYmplY3QgZm9yIGEgZGFyayB0aGVtZSB0byBiZSBnaXZlbiB0byBpbmRpdmlkdWFsIGNvbXBvbmVudCB0aGVtZSBtaXhpbnMuXG5AZnVuY3Rpb24gbWF0LWRhcmstdGhlbWUoJHByaW1hcnksICRhY2NlbnQsICR3YXJuOiBtYXQtcGFsZXR0ZSgkbWF0LXJlZCkpIHtcbiAgQHJldHVybiAoXG4gICAgcHJpbWFyeTogJHByaW1hcnksXG4gICAgYWNjZW50OiAkYWNjZW50LFxuICAgIHdhcm46ICR3YXJuLFxuICAgIGlzLWRhcms6IHRydWUsXG4gICAgZm9yZWdyb3VuZDogJG1hdC1kYXJrLXRoZW1lLWZvcmVncm91bmQsXG4gICAgYmFja2dyb3VuZDogJG1hdC1kYXJrLXRoZW1lLWJhY2tncm91bmQsXG4gICk7XG59XG5cblxuXG4kbWF0LXJpcHBsZS1jb2xvci1vcGFjaXR5OiAwLjE7XG5cbkBtaXhpbiBtYXQtcmlwcGxlKCkge1xuXG4gIC8vIFRoZSBob3N0IGVsZW1lbnQgb2YgYW4gbWF0LXJpcHBsZSBkaXJlY3RpdmUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgcG9zaXRpb24gb2YgXCJhYnNvbHV0ZVwiIG9yXG4gIC8vIFwicmVsYXRpdmVcIiBzbyB0aGF0IHRoZSByaXBwbGVzIGluc2lkZSBhcmUgY29ycmVjdGx5IHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGUgY29udGFpbmVyLlxuICAubWF0LXJpcHBsZSB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAgIC8vIEJ5IGRlZmF1bHQsIGV2ZXJ5IHJpcHBsZSBjb250YWluZXIgc2hvdWxkIGhhdmUgcG9zaXRpb246IHJlbGF0aXZlIGluIGZhdm9yIG9mIGNyZWF0aW5nIGFuXG4gICAgLy8gZWFzeSBBUEkgZm9yIGRldmVsb3BlcnMgdXNpbmcgdGhlIE1hdFJpcHBsZSBkaXJlY3RpdmUuXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5cbiAgLm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWQge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG5cbiAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgIHRyYW5zaXRpb246IG9wYWNpdHksIHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcblxuICAgIC8vIEluIGhpZ2ggY29udHJhc3QgbW9kZSB0aGUgcmlwcGxlIGlzIG9wYXF1ZSwgY2F1c2luZyBpdCB0byBvYnN0cnVjdCB0aGUgY29udGVudC5cbiAgICBAaW5jbHVkZSBjZGstaGlnaC1jb250cmFzdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vKiBUaGVtZSBmb3IgdGhlIHJpcHBsZSBlbGVtZW50cy4qL1xuQG1peGluIG1hdC1yaXBwbGUtdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXBfZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRmb3JlZ3JvdW5kLWJhc2U6IG1hcF9nZXQoJGZvcmVncm91bmQsIGJhc2UpO1xuXG4gIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIC8vIElmIHRoZSByaXBwbGUgY29sb3IgaXMgcmVzb2x2ZXMgdG8gYSBjb2xvciAqdHlwZSosIHdlIGNhbiB1c2UgaXQgZGlyZWN0bHksIG90aGVyd2lzZVxuICAgIC8vIChlLmcuIGl0IHJlc29sdmVzIHRvIGEgQ1NTIHZhcmlhYmxlKSB3ZSBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIGNvbG9yIGFuZCBzZXR0aW5nIGFuIG9wYWNpdHkuXG4gICAgQGlmICh0eXBlLW9mKCRmb3JlZ3JvdW5kLWJhc2UpID09IGNvbG9yKSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCRmb3JlZ3JvdW5kLWJhc2UsICRtYXQtcmlwcGxlLWNvbG9yLW9wYWNpdHkpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZm9yZWdyb3VuZC1iYXNlO1xuICAgICAgb3BhY2l0eTogJG1hdC1yaXBwbGUtY29sb3Itb3BhY2l0eTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFV0aWxpdHkgZm9yIGZldGNoaW5nIGEgbmVzdGVkIHZhbHVlIGZyb20gYSB0eXBvZ3JhcGh5IGNvbmZpZy5cbkBmdW5jdGlvbiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgJG5hbWUpIHtcbiAgQHJldHVybiBtYXAtZ2V0KG1hcC1nZXQoJGNvbmZpZywgJGxldmVsKSwgJG5hbWUpO1xufVxuXG4vLyBHZXRzIHRoZSBmb250IHNpemUgZm9yIGEgbGV2ZWwgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb25maWcuXG5AZnVuY3Rpb24gbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCAkbGV2ZWwpIHtcbiAgQHJldHVybiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgZm9udC1zaXplKTtcbn1cblxuLy8gR2V0cyB0aGUgbGluZSBoZWlnaHQgZm9yIGEgbGV2ZWwgaW5zaWRlIGEgdHlwb2dyYXBoeSBjb25maWcuXG5AZnVuY3Rpb24gbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsICRsZXZlbCkge1xuICBAcmV0dXJuIF9tYXQtZ2V0LXR5cGUtdmFsdWUoJGNvbmZpZywgJGxldmVsLCBsaW5lLWhlaWdodCk7XG59XG5cbi8vIEdldHMgdGhlIGZvbnQgd2VpZ2h0IGZvciBhIGxldmVsIGluc2lkZSBhIHR5cG9ncmFwaHkgY29uZmlnLlxuQGZ1bmN0aW9uIG1hdC1mb250LXdlaWdodCgkY29uZmlnLCAkbGV2ZWwpIHtcbiAgQHJldHVybiBfbWF0LWdldC10eXBlLXZhbHVlKCRjb25maWcsICRsZXZlbCwgZm9udC13ZWlnaHQpO1xufVxuXG4vLyBHZXRzIHRoZSBsZXR0ZXIgc3BhY2luZyBmb3IgYSBsZXZlbCBpbnNpZGUgYSB0eXBvZ3JhcGh5IGNvbmZpZy5cbkBmdW5jdGlvbiBtYXQtbGV0dGVyLXNwYWNpbmcoJGNvbmZpZywgJGxldmVsKSB7XG4gIEByZXR1cm4gX21hdC1nZXQtdHlwZS12YWx1ZSgkY29uZmlnLCAkbGV2ZWwsIGxldHRlci1zcGFjaW5nKTtcbn1cblxuLy8gR2V0cyB0aGUgZm9udC1mYW1pbHkgZnJvbSBhIHR5cG9ncmFwaHkgY29uZmlnIGFuZCByZW1vdmVzIHRoZSBxdW90ZXMgYXJvdW5kIGl0LlxuQGZ1bmN0aW9uIG1hdC1mb250LWZhbWlseSgkY29uZmlnLCAkbGV2ZWw6IG51bGwpIHtcbiAgJGZvbnQtZmFtaWx5OiBtYXAtZ2V0KCRjb25maWcsIGZvbnQtZmFtaWx5KTtcblxuICBAaWYgJGxldmVsICE9IG51bGwge1xuICAgICRmb250LWZhbWlseTogX21hdC1nZXQtdHlwZS12YWx1ZSgkY29uZmlnLCAkbGV2ZWwsIGZvbnQtZmFtaWx5KTtcbiAgfVxuXG4gIC8vIEd1YXJkIGFnYWluc3QgdW5xdW90aW5nIG5vbi1zdHJpbmcgdmFsdWVzLCBiZWNhdXNlIGl0J3MgZGVwcmVjYXRlZC5cbiAgQHJldHVybiBpZih0eXBlLW9mKCRmb250LWZhbWlseSkgPT0gc3RyaW5nLCB1bnF1b3RlKCRmb250LWZhbWlseSksICRmb250LWZhbWlseSk7XG59XG5cbi8vIE91dHB1dHMgdGhlIHNob3J0aGFuZCBgZm9udGAgQ1NTIHByb3BlcnR5LCBiYXNlZCBvbiBhIHNldCBvZiB0eXBvZ3JhcGh5IHZhbHVlcy4gRmFsbHMgYmFjayB0b1xuLy8gdGhlIGluZGl2aWR1YWwgcHJvcGVydGllcyBpZiBhIHZhbHVlIHRoYXQgaXNuJ3QgYWxsb3dlZCBpbiB0aGUgc2hvcnRoYW5kIGlzIHBhc3NlZCBpbi5cbkBtaXhpbiBtYXQtdHlwb2dyYXBoeS1mb250LXNob3J0aGFuZCgkZm9udC1zaXplLCAkZm9udC13ZWlnaHQsICRsaW5lLWhlaWdodCwgJGZvbnQtZmFtaWx5KSB7XG4gIC8vIElmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSBzZXQgdG8gYGluaGVyaXRgLCB3ZSBjYW4ndCB1c2UgdGhlIHNob3J0aGFuZFxuICAvLyBzbyB3ZSBmYWxsIGJhY2sgdG8gcGFzc2luZyBpbiB0aGUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzLlxuICBAaWYgKCRmb250LXNpemUgPT0gaW5oZXJpdCBvclxuICAgICAgICRmb250LXdlaWdodCA9PSBpbmhlcml0IG9yXG4gICAgICAgJGxpbmUtaGVpZ2h0ID09IGluaGVyaXQgb3JcbiAgICAgICAkZm9udC1mYW1pbHkgPT0gaW5oZXJpdCBvclxuICAgICAgICRmb250LXNpemUgPT0gbnVsbCBvclxuICAgICAgICRmb250LXdlaWdodCA9PSBudWxsIG9yXG4gICAgICAgJGxpbmUtaGVpZ2h0ID09IG51bGwgb3JcbiAgICAgICAkZm9udC1mYW1pbHkgPT0gbnVsbCkge1xuXG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplO1xuICAgIGZvbnQtd2VpZ2h0OiAkZm9udC13ZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5O1xuICB9XG4gIEBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBzaG9ydGhhbmQgYGZvbnRgLCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGFtb3VudCBvZiBieXRlcy4gTm90ZVxuICAgIC8vIHRoYXQgd2UgbmVlZCB0byB1c2UgaW50ZXJwb2xhdGlvbiBmb3IgYGZvbnQtc2l6ZS9saW5lLWhlaWdodGAgaW4gb3JkZXIgdG8gcHJldmVudFxuICAgIC8vIFNhc3MgZnJvbSBkaXZpZGluZyB0aGUgdHdvIHZhbHVlcy5cbiAgICBmb250OiAkZm9udC13ZWlnaHQgI3skZm9udC1zaXplfS8jeyRsaW5lLWhlaWdodH0gJGZvbnQtZmFtaWx5O1xuICB9XG59XG5cbi8vIENvbnZlcnRzIGEgdHlwb2dyYXBoeSBsZXZlbCBpbnRvIENTUyBzdHlsZXMuXG5AbWl4aW4gbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsICRsZXZlbCkge1xuICAkZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsICRsZXZlbCk7XG4gICRmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsICRsZXZlbCk7XG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsICRsZXZlbCk7XG4gICRmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsICRsZXZlbCk7XG5cbiAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktZm9udC1zaG9ydGhhbmQoJGZvbnQtc2l6ZSwgJGZvbnQtd2VpZ2h0LCAkbGluZS1oZWlnaHQsICRmb250LWZhbWlseSk7XG4gIGxldHRlci1zcGFjaW5nOiBtYXQtbGV0dGVyLXNwYWNpbmcoJGNvbmZpZywgJGxldmVsKTtcbn1cblxuXG5AbWl4aW4gbWF0LW9wdGlvbi10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1vcHRpb24ge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLFxuICAgICY6Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICB9XG5cbiAgICAvLyBJbiBtdWx0aXBsZSBtb2RlIHRoZXJlIGlzIGEgY2hlY2tib3ggdG8gc2hvdyB0aGF0IHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgJi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIpO1xuICAgIH1cblxuICAgICYubWF0LWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICAgIH1cblxuICAgICYubWF0LW9wdGlvbi1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gIH1cblxuICAubWF0LWFjY2VudCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgfVxuXG4gIC5tYXQtd2FybiAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1vcHRpb24tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtb3B0aW9uIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LW9wdGdyb3VwLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtb3B0Z3JvdXAtbGFiZWwge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LW9wdGdyb3VwLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LW9wdGdyb3VwLWxhYmVsIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgYm9keS0yKTtcbiAgfVxufVxuXG5cblxuQG1peGluIG1hdC1wc2V1ZG8tY2hlY2tib3gtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC8vIE5PVEUodHJhdmlza2F1Zm1hbik6IFdoaWxlIHRoZSBzcGVjIGNhbGxzIGZvciB0cmFuc2x1Y2VudCBibGFja3Mvd2hpdGVzIGZvciBkaXNhYmxlZCBjb2xvcnMsXG4gIC8vIHRoaXMgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggZWxlbWVudHMgbGF5ZXJlZCBvbiB0b3Agb2Ygb25lIGFub3RoZXIuIFRvIGdldCBhcm91bmQgdGhpcyB3ZVxuICAvLyBibGVuZCB0aGUgY29sb3JzIHRvZ2V0aGVyIGJhc2VkIG9uIHRoZSBiYXNlIGNvbG9yIGFuZCB0aGUgdGhlbWUgYmFja2dyb3VuZC5cbiAgJHdoaXRlLTMwcGN0LW9wYWNpdHktb24tZGFyazogIzY4Njg2ODtcbiAgJGJsYWNrLTI2cGN0LW9wYWNpdHktb24tbGlnaHQ6ICNiMGIwYjA7XG4gICRkaXNhYmxlZC1jb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsICR3aGl0ZS0zMHBjdC1vcGFjaXR5LW9uLWRhcmssICRibGFjay0yNnBjdC1vcGFjaXR5LW9uLWxpZ2h0KTtcbiAgJGNvbG9yZWQtYm94LXNlbGVjdG9yOiAnLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSc7XG5cbiAgLm1hdC1wc2V1ZG8tY2hlY2tib3gge1xuICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpLCBzZWNvbmRhcnktdGV4dCk7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKTtcbiAgICB9XG4gIH1cblxuICAubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gICAgY29sb3I6ICRkaXNhYmxlZC1jb2xvcjtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gdGhlIGFjY2VudCBjb2xvci4gTm90ZSB0aGF0IHRoZSBwc2V1ZG8gY2hlY2tib3hlcyBhcmUgbWVhbnQgdG8gaW5oZXJpdCB0aGVcbiAgLy8gdGhlbWUgZnJvbSB0aGVpciBwYXJlbnQsIHJhdGhlciB0aGFuIGltcGxlbWVudGluZyB0aGVpciBvd24gdGhlbWluZywgd2hpY2ggaXMgd2h5IHdlXG4gIC8vIGRvbid0IGF0dGFjaCB0byB0aGUgYG1hdC0qYCBjbGFzc2VzLlxuICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLFxuICAubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIGFjY2VudCkpO1xuICB9XG5cbiAgLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsXG4gIC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHByaW1hcnkpKTtcbiAgfVxuXG4gIC5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKG1hcC1nZXQoJHRoZW1lLCB3YXJuKSk7XG4gIH1cblxuICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlIHtcbiAgICAmLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQge1xuICAgICAgYmFja2dyb3VuZDogJGRpc2FibGVkLWNvbG9yO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gUmVwcmVzZW50cyBhIHR5cG9ncmFwaHkgbGV2ZWwgZnJvbSB0aGUgTWF0ZXJpYWwgZGVzaWduIHNwZWMuXG5AZnVuY3Rpb24gbWF0LXR5cG9ncmFwaHktbGV2ZWwoXG4gICRmb250LXNpemUsXG4gICRsaW5lLWhlaWdodDogJGZvbnQtc2l6ZSxcbiAgJGZvbnQtd2VpZ2h0OiA0MDAsXG4gICRmb250LWZhbWlseTogbnVsbCxcbiAgJGxldHRlci1zcGFjaW5nOiBudWxsKSB7XG5cbiAgQHJldHVybiAoXG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLFxuICAgIGxpbmUtaGVpZ2h0OiAkbGluZS1oZWlnaHQsXG4gICAgZm9udC13ZWlnaHQ6ICRmb250LXdlaWdodCxcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LFxuICAgIGxldHRlci1zcGFjaW5nOiAkbGV0dGVyLXNwYWNpbmdcbiAgKTtcbn1cblxuLy8gUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgdHlwb2dyYXBoeSBsZXZlbHMuXG4vLyBEZWZhdWx0cyBjb21lIGZyb20gaHR0cHM6Ly9tYXRlcmlhbC5pby9ndWlkZWxpbmVzL3N0eWxlL3R5cG9ncmFwaHkuaHRtbFxuQGZ1bmN0aW9uIG1hdC10eXBvZ3JhcGh5LWNvbmZpZyhcbiAgJGZvbnQtZmFtaWx5OiAgICdSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZicsXG4gICRkaXNwbGF5LTQ6ICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxMTJweCwgMTEycHgsIDMwMCksXG4gICRkaXNwbGF5LTM6ICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCg1NnB4LCA1NnB4LCA0MDApLFxuICAkZGlzcGxheS0yOiAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoNDVweCwgNDhweCwgNDAwKSxcbiAgJGRpc3BsYXktMTogICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKDM0cHgsIDQwcHgsIDQwMCksXG4gICRoZWFkbGluZTogICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgyNHB4LCAzMnB4LCA0MDApLFxuICAkdGl0bGU6ICAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMjBweCwgMzJweCwgNTAwKSxcbiAgJHN1YmhlYWRpbmctMjogIG1hdC10eXBvZ3JhcGh5LWxldmVsKDE2cHgsIDI4cHgsIDQwMCksXG4gICRzdWJoZWFkaW5nLTE6ICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxNXB4LCAyNHB4LCA0MDApLFxuICAkYm9keS0yOiAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMTRweCwgMjRweCwgNTAwKSxcbiAgJGJvZHktMTogICAgICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKDE0cHgsIDIwcHgsIDQwMCksXG4gICRjYXB0aW9uOiAgICAgICBtYXQtdHlwb2dyYXBoeS1sZXZlbCgxMnB4LCAyMHB4LCA0MDApLFxuICAkYnV0dG9uOiAgICAgICAgbWF0LXR5cG9ncmFwaHktbGV2ZWwoMTRweCwgMTRweCwgNTAwKSxcbiAgLy8gTGluZS1oZWlnaHQgbXVzdCBiZSB1bml0LWxlc3MgZnJhY3Rpb24gb2YgdGhlIGZvbnQtc2l6ZS5cbiAgJGlucHV0OiAgICAgICAgIG1hdC10eXBvZ3JhcGh5LWxldmVsKGluaGVyaXQsIDEuMTI1LCA0MDApXG4pIHtcblxuICAvLyBEZWNsYXJlIGFuIGluaXRpYWwgbWFwIHdpdGggYWxsIG9mIHRoZSBsZXZlbHMuXG4gICRjb25maWc6IChcbiAgICBkaXNwbGF5LTQ6ICAgICAgJGRpc3BsYXktNCxcbiAgICBkaXNwbGF5LTM6ICAgICAgJGRpc3BsYXktMyxcbiAgICBkaXNwbGF5LTI6ICAgICAgJGRpc3BsYXktMixcbiAgICBkaXNwbGF5LTE6ICAgICAgJGRpc3BsYXktMSxcbiAgICBoZWFkbGluZTogICAgICAgJGhlYWRsaW5lLFxuICAgIHRpdGxlOiAgICAgICAgICAkdGl0bGUsXG4gICAgc3ViaGVhZGluZy0yOiAgICRzdWJoZWFkaW5nLTIsXG4gICAgc3ViaGVhZGluZy0xOiAgICRzdWJoZWFkaW5nLTEsXG4gICAgYm9keS0yOiAgICAgICAgICRib2R5LTIsXG4gICAgYm9keS0xOiAgICAgICAgICRib2R5LTEsXG4gICAgY2FwdGlvbjogICAgICAgICRjYXB0aW9uLFxuICAgIGJ1dHRvbjogICAgICAgICAkYnV0dG9uLFxuICAgIGlucHV0OiAgICAgICAgICAkaW5wdXQsXG4gICk7XG5cbiAgLy8gTG9vcCB0aHJvdWdoIHRoZSBsZXZlbHMgYW5kIHNldCB0aGUgYGZvbnQtZmFtaWx5YCBvZiB0aGUgb25lcyB0aGF0IGRvbid0IGhhdmUgb25lIHRvIHRoZSBiYXNlLlxuICAvLyBOb3RlIHRoYXQgU2FzcyBjYW4ndCBtb2RpZnkgbWFwcyBpbiBwbGFjZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIG1lcmdlIGFuZCByZS1hc3NpZ24uXG4gIEBlYWNoICRrZXksICRsZXZlbCBpbiAkY29uZmlnIHtcbiAgICBAaWYgbWFwLWdldCgkbGV2ZWwsIGZvbnQtZmFtaWx5KSA9PSBudWxsIHtcbiAgICAgICRuZXctbGV2ZWw6IG1hcC1tZXJnZSgkbGV2ZWwsIChmb250LWZhbWlseTogJGZvbnQtZmFtaWx5KSk7XG4gICAgICAkY29uZmlnOiBtYXAtbWVyZ2UoJGNvbmZpZywgKCRrZXk6ICRuZXctbGV2ZWwpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGJhc2UgZm9udCBmYW1pbHkgdG8gdGhlIGNvbmZpZy5cbiAgQHJldHVybiBtYXAtbWVyZ2UoJGNvbmZpZywgKGZvbnQtZmFtaWx5OiAkZm9udC1mYW1pbHkpKTtcbn1cblxuLy8gQWRkcyB0aGUgYmFzZSB0eXBvZ3JhcGh5IHN0eWxlcywgYmFzZWQgb24gYSBjb25maWcuXG5AbWl4aW4gbWF0LWJhc2UtdHlwb2dyYXBoeSgkY29uZmlnLCAkc2VsZWN0b3I6ICcubWF0LXR5cG9ncmFwaHknKSB7XG4gIC5tYXQtaDEsIC5tYXQtaGVhZGxpbmUsICN7JHNlbGVjdG9yfSBoMSB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGhlYWRsaW5lKTtcbiAgICBtYXJnaW46IDAgMCAxNnB4O1xuICB9XG5cbiAgLm1hdC1oMiwgLm1hdC10aXRsZSwgI3skc2VsZWN0b3J9IGgyIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgdGl0bGUpO1xuICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gIH1cblxuICAubWF0LWgzLCAubWF0LXN1YmhlYWRpbmctMiwgI3skc2VsZWN0b3J9IGgzIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICBtYXJnaW46IDAgMCAxNnB4O1xuICB9XG5cbiAgLm1hdC1oNCwgLm1hdC1zdWJoZWFkaW5nLTEsICN7JHNlbGVjdG9yfSBoNCB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgbWFyZ2luOiAwIDAgMTZweDtcbiAgfVxuXG4gIC8vIE5vdGU6IHRoZSBzcGVjIGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gaDUgYW5kIGg2LCBidXQgd2UgYWRkIHRoZXNlIGZvclxuICAvLyBjb25zaXN0ZW5jeS4gVGhlIGZvbnQgc2l6ZXMgY29tZSBmcm9tIHRoZSBDaHJvbWUgdXNlciBhZ2VudCBzdHlsZXMgd2hpY2ggaGF2ZSBoNSBhdCAwLjgzZW1cbiAgLy8gYW5kIGg2IGF0IDAuNjdlbS5cbiAgLm1hdC1oNSwgI3skc2VsZWN0b3J9IGg1IHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1mb250LXNob3J0aGFuZChcbiAgICAgIG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKSAqIDAuODMsXG4gICAgICBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0xKSxcbiAgICAgIG1hdC1saW5lLWhlaWdodCgkY29uZmlnLCBib2R5LTEpLFxuICAgICAgbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIGJvZHktMSlcbiAgICApO1xuXG4gICAgbWFyZ2luOiAwIDAgMTJweDtcbiAgfVxuXG4gIC5tYXQtaDYsICN7JHNlbGVjdG9yfSBoNiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktZm9udC1zaG9ydGhhbmQoXG4gICAgICBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSkgKiAwLjY3LFxuICAgICAgbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSksXG4gICAgICBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgYm9keS0xKSxcbiAgICAgIG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBib2R5LTEpXG4gICAgKTtcblxuICAgIG1hcmdpbjogMCAwIDEycHg7XG4gIH1cblxuICAubWF0LWJvZHktc3Ryb25nLCAubWF0LWJvZHktMiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGJvZHktMik7XG4gIH1cblxuICAubWF0LWJvZHksIC5tYXQtYm9keS0xLCAjeyRzZWxlY3Rvcn0ge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBib2R5LTEpO1xuXG4gICAgcCB7XG4gICAgICBtYXJnaW46IDAgMCAxMnB4O1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc21hbGwsIC5tYXQtY2FwdGlvbiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGNhcHRpb24pO1xuICB9XG5cbiAgLy8gTm90ZTogVGhlIHNwZWMgZG9lc24ndCBtZW50aW9uIGxldHRlciBzcGFjaW5nLiBUaGUgdmFsdWUgY29tZXMgZnJvbVxuICAvLyBleWViYWxsaW5nIGl0IHVudGlsIGl0IGxvb2tlZCBleGFjdGx5IGxpa2UgdGhlIHNwZWMgZXhhbXBsZXMuXG4gIC5tYXQtZGlzcGxheS00LCAjeyRzZWxlY3Rvcn0gLm1hdC1kaXNwbGF5LTQge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBkaXNwbGF5LTQpO1xuICAgIG1hcmdpbjogMCAwIDU2cHg7XG4gICAgbGV0dGVyLXNwYWNpbmc6IC0wLjA1ZW07XG4gIH1cblxuICAubWF0LWRpc3BsYXktMywgI3skc2VsZWN0b3J9IC5tYXQtZGlzcGxheS0zIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgZGlzcGxheS0zKTtcbiAgICBtYXJnaW46IDAgMCA2NHB4O1xuICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtO1xuICB9XG5cbiAgLm1hdC1kaXNwbGF5LTIsICN7JHNlbGVjdG9yfSAubWF0LWRpc3BsYXktMiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIGRpc3BsYXktMik7XG4gICAgbWFyZ2luOiAwIDAgNjRweDtcbiAgICBsZXR0ZXItc3BhY2luZzogLTAuMDA1ZW07XG4gIH1cblxuICAubWF0LWRpc3BsYXktMSwgI3skc2VsZWN0b3J9IC5tYXQtZGlzcGxheS0xIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgZGlzcGxheS0xKTtcbiAgICBtYXJnaW46IDAgMCA2NHB4O1xuICB9XG59XG5cblxuXG5cbkBtaXhpbiBtYXQtYXV0b2NvbXBsZXRlLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLW92ZXJyaWRhYmxlLWVsZXZhdGlvbig0LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG5cbiAgICAvLyBTZWxlY3RlZCBvcHRpb25zIGluIGF1dG9jb21wbGV0ZXMgc2hvdWxkIG5vdCBiZSBncmF5LCBidXQgd2VcbiAgICAvLyBvbmx5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGJhY2tncm91bmQgZm9yIHNlbGVjdGVkIG9wdGlvbnMgaWZcbiAgICAvLyB0aGV5IGFyZSAqbm90KiBpbiBob3ZlciBvciBmb2N1cyBzdGF0ZS4gVGhpcyBjaGFuZ2UgaGFzIHRvIGJlXG4gICAgLy8gbWFkZSBoZXJlIGJlY2F1c2UgYmFzZSBvcHRpb24gc3R5bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGVcbiAgICAvLyBhdXRvY29tcGxldGUgYW5kIHRoZSBzZWxlY3QuXG4gICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcikge1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcblxuICAgICAgJjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuQG1peGluIG1hdC1hdXRvY29tcGxldGUtdHlwb2dyYXBoeSgkY29uZmlnKSB7IH1cblxuLy8gVGhpcyBjb250YWlucyBhbGwgb2YgdGhlIHN0eWxlcyBmb3IgdGhlIGJhZGdlXG4vLyByYXRoZXIgdGhhbiBqdXN0IHRoZSBjb2xvci90aGVtZSBiZWNhdXNlIG9mXG4vLyBubyBzdHlsZSBzaGVldCBzdXBwb3J0IGZvciBkaXJlY3RpdmVzLlxuXG5cblxuXG5cbiRtYXQtYmFkZ2UtZm9udC1zaXplOiAxMnB4O1xuJG1hdC1iYWRnZS1mb250LXdlaWdodDogNjAwO1xuJG1hdC1iYWRnZS1kZWZhdWx0LXNpemU6IDIycHggIWRlZmF1bHQ7XG4kbWF0LWJhZGdlLXNtYWxsLXNpemU6ICRtYXQtYmFkZ2UtZGVmYXVsdC1zaXplIC0gNjtcbiRtYXQtYmFkZ2UtbGFyZ2Utc2l6ZTogJG1hdC1iYWRnZS1kZWZhdWx0LXNpemUgKyA2O1xuXG4vLyBNaXhpbiBmb3IgYnVpbGRpbmcgb2Zmc2V0IGdpdmVuIGRpZmZlcmVudCBzaXplc1xuQG1peGluIF9tYXQtYmFkZ2Utc2l6ZSgkc2l6ZSkge1xuICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgIHdpZHRoOiAkc2l6ZTtcbiAgICBoZWlnaHQ6ICRzaXplO1xuICAgIGxpbmUtaGVpZ2h0OiAkc2l6ZTtcbiAgfVxuXG4gICYubWF0LWJhZGdlLWFib3ZlIHtcbiAgICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgICAgdG9wOiAtJHNpemUgLyAyO1xuICAgIH1cbiAgfVxuXG4gICYubWF0LWJhZGdlLWJlbG93IHtcbiAgICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgICAgYm90dG9tOiAtJHNpemUgLyAyO1xuICAgIH1cbiAgfVxuXG4gICYubWF0LWJhZGdlLWJlZm9yZSB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGxlZnQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICBbZGlyPSdydGwnXSAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICBsZWZ0OiBhdXRvO1xuICAgICAgcmlnaHQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICAmLm1hdC1iYWRnZS1hZnRlciB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIHJpZ2h0OiAtJHNpemU7XG4gICAgfVxuICB9XG5cbiAgW2Rpcj0ncnRsJ10gJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICByaWdodDogYXV0bztcbiAgICAgIGxlZnQ6IC0kc2l6ZTtcbiAgICB9XG4gIH1cblxuICAmLm1hdC1iYWRnZS1vdmVybGFwIHtcbiAgICAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgbGVmdDogLSRzaXplIC8gMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBbZGlyPSdydGwnXSAmLm1hdC1iYWRnZS1iZWZvcmUge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgbGVmdDogYXV0bztcbiAgICAgICAgcmlnaHQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgcmlnaHQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgW2Rpcj0ncnRsJ10gJi5tYXQtYmFkZ2UtYWZ0ZXIge1xuICAgICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGxlZnQ6IC0kc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtYmFkZ2UtdGhlbWUoJHRoZW1lKSB7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkcHJpbWFyeTogbWFwLWdldCgkdGhlbWUsIHByaW1hcnkpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSwgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwcmltYXJ5KTtcblxuICAgIEBpbmNsdWRlIGNkay1oaWdoLWNvbnRyYXN0IHtcbiAgICAgIG91dGxpbmU6IHNvbGlkIDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1iYWRnZS1hY2NlbnQge1xuICAgIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQsIGRlZmF1bHQtY29udHJhc3QpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtYmFkZ2Utd2FybiB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJHdhcm4sIGRlZmF1bHQtY29udHJhc3QpO1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJhZGdlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAubWF0LWJhZGdlLWhpZGRlbiB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1iYWRnZS1kaXNhYmxlZCB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgICRhcHAtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnYmFja2dyb3VuZCcpO1xuICAgICAgJGJhZGdlLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLWJ1dHRvbik7XG5cbiAgICAgIC8vIFRoZSBkaXNhYmxlZCBjb2xvciB1c3VhbGx5IGhhcyBzb21lIGtpbmQgb2Ygb3BhY2l0eSwgYnV0IGJlY2F1c2UgdGhlIGJhZGdlIGlzIG92ZXJsYXllZFxuICAgICAgLy8gb24gdG9wIG9mIHNvbWV0aGluZyBlbHNlLCBpdCB3b24ndCBsb29rIGdvb2QgaWYgaXQncyBvcGFxdWUuIElmIGl0IGlzIGEgY29sb3IgKnR5cGUqLFxuICAgICAgLy8gd2UgY29udmVydCBpdCBpbnRvIGEgc29saWQgY29sb3IgYnkgdGFraW5nIHRoZSBvcGFjaXR5IGZyb20gdGhlIHJnYmEgdmFsdWUgYW5kIHVzaW5nXG4gICAgICAvLyB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBiYWNrZ3JvdW5kIHRvIHB1dCBpbnRvIGZvcmVncm91bmQgd2hlblxuICAgICAgLy8gbWl4aW5nIHRoZSBjb2xvcnMgdG9nZXRoZXIuXG4gICAgICBAaWYgKHR5cGUtb2YoJGJhZGdlLWNvbG9yKSA9PSBjb2xvciBhbmQgdHlwZS1vZigkYXBwLWJhY2tncm91bmQpID09IGNvbG9yKSB7XG4gICAgICAgICRiYWRnZS1vcGFjaXR5OiBvcGFjaXR5KCRiYWRnZS1jb2xvcik7XG4gICAgICAgIGJhY2tncm91bmQ6IG1peCgkYXBwLWJhY2tncm91bmQsIHJnYmEoJGJhZGdlLWNvbG9yLCAxKSwgKDEgLSAkYmFkZ2Utb3BhY2l0eSkgKiAxMDAlKTtcbiAgICAgIH1cbiAgICAgIEBlbHNlIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGJhZGdlLWNvbG9yO1xuICAgICAgfVxuXG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJhZGdlLWNvbnRlbnQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgY2xhc3MgaXMgYWRkZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgYWRkZWRcbiAgLy8gc28gaXQgY2FuIGFuaW1hdGUgc2NhbGUgdG8gZGVmYXVsdFxuICAubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZSB7XG4gICAgLy8gU2NhbGUgdG8gYG5vbmVgIGluc3RlYWQgb2YgYDFgIHRvIGF2b2lkIGJsdXJyeSB0ZXh0IGluIHNvbWUgYnJvd3NlcnMuXG4gICAgdHJhbnNmb3JtOiBub25lO1xuICB9XG5cbiAgLm1hdC1iYWRnZS1zbWFsbCB7XG4gICAgQGluY2x1ZGUgX21hdC1iYWRnZS1zaXplKCRtYXQtYmFkZ2Utc21hbGwtc2l6ZSk7XG4gIH1cbiAgLm1hdC1iYWRnZS1tZWRpdW0ge1xuICAgIEBpbmNsdWRlIF9tYXQtYmFkZ2Utc2l6ZSgkbWF0LWJhZGdlLWRlZmF1bHQtc2l6ZSk7XG4gIH1cbiAgLm1hdC1iYWRnZS1sYXJnZSB7XG4gICAgQGluY2x1ZGUgX21hdC1iYWRnZS1zaXplKCRtYXQtYmFkZ2UtbGFyZ2Utc2l6ZSk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1iYWRnZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICBmb250LXdlaWdodDogJG1hdC1iYWRnZS1mb250LXdlaWdodDtcbiAgICBmb250LXNpemU6ICRtYXQtYmFkZ2UtZm9udC1zaXplO1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgZm9udC1zaXplOiAkbWF0LWJhZGdlLWZvbnQtc2l6ZSAvIDI7XG4gIH1cblxuICAubWF0LWJhZGdlLWxhcmdlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gICAgZm9udC1zaXplOiAkbWF0LWJhZGdlLWZvbnQtc2l6ZSAqIDI7XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LWJvdHRvbS1zaGVldC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXIge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtZWxldmF0aW9uKDE2LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlhbG9nKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LWJvdHRvbS1zaGVldC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgYm9keS0xKTtcbiAgfVxufVxuXG5cblxuXG5cbiRfbWF0LWJ1dHRvbi1yaXBwbGUtb3BhY2l0eTogMC4xO1xuXG4vLyBBcHBsaWVzIGEgZm9jdXMgc3R5bGUgdG8gYW4gbWF0LWJ1dHRvbiBlbGVtZW50IGZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgcGFsZXR0ZXMuXG5AbWl4aW4gX21hdC1idXR0b24tZm9jdXMtb3ZlcmxheS1jb2xvcigkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgJi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnkpO1xuICB9XG5cbiAgJi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgfVxuXG4gICYubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgfVxuXG4gICZbZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG59XG5cbkBtaXhpbiBfbWF0LWJ1dHRvbi1yaXBwbGUtY29sb3IoJHRoZW1lLCAkaHVlLCAkb3BhY2l0eTogJF9tYXQtYnV0dG9uLXJpcHBsZS1vcGFjaXR5KSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gICYubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5LCAkaHVlLCAkb3BhY2l0eSk7XG4gIH1cblxuICAmLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQsICRodWUsICRvcGFjaXR5KTtcbiAgfVxuXG4gICYubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuLCAkaHVlLCAkb3BhY2l0eSk7XG4gIH1cbn1cblxuLy8gQXBwbGllcyBhIHByb3BlcnR5IHRvIGFuIG1hdC1idXR0b24gZWxlbWVudCBmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIHBhbGV0dGVzLlxuQG1peGluIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJHByb3BlcnR5LCAkaHVlKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICYubWF0LXByaW1hcnkge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRwcmltYXJ5LCAkaHVlKTtcbiAgfVxuICAmLm1hdC1hY2NlbnQge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRhY2NlbnQsICRodWUpO1xuICB9XG4gICYubWF0LXdhcm4ge1xuICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCR3YXJuLCAkaHVlKTtcbiAgfVxuXG4gICYubWF0LXByaW1hcnksICYubWF0LWFjY2VudCwgJi5tYXQtd2FybiwgJltkaXNhYmxlZF0ge1xuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgICRwYWxldHRlOiBpZigkcHJvcGVydHkgPT0gJ2NvbG9yJywgJGZvcmVncm91bmQsICRiYWNrZ3JvdW5kKTtcbiAgICAgICN7JHByb3BlcnR5fTogbWF0LWNvbG9yKCRwYWxldHRlLCBkaXNhYmxlZC1idXR0b24pO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LWJ1dHRvbi10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC1idXR0b24sIC5tYXQtaWNvbi1idXR0b24sIC5tYXQtc3Ryb2tlZC1idXR0b24ge1xuICAgIC8vIEJ1dHRvbnMgd2l0aG91dCBhIGJhY2tncm91bmQgY29sb3Igc2hvdWxkIGluaGVyaXQgdGhlIGZvbnQgY29sb3IuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvXG4gICAgLy8gZW5zdXJlIHRoYXQgdGhlIGJ1dHRvbiBpcyByZWFkYWJsZSBvbiBjdXN0b20gYmFja2dyb3VuZCBjb2xvcnMuIEl0J3Mgd3JvbmcgdG8gYWx3YXlzIGFzc3VtZVxuICAgIC8vIHRoYXQgdGhvc2UgYnV0dG9ucyBhcmUgYWx3YXlzIHBsYWNlZCBpbnNpZGUgb2YgY29udGFpbmVycyB3aXRoIHRoZSBkZWZhdWx0IGJhY2tncm91bmRcbiAgICAvLyBjb2xvciBvZiB0aGUgdGhlbWUgKGUuZy4gdGhlbWVkIHRvb2xiYXJzKS5cbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblxuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJ2NvbG9yJywgZGVmYXVsdCk7XG4gICAgQGluY2x1ZGUgX21hdC1idXR0b24tZm9jdXMtb3ZlcmxheS1jb2xvcigkdGhlbWUpO1xuXG4gICAgLy8gU2V0dXAgdGhlIHJpcHBsZSBjb2xvciB0byBiZSBiYXNlZCBvbiB0aGUgdGV4dCBjb2xvci4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHJpcHBsZXNcbiAgICAvLyBhcmUgbWF0Y2hpbmcgd2l0aCB0aGUgY3VycmVudCB0aGVtZSBwYWxldHRlIGFuZCBhcmUgaW4gY29udHJhc3QgdG8gdGhlIGJhY2tncm91bmQgY29sb3JcbiAgICAvLyAoZS5nIGluIHRoZW1lZCB0b29sYmFycykuXG4gICAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICBvcGFjaXR5OiAkX21hdC1idXR0b24tcmlwcGxlLW9wYWNpdHk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZDogbWFwX2dldCgkZm9yZWdyb3VuZCwgYmFzZSk7XG4gIH1cblxuICAvLyBOb3RlOiB0aGlzIG5lZWRzIGEgYml0IGV4dHJhIHNwZWNpZmljaXR5LCBiZWNhdXNlIHdlJ3JlIG5vdCBndWFyYW50ZWVkIHRoZSBpbmNsdXNpb25cbiAgLy8gb3JkZXIgb2YgdGhlIHRoZW1lIHN0eWxlcyBhbmQgdGhlIGJ1dHRvbiByZXNldCBtYXkgZW5kIHVwIHJlc2V0dGluZyB0aGlzIGFzIHdlbGwuXG4gIC5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG4gIH1cblxuICAubWF0LWZsYXQtYnV0dG9uLCAubWF0LXJhaXNlZC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgICAvLyBEZWZhdWx0IGZvbnQgYW5kIGJhY2tncm91bmQgY29sb3Igd2hlbiBub3QgdXNpbmcgYW55IGNvbG9yIHBhbGV0dGUuXG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCByYWlzZWQtYnV0dG9uKTtcblxuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXRoZW1lLXByb3BlcnR5KCR0aGVtZSwgJ2NvbG9yJywgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgQGluY2x1ZGUgX21hdC1idXR0b24tdGhlbWUtcHJvcGVydHkoJHRoZW1lLCAnYmFja2dyb3VuZC1jb2xvcicsIGRlZmF1bHQpO1xuICAgIEBpbmNsdWRlIF9tYXQtYnV0dG9uLXJpcHBsZS1jb2xvcigkdGhlbWUsIGRlZmF1bHQtY29udHJhc3QpO1xuICB9XG5cbiAgLm1hdC1zdHJva2VkLWJ1dHRvbiwgLm1hdC1mbGF0LWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMCwgJHRoZW1lKTtcbiAgfVxuXG4gIC5tYXQtcmFpc2VkLWJ1dHRvbiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMiwgJHRoZW1lKTtcblxuICAgICY6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZSB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLW92ZXJyaWRhYmxlLWVsZXZhdGlvbig4LCAkdGhlbWUpO1xuICAgIH1cblxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDAsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1mYWIsIC5tYXQtbWluaS1mYWIge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDYsICR0aGVtZSk7XG5cbiAgICAmOm5vdChbZGlzYWJsZWRdKTphY3RpdmUge1xuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMTIsICR0aGVtZSk7XG4gICAgfVxuXG4gICAgJltkaXNhYmxlZF0ge1xuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oMCwgJHRoZW1lKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1idXR0b24tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtYnV0dG9uLCAubWF0LXJhaXNlZC1idXR0b24sIC5tYXQtaWNvbi1idXR0b24sIC5tYXQtc3Ryb2tlZC1idXR0b24sXG4gIC5tYXQtZmxhdC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYnV0dG9uKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtYnV0dG9uLXRvZ2dsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGRpdmlkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMiwgJHRoZW1lKTtcbiAgfVxuXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsXG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuXG4gICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXkge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBmb2N1c2VkLWJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG5cbiAgICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGZvY3VzZWQtYnV0dG9uLCAxKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICAgIGJvcmRlci1sZWZ0OiBzb2xpZCAxcHggJGRpdmlkZXItY29sb3I7XG4gIH1cblxuICBbZGlyPSdydGwnXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgIGJvcmRlci1yaWdodDogc29saWQgMXB4ICRkaXZpZGVyLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwge1xuICAgIC5tYXQtYnV0dG9uLXRvZ2dsZSArIC5tYXQtYnV0dG9uLXRvZ2dsZSB7XG4gICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTtcbiAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAkZGl2aWRlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBzZWxlY3RlZC1idXR0b24pO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG4gIH1cblxuICAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLWJ1dHRvbik7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaXNhYmxlZC1idXR0b24tdG9nZ2xlKTtcblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGNhcmQpO1xuICAgIH1cblxuICAgICYubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIHNlbGVjdGVkLWRpc2FibGVkLWJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxcbiAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQge1xuICAgIGJvcmRlcjogc29saWQgMXB4ICRkaXZpZGVyLWNvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtYnV0dG9uLXRvZ2dsZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtY2FyZC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWNhcmQge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDEsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAgIC8vIE5lZWRzIGV4dHJhIHNwZWNpZmljaXR5IHRvIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhlIGVsZXZhdGlvbiBzZWxlY3RvcnMuXG4gICAgJi5tYXQtY2FyZC1mbGF0IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDAsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jYXJkLXN1YnRpdGxlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1jYXJkLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWNhcmQge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LWNhcmQtdGl0bGUge1xuICAgIGZvbnQ6IHtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgaGVhZGxpbmUpO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgdGl0bGUpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2FyZC1oZWFkZXIgLm1hdC1jYXJkLXRpdGxlIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgdGl0bGUpO1xuICB9XG5cbiAgLm1hdC1jYXJkLXN1YnRpdGxlLFxuICAubWF0LWNhcmQtY29udGVudCB7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtY2hlY2tib3gtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG5cbiAgLy8gVGhlIGNvbG9yIG9mIHRoZSBjaGVja2JveCdzIGNoZWNrbWFyayAvIG1peGVkbWFyay5cbiAgJGNoZWNrYm94LW1hcmstY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgYmFja2dyb3VuZCk7XG5cbiAgLy8gTk9URSh0cmF2aXNrYXVmbWFuKTogV2hpbGUgdGhlIHNwZWMgY2FsbHMgZm9yIHRyYW5zbHVjZW50IGJsYWNrcy93aGl0ZXMgZm9yIGRpc2FibGVkIGNvbG9ycyxcbiAgLy8gdGhpcyBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBlbGVtZW50cyBsYXllcmVkIG9uIHRvcCBvZiBvbmUgYW5vdGhlci4gVG8gZ2V0IGFyb3VuZCB0aGlzIHdlXG4gIC8vIGJsZW5kIHRoZSBjb2xvcnMgdG9nZXRoZXIgYmFzZWQgb24gdGhlIGJhc2UgY29sb3IgYW5kIHRoZSB0aGVtZSBiYWNrZ3JvdW5kLlxuICAkd2hpdGUtMzBwY3Qtb3BhY2l0eS1vbi1kYXJrOiAjNjg2ODY4O1xuICAkYmxhY2stMjZwY3Qtb3BhY2l0eS1vbi1saWdodDogI2IwYjBiMDtcbiAgJGRpc2FibGVkLWNvbG9yOiBpZigkaXMtZGFyay10aGVtZSwgJHdoaXRlLTMwcGN0LW9wYWNpdHktb24tZGFyaywgJGJsYWNrLTI2cGN0LW9wYWNpdHktb24tbGlnaHQpO1xuXG4gIC5tYXQtY2hlY2tib3gtZnJhbWUge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWNoZWNrbWFyayB7XG4gICAgZmlsbDogJGNoZWNrYm94LW1hcmstY29sb3I7XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoIHtcbiAgICAvLyAhaW1wb3J0YW50IGlzIG5lZWRlZCBoZXJlIGJlY2F1c2UgYSBzdHJva2UgbXVzdCBiZSBzZXQgYXMgYW5cbiAgICAvLyBhdHRyaWJ1dGUgb24gdGhlIFNWRyBpbiBvcmRlciBmb3IgbGluZSBhbmltYXRpb24gdG8gd29yayBwcm9wZXJseS5cbiAgICBzdHJva2U6ICRjaGVja2JveC1tYXJrLWNvbG9yICFpbXBvcnRhbnQ7XG5cbiAgICBAaW5jbHVkZSBjZGstaGlnaC1jb250cmFzdChibGFjay1vbi13aGl0ZSkge1xuICAgICAgLy8gSGF2aW5nIHRoZSBvbmUgYWJvdmUgYmUgIWltcG9ydGFudCBlbmRzIHVwIG92ZXJyaWRpbmcgdGhlIGJyb3dzZXIncyBhdXRvbWF0aWNcbiAgICAgIC8vIGNvbG9yIGludmVyc2lvbiBzbyB3ZSBuZWVkIHRvIHJlLWludmVydCBpdCBvdXJzZWx2ZXMgZm9yIGJsYWNrLW9uLXdoaXRlLlxuICAgICAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jaGVja2JveC1taXhlZG1hcmsge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjaGVja2JveC1tYXJrLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLCAubWF0LWNoZWNrYm94LWNoZWNrZWQge1xuICAgICYubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNoZWNrYm94LWRpc2FibGVkIHtcbiAgICAmLm1hdC1jaGVja2JveC1jaGVja2VkLFxuICAgICYubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICAgICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgICY6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkge1xuICAgICAgLm1hdC1jaGVja2JveC1mcmFtZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGRpc2FibGVkLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5tYXQtY2hlY2tib3gtbGFiZWwge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICAgIH1cblxuICAgIEBpbmNsdWRlIGNkay1oaWdoLWNvbnRyYXN0IHtcbiAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIG9uZSBpcyBtb3ZlZCBkb3duIGhlcmUgc28gaXQgY2FuIHRhcmdldCBib3RoXG4gIC8vIHRoZSB0aGVtZSBjb2xvcnMgYW5kIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgQGluY2x1ZGUgY2RrLWhpZ2gtY29udHJhc3Qge1xuICAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gICAgICAvLyBOZWVkcyB0byBiZSByZW1vdmVkIGJlY2F1c2UgaXQgaGlkZXMgdGhlIGNoZWNrYm94IG91dGxpbmUuXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2hlY2tib3g6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpIHtcbiAgICAmLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgICB9XG5cbiAgICAmLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtY2hlY2tib3gtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtY2hlY2tib3gge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAvLyBUT0RPKGthcmEpOiBSZW1vdmUgdGhpcyBzdHlsZSB3aGVuIGZpeGluZyB2ZXJ0aWNhbCBiYXNlbGluZVxuICAubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgICBsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGJvZHktMik7XG4gIH1cbn1cblxuXG5cblxuXG5cbiRtYXQtY2hpcC1yZW1vdmUtZm9udC1zaXplOiAxOHB4O1xuXG5AbWl4aW4gbWF0LWNoaXBzLWNvbG9yKCRmb3JlZ3JvdW5kLCAkYmFja2dyb3VuZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmFja2dyb3VuZDtcbiAgY29sb3I6ICRmb3JlZ3JvdW5kO1xuXG4gIC5tYXQtY2hpcC1yZW1vdmUge1xuICAgIGNvbG9yOiAkZm9yZWdyb3VuZDtcbiAgICBvcGFjaXR5OiAwLjQ7XG4gIH1cbn1cblxuQG1peGluIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkcGFsZXR0ZSkge1xuICBAaW5jbHVkZSBtYXQtY2hpcHMtY29sb3IobWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LWNvbnRyYXN0KSwgbWF0LWNvbG9yKCRwYWxldHRlKSk7XG5cbiAgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwYWxldHRlLCBkZWZhdWx0LWNvbnRyYXN0LCAwLjEpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtY2hpcHMtdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICR1bnNlbGVjdGVkLWJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgdW5zZWxlY3RlZC1jaGlwKTtcbiAgJHVuc2VsZWN0ZWQtZm9yZWdyb3VuZDogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAge1xuICAgIEBpbmNsdWRlIG1hdC1jaGlwcy1jb2xvcigkdW5zZWxlY3RlZC1mb3JlZ3JvdW5kLCAkdW5zZWxlY3RlZC1iYWNrZ3JvdW5kKTtcblxuICAgICY6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkge1xuICAgICAgJjphY3RpdmUge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbigzLCAkdGhlbWUpO1xuICAgICAgfVxuXG4gICAgICAubWF0LWNoaXAtcmVtb3ZlOmhvdmVyIHtcbiAgICAgICAgb3BhY2l0eTogMC41NDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLm1hdC1jaGlwLWRpc2FibGVkIHtcbiAgICAgIG9wYWNpdHk6IDAuNDtcbiAgICB9XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXBfZ2V0KCRmb3JlZ3JvdW5kLCBiYXNlKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgQGluY2x1ZGUgbWF0LWNoaXBzLXRoZW1lLWNvbG9yKCRwcmltYXJ5KTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jaGlwcy10aGVtZS1jb2xvcigkYWNjZW50KTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1jaGlwcy10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1jaGlwIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMik7XG5cbiAgICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbixcbiAgICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogJG1hdC1jaGlwLXJlbW92ZS1mb250LXNpemU7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC10YWJsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LXRhYmxlIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdjYXJkJyk7XG4gIH1cblxuICAubWF0LXRhYmxlIHRoZWFkLCAubWF0LXRhYmxlIHRib2R5LCAubWF0LXRhYmxlIHRmb290LFxuICBtYXQtaGVhZGVyLXJvdywgbWF0LXJvdywgbWF0LWZvb3Rlci1yb3csXG4gIFttYXQtaGVhZGVyLXJvd10sIFttYXQtcm93XSwgW21hdC1mb290ZXItcm93XSxcbiAgLm1hdC10YWJsZS1zdGlja3kge1xuICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gIH1cblxuICBtYXQtcm93LCBtYXQtaGVhZGVyLXJvdywgbWF0LWZvb3Rlci1yb3csXG4gIHRoLm1hdC1oZWFkZXItY2VsbCwgdGQubWF0LWNlbGwsIHRkLm1hdC1mb290ZXItY2VsbCB7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtaGVhZGVyLWNlbGwge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtY2VsbCwgLm1hdC1mb290ZXItY2VsbCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC10YWJsZS10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10YWJsZSB7XG4gICAgZm9udC1mYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgfVxuXG4gIC5tYXQtaGVhZGVyLWNlbGwge1xuICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMik7XG4gIH1cblxuICAubWF0LWNlbGwsIC5tYXQtZm9vdGVyLWNlbGwge1xuICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpO1xuICB9XG59XG5cblxuXG5cblxuXG5cbiRtYXQtZGF0ZXBpY2tlci1zZWxlY3RlZC10b2RheS1ib3gtc2hhZG93LXdpZHRoOiAxcHg7XG4kbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtZmFkZS1hbW91bnQ6IDAuNjtcbiRtYXQtZGF0ZXBpY2tlci10b2RheS1mYWRlLWFtb3VudDogMC4yO1xuJG1hdC1jYWxlbmRhci1ib2R5LWZvbnQtc2l6ZTogMTNweCAhZGVmYXVsdDtcbiRtYXQtY2FsZW5kYXItd2Vla2RheS10YWJsZS1mb250LXNpemU6IDExcHggIWRlZmF1bHQ7XG5cbkBtaXhpbiBfbWF0LWRhdGVwaWNrZXItY29sb3IoJHBhbGV0dGUpIHtcbiAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsIGRlZmF1bHQtY29udHJhc3QpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICAkYmFja2dyb3VuZDogbWF0LWNvbG9yKCRwYWxldHRlKTtcblxuICAgIEBpZiAodHlwZS1vZigkYmFja2dyb3VuZCkgPT0gY29sb3IpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGZhZGUtb3V0KCRiYWNrZ3JvdW5kLCAkbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtZmFkZS1hbW91bnQpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBjb3VsZG4ndCByZXNvbHZlIHRvIGJhY2tncm91bmQgdG8gYSBjb2xvciAoZS5nLiBpdCdzIGEgQ1NTIHZhcmlhYmxlKSxcbiAgICAgIC8vIGZhbGwgYmFjayB0byBmYWRpbmcgdGhlIGNvbnRlbnQgb3V0IHZpYSBgb3BhY2l0eWAuXG4gICAgICBvcGFjaXR5OiAkbWF0LWRhdGVwaWNrZXItdG9kYXktZmFkZS1hbW91bnQ7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAkbWF0LWRhdGVwaWNrZXItc2VsZWN0ZWQtdG9kYXktYm94LXNoYWRvdy13aWR0aFxuICAgICAgICAgICAgICAgIG1hdC1jb2xvcigkcGFsZXR0ZSwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1kYXRlcGlja2VyLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuXG4gIC5tYXQtY2FsZW5kYXItYXJyb3cge1xuICAgIGJvcmRlci10b3AtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaWNvbik7XG4gIH1cblxuICAvLyBUaGUgcHJldi9uZXh0IGJ1dHRvbnMgbmVlZCBhIGJpdCBtb3JlIHNwZWNpZmljaXR5IHRvXG4gIC8vIGF2b2lkIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHRoZSAubWF0LWljb24tYnV0dG9uLlxuICAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLFxuICAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLFxuICAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaWNvbik7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50IHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlcixcbiAgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUsXG4gIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUge1xuICAgICYgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gICAgLy8gTm90ZTogdGhvdWdoIGl0J3Mgbm90IHRleHQsIHRoZSBib3JkZXIgaXMgYSBoaW50IGFib3V0IHRoZSBmYWN0IHRoYXQgdGhpcyBpcyB0b2RheSdzIGRhdGUsXG4gICAgLy8gc28gd2UgdXNlIHRoZSBoaW50IGNvbG9yLlxuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBoaW50LXRleHQpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgICAkY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgaGludC10ZXh0KTtcblxuICAgIEBpZiAodHlwZS1vZigkY29sb3IpID09IGNvbG9yKSB7XG4gICAgICBib3JkZXItY29sb3I6IGZhZGUtb3V0KCRjb2xvciwgJG1hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50KTtcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGNvbG9yIGRpZG4ndCByZXNvbHZlIHRvIGEgY29sb3IgdmFsdWUsIGJ1dCBzb21ldGhpbmcgbGlrZSBhIENTUyB2YXJpYWJsZSwgd2UgY2FuJ3RcbiAgICAgIC8vIGZhZGUgaXQgb3V0IHNvIHdlIGZhbGwgYmFjayB0byByZWR1Y2luZyB0aGUgZWxlbWVudCBvcGFjaXR5LiBOb3RlIHRoYXQgd2UgZG9uJ3QgdXNlIHRoZVxuICAgICAgLy8gJG1hdC1kYXRlcGlja2VyLXRvZGF5LWZhZGUtYW1vdW50LCBiZWNhdXNlIGhpbnQgdGV4dCB1c3VhbGx5IGhhcyBzb21lIG9wYWNpdHkgYXBwbGllZFxuICAgICAgLy8gdG8gaXQgYWxyZWFkeSBhbmQgd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIHN0YWNrIG9uIHRvcCBvZiBlYWNoIG90aGVyLlxuICAgICAgb3BhY2l0eTogMC41O1xuICAgIH1cbiAgfVxuXG4gIEBpbmNsdWRlIF9tYXQtZGF0ZXBpY2tlci1jb2xvcihtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSkpO1xuXG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbig0LCAkdGhlbWUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG5cbiAgICAmLm1hdC1hY2NlbnQge1xuICAgICAgQGluY2x1ZGUgX21hdC1kYXRlcGlja2VyLWNvbG9yKG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpKTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZGF0ZXBpY2tlci1jb2xvcihtYXAtZ2V0KCR0aGVtZSwgd2FybikpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoIHtcbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbigwLCAkdGhlbWUpO1xuICB9XG5cbiAgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUge1xuICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHByaW1hcnkpKTtcblxuICAgICYubWF0LWFjY2VudCB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpKTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IobWFwLWdldCgkdGhlbWUsIHdhcm4pKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1kYXRlcGlja2VyLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWNhbGVuZGFyIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG5cbiAgLm1hdC1jYWxlbmRhci1ib2R5IHtcbiAgICBmb250LXNpemU6ICRtYXQtY2FsZW5kYXItYm9keS1mb250LXNpemU7XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsXG4gIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBidXR0b24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYnV0dG9uKTtcbiAgICB9XG4gIH1cblxuICAubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aCB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogJG1hdC1jYWxlbmRhci13ZWVrZGF5LXRhYmxlLWZvbnQtc2l6ZTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtZGlhbG9nLXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZGlhbG9nLWNvbnRhaW5lciB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMjQsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaWFsb2cpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtZGlhbG9nLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWRpYWxvZy10aXRsZSB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHRpdGxlKTtcbiAgfVxufVxuXG5cblxuXG5cblxuQG1peGluIG1hdC1leHBhbnNpb24tcGFuZWwtdGhlbWUoJHRoZW1lKSB7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwge1xuICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtb3ZlcnJpZGFibGUtZWxldmF0aW9uKDIsICR0aGVtZSk7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtYWN0aW9uLXJvdyB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIge1xuICAgICY6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pIHtcbiAgICAgICYuY2RrLWtleWJvYXJkLWZvY3VzZWQsXG4gICAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBob3Zlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzYWJsZSB0aGUgaG92ZXIgb24gdG91Y2ggZGV2aWNlcyBzaW5jZSBpdCBjYW4gYXBwZWFyIGxpa2UgaXQgaXMgc3R1Y2suIFdlIGNhbid0IHVzZVxuICAvLyBgQG1lZGlhIChob3ZlcilgIGFib3ZlLCBiZWNhdXNlIHRoZSBkZXNrdG9wIHN1cHBvcnQgYnJvd3NlciBzdXBwb3J0IGlzbid0IGdyZWF0LlxuICBAbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gICAgLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddKVxuICAgICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbixcbiAgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtYnV0dG9uKTtcblxuICAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSxcbiAgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24ge1xuICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtZXhwYW5zaW9uLXBhbmVsLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIge1xuICAgIGZvbnQ6IHtcbiAgICAgIGZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIHN1YmhlYWRpbmctMSk7XG4gICAgICB3ZWlnaHQ6IG1hdC1mb250LXdlaWdodCgkY29uZmlnLCBzdWJoZWFkaW5nLTEpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQge1xuICAgIEBpbmNsdWRlIG1hdC10eXBvZ3JhcGh5LWxldmVsLXRvLXN0eWxlcygkY29uZmlnLCBib2R5LTEpO1xuICB9XG59XG5cblxuXG5cbi8vIFRoaXMgbWl4aW4gd2lsbCBlbnN1cmUgdGhhdCBsaW5lcyB0aGF0IG92ZXJmbG93IHRoZSBjb250YWluZXIgd2lsbCBoaWRlIHRoZSBvdmVyZmxvdyBhbmRcbi8vIHRydW5jYXRlIG5lYXRseSB3aXRoIGFuIGVsbGlwc2lzLlxuQG1peGluIG1hdC10cnVuY2F0ZS1saW5lKCkge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuLy8gTWl4aW4gdG8gcHJvdmlkZSBhbGwgbWF0LWxpbmUgc3R5bGVzLCBjaGFuZ2luZyBzZWNvbmRhcnkgZm9udCBzaXplIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxpc3Rcbi8vIGlzIGluIGRlbnNlIG1vZGUuXG5AbWl4aW4gbWF0LWxpbmUtYmFzZSgkc2Vjb25kYXJ5LWZvbnQtc2l6ZSkge1xuICAubWF0LWxpbmUge1xuICAgIEBpbmNsdWRlIG1hdC10cnVuY2F0ZS1saW5lKCk7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAgIC8vIGFsbCBsaW5lcyBidXQgdGhlIHRvcCBsaW5lIHNob3VsZCBoYXZlIHNtYWxsZXIgdGV4dFxuICAgICY6bnRoLWNoaWxkKG4rMikge1xuICAgICAgZm9udC1zaXplOiAkc2Vjb25kYXJ5LWZvbnQtc2l6ZTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhpcyBtaXhpbiBub3JtYWxpemVzIGRlZmF1bHQgZWxlbWVudCBzdHlsZXMsIGUuZy4gZm9udCB3ZWlnaHQgZm9yIGhlYWRpbmcgdGV4dC5cbkBtaXhpbiBtYXQtbm9ybWFsaXplLXRleHQoKSB7XG4gICYgPiAqIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBUaGlzIG1peGluIHByb3ZpZGVzIGJhc2Ugc3R5bGVzIGZvciB0aGUgd3JhcHBlciBhcm91bmQgbWF0LWxpbmUgZWxlbWVudHMgaW4gYSBsaXN0LlxuQG1peGluIG1hdC1saW5lLXdyYXBwZXItYmFzZSgpIHtcbiAgQGluY2x1ZGUgbWF0LW5vcm1hbGl6ZS10ZXh0KCk7XG5cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgLy8gTXVzdCByZW1vdmUgd3JhcHBlciB3aGVuIGxpbmVzIGFyZSBlbXB0eSBvciBpdCB0YWtlcyB1cCBob3Jpem9udGFsXG4gIC8vIHNwYWNlIGFuZCBwdXNoZXMgb3RoZXIgZWxlbWVudHMgdG8gdGhlIHJpZ2h0LlxuICAmOmVtcHR5IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuXG4vLyBJbmNsdWRlIHRoaXMgZW1wdHkgbWl4aW4gZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGNvbXBvbmVudHMuXG5AbWl4aW4gbWF0LWdyaWQtbGlzdC10aGVtZSgkdGhlbWUpIHsgfVxuXG5AbWl4aW4gbWF0LWdyaWQtbGlzdC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1ncmlkLXRpbGUtaGVhZGVyLFxuICAubWF0LWdyaWQtdGlsZS1mb290ZXIge1xuICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKSk7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cblxuLy8gSW5jbHVkZSB0aGlzIGVtcHR5IG1peGluIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBjb21wb25lbnRzLlxuQG1peGluIG1hdC1pY29uLXRoZW1lKCR0aGVtZSkge1xuICAkcHJpbWFyeTogbWFwLWdldCgkdGhlbWUsIHByaW1hcnkpO1xuICAkYWNjZW50OiBtYXAtZ2V0KCR0aGVtZSwgYWNjZW50KTtcbiAgJHdhcm46IG1hcC1nZXQoJHRoZW1lLCB3YXJuKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWljb24ge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1pY29uLXR5cG9ncmFwaHkoJGNvbmZpZykgeyB9XG5cblxuXG5cblxuLy8gUmVuZGVycyBhIGdyYWRpZW50IGZvciBzaG93aW5nIHRoZSBkYXNoZWQgbGluZSB3aGVuIHRoZSBpbnB1dCBpcyBkaXNhYmxlZC5cbi8vIFVubGlrZSB1c2luZyBhIGJvcmRlciwgYSBncmFkaWVudCBhbGxvd3MgdXMgdG8gYWRqdXN0IHRoZSBzcGFjaW5nIG9mIHRoZSBkb3R0ZWQgbGluZVxuLy8gdG8gbWF0Y2ggdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLlxuQG1peGluIG1hdC1jb250cm9sLWRpc2FibGVkLXVuZGVybGluZSgkY29sb3IpIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAkY29sb3IgMCUsICRjb2xvciAzMyUsIHRyYW5zcGFyZW50IDAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0cHggMTAwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xufVxuXG4vLyBGaWd1cmVzIG91dCB0aGUgY29sb3Igb2YgdGhlIHBsYWNlaG9sZGVyIGZvciBhIGZvcm0gY29udHJvbC5cbi8vIFVzZWQgcHJpbWFyaWx5IHRvIHByZXZlbnQgdGhlIHZhcmlvdXMgZm9ybSBjb250cm9scyBmcm9tXG4vLyBiZWNvbWluZyBvdXQgb2Ygc3luYyBzaW5jZSB0aGVzZSBjb2xvcnMgYXJlbid0IGluIGEgcGFsZXR0ZS5cbkBmdW5jdGlvbiBfbWF0LWNvbnRyb2wtcGxhY2Vob2xkZXItY29sb3IoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gIEByZXR1cm4gbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNSwgMC40MikpO1xufVxuXG5cbi8qIHN0eWxlbGludC1kaXNhYmxlIG1hdGVyaWFsL25vLXByZWZpeGVzICovXG5AbWl4aW4gdXNlci1zZWxlY3QoJHZhbHVlKSB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbiAgLW1vei11c2VyLXNlbGVjdDogJHZhbHVlO1xuICAtbXMtdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbiAgdXNlci1zZWxlY3Q6ICR2YWx1ZTtcbn1cblxuQG1peGluIGlucHV0LXBsYWNlaG9sZGVyIHtcbiAgJjo6cGxhY2Vob2xkZXIge1xuICAgIEBjb250ZW50O1xuICB9XG5cbiAgJjo6LW1vei1wbGFjZWhvbGRlciB7XG4gICAgQGNvbnRlbnQ7XG4gIH1cblxuICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICBAY29udGVudDtcbiAgfVxuXG4gICY6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICBAY29udGVudDtcbiAgfVxufVxuXG5AbWl4aW4gY3Vyc29yLWdyYWIge1xuICBjdXJzb3I6IC13ZWJraXQtZ3JhYjtcbiAgY3Vyc29yOiBncmFiO1xufVxuXG5AbWl4aW4gY3Vyc29yLWdyYWJiaW5nIHtcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nO1xuICBjdXJzb3I6IGdyYWJiaW5nO1xufVxuXG5AbWl4aW4gYmFja2ZhY2UtdmlzaWJpbGl0eSgkdmFsdWUpIHtcbiAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiAkdmFsdWU7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6ICR2YWx1ZTtcbn1cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cblxuXG5cbkBtaXhpbiBtYXQtaW5wdXQtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcbiAgfVxuXG4gIC5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxcbiAgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LWlucHV0LWVsZW1lbnQge1xuICAgIGNhcmV0LWNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnkpO1xuXG4gICAgQGluY2x1ZGUgaW5wdXQtcGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6IF9tYXQtY29udHJvbC1wbGFjZWhvbGRlci1jb2xvcigkdGhlbWUpO1xuICAgIH1cblxuICAgIC8vIE9uIGRhcmsgdGhlbWVzIHdlIHNldCB0aGUgbmF0aXZlIGBzZWxlY3RgIGNvbG9yIHRvIHNvbWUgc2hhZGUgb2Ygd2hpdGUsXG4gICAgLy8gaG93ZXZlciB0aGUgY29sb3IgcHJvcGFnYXRlcyB0byBhbGwgb2YgdGhlIGBvcHRpb25gIGVsZW1lbnRzLCB3aGljaCBhcmVcbiAgICAvLyBhbHdheXMgb24gYSB3aGl0ZSBiYWNrZ3JvdW5kIGluc2lkZSB0aGUgZHJvcGRvd24sIGNhdXNpbmcgdGhlbSB0byBibGVuZCBpbi5cbiAgICAvLyBTaW5jZSB3ZSBjYW4ndCBjaGFuZ2UgYmFja2dyb3VuZCBvZiB0aGUgZHJvcGRvd24sIHdlIG5lZWQgdG8gZXhwbGljaXRseVxuICAgIC8vIHJlc2V0IHRoZSBjb2xvciBvZiB0aGUgb3B0aW9ucyB0byBzb21ldGhpbmcgZGFyay5cbiAgICBAaWYgKG1hcC1nZXQoJHRoZW1lLCBpcy1kYXJrKSkge1xuICAgICAgb3B0aW9uIHtcbiAgICAgICAgY29sb3I6ICRkYXJrLXByaW1hcnktdGV4dDtcbiAgICAgIH1cblxuICAgICAgb3B0aW9uOmRpc2FibGVkIHtcbiAgICAgICAgY29sb3I6ICRkYXJrLWRpc2FibGVkLXRleHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICB9XG5cbiAgLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxcbiAgLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1pbnB1dC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLy8gVGhlIHVuaXQtbGVzcyBsaW5lLWhlaWdodCBmcm9tIHRoZSBmb250IGNvbmZpZy5cbiAgJGxpbmUtaGVpZ2h0OiBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgaW5wdXQpO1xuXG4gIC8vIFRoZSBhbW91bnQgb2Ygc3BhY2UgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBhY3R1YWwgdGV4dFxuICAvLyAoYXMgYSBmcmFjdGlvbiBvZiB0aGUgZm9udC1zaXplKS5cbiAgJGxpbmUtc3BhY2luZzogKCRsaW5lLWhlaWdodCAtIDEpIC8gMjtcblxuICAvLyA8aW5wdXQ+IGVsZW1lbnRzIHNlZW0gdG8gaGF2ZSB0aGVpciBoZWlnaHQgc2V0IHNsaWdodGx5IHRvbyBsYXJnZSBvbiBTYWZhcmkgY2F1c2luZyB0aGUgdGV4dCB0b1xuICAvLyBiZSBtaXNhbGlnbmVkIHcuci50LiB0aGUgcGxhY2Vob2xkZXIuIEFkZGluZyB0aGlzIG1hcmdpbiBjb3JyZWN0cyBpdC5cbiAgaW5wdXQubWF0LWlucHV0LWVsZW1lbnQge1xuICAgIG1hcmdpbi10b3A6IC0kbGluZS1zcGFjaW5nICogMWVtO1xuICB9XG59XG5cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtbGlzdC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LWxpc3QtYmFzZSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gICAgfVxuXG4gICAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG5cbiAgICAubWF0LXN1YmhlYWRlciB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1saXN0LWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlzYWJsZWQtbGlzdC1vcHRpb24pO1xuICB9XG5cbiAgLm1hdC1saXN0LW9wdGlvbixcbiAgLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbSxcbiAgLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbSB7XG4gICAgJjpob3ZlciwgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdob3ZlcicpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LWxpc3QtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gICRmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuXG4gIC5tYXQtbGlzdC1pdGVtIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5O1xuICB9XG5cbiAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgbGlzdFxuICAubWF0LWxpc3QtYmFzZSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIHN1YmhlYWRpbmctMik7XG4gICAgICBAaW5jbHVkZSBtYXQtbGluZS1iYXNlKG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKSk7XG4gICAgfVxuXG4gICAgLm1hdC1saXN0LW9wdGlvbiB7XG4gICAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgc3ViaGVhZGluZy0yKTtcbiAgICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpKTtcbiAgICB9XG5cbiAgICAubWF0LXN1YmhlYWRlciB7XG4gICAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcsIGJvZHktMik7XG4gICAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cblxuICAvLyBEZW5zZSBsaXN0XG4gIC5tYXQtbGlzdC1iYXNlW2RlbnNlXSB7XG4gICAgLm1hdC1saXN0LWl0ZW0ge1xuICAgICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pO1xuICAgICAgQGluY2x1ZGUgbWF0LWxpbmUtYmFzZShtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pKTtcbiAgICB9XG5cbiAgICAubWF0LWxpc3Qtb3B0aW9uIHtcbiAgICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIEBpbmNsdWRlIG1hdC1saW5lLWJhc2UobWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKSk7XG4gICAgfVxuXG4gICAgLm1hdC1zdWJoZWFkZXIge1xuICAgICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseTtcbiAgICAgIGZvbnQtc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1tZW51LXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtbWVudS1wYW5lbCB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oNCwgJHRoZW1lKTtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsICdjYXJkJyk7XG4gIH1cblxuICAubWF0LW1lbnUtaXRlbSB7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ3RleHQnKTtcblxuICAgICZbZGlzYWJsZWRdIHtcbiAgICAgICYsICY6OmFmdGVyIHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLFxuICAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVyIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCAnaWNvbicpO1xuICB9XG5cbiAgLm1hdC1tZW51LWl0ZW06aG92ZXIsXG4gIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkLFxuICAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCB7XG4gICAgJjpub3QoW2Rpc2FibGVkXSkge1xuICAgICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnaG92ZXInKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1tZW51LXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LW1lbnUtaXRlbSB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZywgYm9keS0xKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0xKTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gbWF0LXBhZ2luYXRvci10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcblxuICAubWF0LXBhZ2luYXRvciB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICB9XG5cbiAgLm1hdC1wYWdpbmF0b3IsXG4gIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gIH1cblxuICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsXG4gIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2ljb24nKTtcbiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCBtYXQtY29sb3IoJGZvcmVncm91bmQsICdpY29uJyk7XG4gIH1cblxuICAubWF0LXBhZ2luYXRvci1maXJzdCxcbiAgLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgJ2ljb24nKTtcbiAgfVxuXG4gIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIHtcbiAgICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsXG4gICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50LFxuICAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuICAgIC5tYXQtcGFnaW5hdG9yLWxhc3Qge1xuICAgICAgYm9yZGVyLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsICdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LXBhZ2luYXRvci10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1wYWdpbmF0b3IsXG4gIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBjYXB0aW9uKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgY2FwdGlvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC1wcm9ncmVzcy1iYXItdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICAgIGZpbGw6IG1hdC1jb2xvcigkcHJpbWFyeSwgbGlnaHRlcik7XG4gIH1cblxuICAubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSwgbGlnaHRlcik7XG4gIH1cblxuICAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgfVxuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQge1xuICAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICAgICAgZmlsbDogbWF0LWNvbG9yKCRhY2NlbnQsIGxpZ2h0ZXIpO1xuICAgIH1cblxuICAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIHtcbiAgICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgICAgIGZpbGw6IG1hdC1jb2xvcigkd2FybiwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkd2FybiwgbGlnaHRlcik7XG4gICAgfVxuXG4gICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1wcm9ncmVzcy1iYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7IH1cblxuXG5cblxuXG5cbkBtaXhpbiBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1wcm9ncmVzcy1zcGlubmVyLCAubWF0LXNwaW5uZXIge1xuICAgIGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgICB9XG5cbiAgICAmLm1hdC13YXJuIGNpcmNsZSB7XG4gICAgICBzdHJva2U6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cbkBtaXhpbiBfbWF0LXJhZGlvLWNvbG9yKCRwYWxldHRlKSB7XG4gICYubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlKTtcbiAgfVxuXG4gIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuICAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbiAgJi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLFxuICAmOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtcmFkaW8tdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1yYWRpby1idXR0b24ge1xuICAgICYubWF0LXByaW1hcnkge1xuICAgICAgQGluY2x1ZGUgX21hdC1yYWRpby1jb2xvcigkcHJpbWFyeSk7XG4gICAgfVxuXG4gICAgJi5tYXQtYWNjZW50IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtcmFkaW8tY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXJhZGlvLWNvbG9yKCR3YXJuKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIG5lZWRzIGV4dHJhIHNwZWNpZmljaXR5LCBiZWNhdXNlIHRoZSBjbGFzc2VzIGFib3ZlIGFyZSBjb21iaW5lZFxuICAgIC8vIChlLmcuIGAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50YCkgd2hpY2ggaW5jcmVhc2VzIHRoZWlyIHNwZWNpZmljaXR5IGEgbG90LlxuICAgIC8vIFRPRE86IGNvbnNpZGVyIG1ha2luZyB0aGUgc2VsZWN0b3JzIGludG8gZGVzY2VuZGFudHMgKGAubWF0LXByaW1hcnkgLm1hdC1yYWRpby1idXR0b25gKS5cbiAgICAmLm1hdC1yYWRpby1kaXNhYmxlZCB7XG4gICAgICAmLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLFxuICAgICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICAgICAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQpO1xuICAgICAgfVxuXG4gICAgICAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50LFxuICAgICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkKTtcbiAgICAgIH1cblxuICAgICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50IHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN3aXRjaCB0aGlzIHRvIGEgc29saWQgY29sb3Igc2luY2Ugd2UncmUgdXNpbmcgYG9wYWNpdHlgXG4gICAgLy8gdG8gY29udHJvbCBob3cgb3BhcXVlIHRoZSByaXBwbGUgc2hvdWxkIGJlLlxuICAgIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWFwX2dldCgkZm9yZWdyb3VuZCwgYmFzZSk7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtcmFkaW8tdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtcmFkaW8tYnV0dG9uIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1zZWxlY3QtdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuXG4gIC5tYXQtc2VsZWN0LXZhbHVlIHtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogX21hdC1jb250cm9sLXBsYWNlaG9sZGVyLWNvbG9yKCR0aGVtZSk7XG4gIH1cblxuICAubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC12YWx1ZSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGlzYWJsZWQtdGV4dCk7XG4gIH1cblxuICAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICB9XG5cbiAgLm1hdC1zZWxlY3QtcGFuZWwge1xuICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgY2FyZCk7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1vdmVycmlkYWJsZS1lbGV2YXRpb24oNCwgJHRoZW1lKTtcblxuICAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpIHtcbiAgICAgIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgaG92ZXIsIDAuMTIpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZCB7XG4gICAgJi5tYXQtZm9jdXNlZCB7XG4gICAgICAmLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93IHtcbiAgICAgICAgY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICAgICB9XG5cbiAgICAgICYubWF0LWFjY2VudCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCk7XG4gICAgICB9XG5cbiAgICAgICYubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgICAgICBjb2xvcjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1zZWxlY3QtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcblxuICAubWF0LXNlbGVjdCB7XG4gICAgZm9udC1mYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnKTtcbiAgfVxuXG4gIC5tYXQtc2VsZWN0LXRyaWdnZXIge1xuICAgIGhlaWdodDogJGxpbmUtaGVpZ2h0ICogMWVtO1xuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gbWF0LXNpZGVuYXYtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICRkcmF3ZXItYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBkaWFsb2cpO1xuICAkZHJhd2VyLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yOiAgbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKTtcbiAgJGRyYXdlci1wdXNoLWJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgZGlhbG9nKTtcbiAgJGRyYXdlci1zaWRlLWJvcmRlcjogc29saWQgMXB4IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG5cbiAgLm1hdC1kcmF3ZXItY29udGFpbmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZHJhd2VyLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuICB9XG5cbiAgLm1hdC1kcmF3ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRkcmF3ZXItYmFja2dyb3VuZC1jb2xvcjtcbiAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcblxuICAgICYubWF0LWRyYXdlci1wdXNoIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRkcmF3ZXItcHVzaC1iYWNrZ3JvdW5kLWNvbG9yO1xuICAgIH1cblxuICAgICY6bm90KC5tYXQtZHJhd2VyLXNpZGUpIHtcbiAgICAgIC8vIFRoZSBlbGV2YXRpb24gb2Ygei0xNiBpcyBub3RlZCBpbiB0aGUgZGVzaWduIHNwZWNpZmljYXRpb25zLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vbWF0ZXJpYWwuaW8vZGVzaWduL2NvbXBvbmVudHMvbmF2aWdhdGlvbi1kcmF3ZXIuaHRtbFxuICAgICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMTYsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1kcmF3ZXItc2lkZSB7XG4gICAgYm9yZGVyLXJpZ2h0OiAkZHJhd2VyLXNpZGUtYm9yZGVyO1xuXG4gICAgJi5tYXQtZHJhd2VyLWVuZCB7XG4gICAgICBib3JkZXItbGVmdDogJGRyYXdlci1zaWRlLWJvcmRlcjtcbiAgICAgIGJvcmRlci1yaWdodDogbm9uZTtcbiAgICB9XG4gIH1cblxuICBbZGlyPSdydGwnXSAubWF0LWRyYXdlci1zaWRlIHtcbiAgICBib3JkZXItbGVmdDogJGRyYXdlci1zaWRlLWJvcmRlcjtcbiAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG5cbiAgICAmLm1hdC1kcmF3ZXItZW5kIHtcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xuICAgICAgYm9yZGVyLXJpZ2h0OiAkZHJhd2VyLXNpZGUtYm9yZGVyO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd24ge1xuICAgICRvcGFjaXR5OiAwLjY7XG4gICAgJGJhY2tkcm9wLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGNhcmQsICRvcGFjaXR5KTtcblxuICAgIEBpZiAodHlwZS1vZigkYmFja2Ryb3AtY29sb3IpID09IGNvbG9yKSB7XG4gICAgICAvLyBXZSB1c2UgaW52ZXJ0KCkgaGVyZSB0byBoYXZlIHRoZSBkYXJrZW4gdGhlIGJhY2tncm91bmQgY29sb3IgZXhwZWN0ZWQgdG8gYmUgdXNlZC4gSWYgdGhlXG4gICAgICAvLyBiYWNrZ3JvdW5kIGlzIGxpZ2h0LCB3ZSB1c2UgYSBkYXJrIGJhY2tkcm9wLiBJZiB0aGUgYmFja2dyb3VuZCBpcyBkYXJrLFxuICAgICAgLy8gd2UgdXNlIGEgbGlnaHQgYmFja2Ryb3AuXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbnZlcnQoJGJhY2tkcm9wLWNvbG9yKTtcbiAgICB9XG4gICAgQGVsc2Uge1xuICAgICAgLy8gSWYgd2UgY291bGRuJ3QgcmVzb2x2ZSB0aGUgYmFja2Ryb3AgY29sb3IgdG8gYSBjb2xvciB2YWx1ZSwgZmFsbCBiYWNrIHRvIHVzaW5nXG4gICAgICAvLyBgb3BhY2l0eWAgdG8gbWFrZSBpdCBvcGFxdWUgc2luY2UgaXRzIGVuZCB2YWx1ZSBjb3VsZCBiZSBhIHNvbGlkIGNvbG9yLlxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGJhY2tkcm9wLWNvbG9yO1xuICAgICAgb3BhY2l0eTogJG9wYWNpdHk7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtc2lkZW5hdi10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cblxuQG1peGluIF9tYXQtc2xpZGUtdG9nZ2xlLWNoZWNrZWQoJHBhbGV0dGUsICR0aHVtYi1jaGVja2VkLWh1ZSkge1xuICAmLm1hdC1jaGVja2VkIHtcbiAgICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsICR0aHVtYi1jaGVja2VkLWh1ZSk7XG4gICAgfVxuXG4gICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgICAgIC8vIE9wYWNpdHkgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzcGVjcyBmb3IgdGhlIHNlbGVjdGlvbiBjb250cm9scy5cbiAgICAgIC8vIFNlZTogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vY29tcG9uZW50cy9zZWxlY3Rpb24tY29udHJvbHMuaHRtbCNzcGVjc1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlLCAkdGh1bWItY2hlY2tlZC1odWUsIDAuNTQpO1xuICAgIH1cblxuICAgIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgICAgLy8gU2V0IG5vIG9wYWNpdHkgZm9yIHRoZSByaXBwbGVzIGJlY2F1c2UgdGhlIHJpcHBsZSBvcGFjaXR5IHdpbGwgYmUgYWRqdXN0ZWQgZHluYW1pY2FsbHlcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGludGVyYWN0aW9uIHdpdGggdGhlIHNsaWRlLXRvZ2dsZSAoZS5nLiBmb3IgaG92ZXIsIGZvY3VzKVxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwYWxldHRlLCAkdGh1bWItY2hlY2tlZC1odWUpO1xuICAgIH1cbiAgfVxufVxuXG5AbWl4aW4gbWF0LXNsaWRlLXRvZ2dsZS10aGVtZSgkdGhlbWUpIHtcbiAgJGlzLWRhcms6IG1hcF9nZXQoJHRoZW1lLCBpcy1kYXJrKTtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLy8gQ29sb3IgaHVlcyBhcmUgYmFzZWQgb24gdGhlIHNwZWNzIHdoaWNoIGJyaWVmbHkgc2hvdyB0aGUgaHVlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIGEgc3dpdGNoLlxuICAvLyBUaGUgMjAxOCBzcGVjcyBubyBsb25nZXIgZGVzY3JpYmUgaG93IGRhcmsgc3dpdGNoZXMgc2hvdWxkIGxvb2sgbGlrZS4gRHVlIHRvIHRoZSBsYWNrIG9mXG4gIC8vIGluZm9ybWF0aW9uIGZvciBkYXJrIHRoZW1lZCBzd2l0Y2hlcywgd2UgcGFydGlhbGx5IGtlZXAgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGlzIGJhc2VkIG9uXG4gIC8vIHRoZSBwcmV2aW91cyBzcGVjaWZpY2F0aW9ucy4gRm9yIHRoZSBjaGVja2VkIGNvbG9yIHdlIGFsd2F5cyB1c2UgdGhlIGBkZWZhdWx0YCBodWUgYmVjYXVzZVxuICAvLyB0aGF0IGZvbGxvd3MgTURDIGFuZCBhbHNvIG1ha2VzIGl0IGVhc2llciBmb3IgcGVvcGxlIHRvIGNyZWF0ZSBhIGN1c3RvbSB0aGVtZSB3aXRob3V0IG5lZWRpbmdcbiAgLy8gdG8gc3BlY2lmeSBlYWNoIGh1ZSBpbmRpdmlkdWFsbHkuXG4gICR0aHVtYi11bmNoZWNrZWQtaHVlOiBpZigkaXMtZGFyaywgNDAwLCA1MCk7XG4gICR0aHVtYi1jaGVja2VkLWh1ZTogZGVmYXVsdDtcblxuICAkYmFyLXVuY2hlY2tlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZCk7XG4gICRyaXBwbGUtdW5jaGVja2VkLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGJhc2UpO1xuXG4gIC5tYXQtc2xpZGUtdG9nZ2xlIHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlLXRvZ2dsZS1jaGVja2VkKCRhY2NlbnQsICR0aHVtYi1jaGVja2VkLWh1ZSk7XG5cbiAgICAmLm1hdC1wcmltYXJ5IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtc2xpZGUtdG9nZ2xlLWNoZWNrZWQoJHByaW1hcnksICR0aHVtYi1jaGVja2VkLWh1ZSk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXNsaWRlLXRvZ2dsZS1jaGVja2VkKCR3YXJuLCAkdGh1bWItY2hlY2tlZC1odWUpO1xuICAgIH1cblxuICAgICY6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgICAvLyBTZXQgbm8gb3BhY2l0eSBmb3IgdGhlIHJpcHBsZXMgYmVjYXVzZSB0aGUgcmlwcGxlIG9wYWNpdHkgd2lsbCBiZSBhZGp1c3RlZCBkeW5hbWljYWxseVxuICAgICAgLy8gYmFzZWQgb24gdGhlIHR5cGUgb2YgaW50ZXJhY3Rpb24gd2l0aCB0aGUgc2xpZGUtdG9nZ2xlIChlLmcuIGZvciBob3ZlciwgZm9jdXMpXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkcmlwcGxlLXVuY2hlY2tlZC1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gICAgQGluY2x1ZGUgX21hdC10aGVtZS1lbGV2YXRpb24oMSwgJHRoZW1lKTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJG1hdC1ncmV5LCAkdGh1bWItdW5jaGVja2VkLWh1ZSk7XG4gIH1cblxuICAubWF0LXNsaWRlLXRvZ2dsZS1iYXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRiYXItdW5jaGVja2VkLWNvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtc2xpZGUtdG9nZ2xlLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG59XG5cblxuXG5cblxuQG1peGluIF9tYXQtc2xpZGVyLWlubmVyLWNvbnRlbnQtdGhlbWUoJHBhbGV0dGUpIHtcbiAgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbiAgLm1hdC1zbGlkZXItdGh1bWIsXG4gIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUpO1xuICB9XG5cbiAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkcGFsZXR0ZSwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zbGlkZXItdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gICRtYXQtc2xpZGVyLW9mZi1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzbGlkZXItb2ZmKTtcbiAgJG1hdC1zbGlkZXItb2ZmLWZvY3VzZWQtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2xpZGVyLW9mZi1hY3RpdmUpO1xuICAkbWF0LXNsaWRlci1kaXNhYmxlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzbGlkZXItb2ZmKTtcbiAgJG1hdC1zbGlkZXItbGFiZWxlZC1taW4tdmFsdWUtdGh1bWItY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2xpZGVyLW1pbik7XG4gICRtYXQtc2xpZGVyLWxhYmVsZWQtbWluLXZhbHVlLXRodW1iLWxhYmVsLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNsaWRlci1vZmYpO1xuICAkbWF0LXNsaWRlci1mb2N1cy1yaW5nLWNvbG9yOiBtYXQtY29sb3IoJGFjY2VudCwgZGVmYXVsdCwgMC4yKTtcbiAgJG1hdC1zbGlkZXItZm9jdXMtcmluZy1taW4tdmFsdWUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgYmFzZSwgMC4xMik7XG4gICRtYXQtc2xpZGVyLXRpY2stY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgYmFzZSwgMC43KTtcbiAgJG1hdC1zbGlkZXItdGljay1zaXplOiAycHg7XG5cbiAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItb2ZmLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1wcmltYXJ5IHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCRwcmltYXJ5KTtcbiAgfVxuXG4gIC5tYXQtYWNjZW50IHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCRhY2NlbnQpO1xuICB9XG5cbiAgLm1hdC13YXJuIHtcbiAgICBAaW5jbHVkZSBfbWF0LXNsaWRlci1pbm5lci1jb250ZW50LXRoZW1lKCR3YXJuKTtcbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLWZvY3VzLXJpbmctY29sb3I7XG4gIH1cblxuICAubWF0LXNsaWRlcjpob3ZlcixcbiAgLmNkay1mb2N1c2VkIHtcbiAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLW9mZi1mb2N1c2VkLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWRpc2FibGVkIHtcbiAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLFxuICAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4gICAgLm1hdC1zbGlkZXItdGh1bWIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItZGlzYWJsZWQtY29sb3I7XG4gICAgfVxuXG4gICAgJjpob3ZlciB7XG4gICAgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItZGlzYWJsZWQtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLm1hdC1zbGlkZXItbWluLXZhbHVlIHtcbiAgICAubWF0LXNsaWRlci1mb2N1cy1yaW5nIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRtYXQtc2xpZGVyLWZvY3VzLXJpbmctbWluLXZhbHVlLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIHtcbiAgICAgIC5tYXQtc2xpZGVyLXRodW1iLFxuICAgICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkbWF0LXNsaWRlci1sYWJlbGVkLW1pbi12YWx1ZS10aHVtYi1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgJi5jZGstZm9jdXNlZCB7XG4gICAgICAgIC5tYXQtc2xpZGVyLXRodW1iLFxuICAgICAgICAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJG1hdC1zbGlkZXItbGFiZWxlZC1taW4tdmFsdWUtdGh1bWItbGFiZWwtY29sb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSB7XG4gICAgICAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJG1hdC1zbGlkZXItb2ZmLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlcixcbiAgICAgICYuY2RrLWZvY3VzZWQge1xuICAgICAgICAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci1vZmYtZm9jdXNlZC1jb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgICYubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gICAgICAgICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci1kaXNhYmxlZC1jb2xvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkbWF0LXNsaWRlci10aWNrLWNvbG9yO1xuICB9XG5cbiAgLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrcyB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgICAvLyBGaXJlZm94IGRvZXNuJ3QgZHJhdyB0aGUgZ3JhZGllbnQgY29ycmVjdGx5IHdpdGggJ3RvIHJpZ2h0J1xuICAgIC8vIChzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMxNDMxOSkuXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgfVxuXG4gIC5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiByZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgJG1hdC1zbGlkZXItdGljay1jb2xvcixcbiAgICAgICAgJG1hdC1zbGlkZXItdGljay1jb2xvciAkbWF0LXNsaWRlci10aWNrLXNpemUsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtcbiAgfVxufVxuXG5AbWl4aW4gbWF0LXNsaWRlci10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGNhcHRpb24pO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5AbWl4aW4gbWF0LXN0ZXBwZXItdGhlbWUoJHRoZW1lKSB7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG5cbiAgLm1hdC1zdGVwLWhlYWRlciB7XG4gICAgJi5jZGsta2V5Ym9hcmQtZm9jdXNlZCxcbiAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGhvdmVyKTtcbiAgICB9XG5cbiAgICAvLyBPbiB0b3VjaCBkZXZpY2VzIHRoZSA6aG92ZXIgc3RhdGUgd2lsbCBsaW5nZXIgb24gdGhlIGVsZW1lbnQgYWZ0ZXIgYSB0YXAuXG4gICAgLy8gUmVzZXQgaXQgdmlhIGBAbWVkaWFgIGFmdGVyIHRoZSBkZWNsYXJhdGlvbiwgYmVjYXVzZSB0aGUgbWVkaWEgcXVlcnkgaXNuJ3RcbiAgICAvLyBzdXBwb3J0ZWQgYnkgYWxsIGJyb3dzZXJzIHlldC5cbiAgICBAbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtbGFiZWwsXG4gICAgLm1hdC1zdGVwLW9wdGlvbmFsIHtcbiAgICAgIC8vIFRPRE8oam9zZXBocGVycm90dCk6IFVwZGF0ZSB0byB1c2luZyBhIGNvcnJlY3RlZCBkaXNhYmxlZC10ZXh0IGNvbnRyYXN0XG4gICAgICAvLyBpbnN0ZWFkIG9mIHNlY29uZGFyeS10ZXh0LlxuICAgICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgc2Vjb25kYXJ5LXRleHQpO1xuICAgIH1cblxuICAgIC5tYXQtc3RlcC1pY29uIHtcbiAgICAgIC8vIFRPRE8oam9zZXBocGVycm90dCk6IFVwZGF0ZSB0byB1c2luZyBhIGNvcnJlY3RlZCBkaXNhYmxlZC10ZXh0IGNvbnRyYXN0XG4gICAgICAvLyBpbnN0ZWFkIG9mIHNlY29uZGFyeS10ZXh0LlxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5LCBkZWZhdWx0LWNvbnRyYXN0KTtcbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCxcbiAgICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLFxuICAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJHByaW1hcnksIGRlZmF1bHQtY29udHJhc3QpO1xuICAgIH1cblxuICAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuXG4gICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZSB7XG4gICAgICBjb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgICB9XG5cbiAgICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3Ige1xuICAgICAgY29sb3I6IG1hdC1jb2xvcigkd2Fybik7XG4gICAgfVxuICB9XG5cbiAgLm1hdC1zdGVwcGVyLWhvcml6b250YWwsIC5tYXQtc3RlcHBlci12ZXJ0aWNhbCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCBjYXJkKTtcbiAgfVxuXG4gIC5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lOjpiZWZvcmUge1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG5cbiAgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsXG4gIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YWZ0ZXIsXG4gIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmUge1xuICAgIGJvcmRlci10b3AtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlcik7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zdGVwcGVyLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXN0ZXBwZXItdmVydGljYWwsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICB9XG5cbiAgLm1hdC1zdGVwLWxhYmVsIHtcbiAgICBmb250OiB7XG4gICAgICBzaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gICAgICB3ZWlnaHQ6IG1hdC1mb250LXdlaWdodCgkY29uZmlnLCBib2R5LTEpO1xuICAgIH07XG4gIH1cblxuICAubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yIHtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICB9XG5cbiAgLm1hdC1zdGVwLWxhYmVsLWVycm9yIHtcbiAgICBmb250LXNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYm9keS0yKTtcbiAgfVxuXG4gIC5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZCB7XG4gICAgZm9udDoge1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTIpO1xuICAgICAgd2VpZ2h0OiBtYXQtZm9udC13ZWlnaHQoJGNvbmZpZywgYm9keS0yKTtcbiAgICB9O1xuICB9XG59XG5cbkBtaXhpbiBtYXQtc29ydC10aGVtZSgkdGhlbWUpIHtcbiAgJGJhY2tncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBiYWNrZ3JvdW5kKTtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAubWF0LXNvcnQtaGVhZGVyLWFycm93IHtcbiAgICAkdGFibGUtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICAgICR0ZXh0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0KTtcblxuICAgIC8vIEJlY2F1c2UgdGhlIGFycm93IGlzIG1hZGUgdXAgb2YgbXVsdGlwbGUgZWxlbWVudHMgdGhhdCBhcmUgc3RhY2tlZCBvbiB0b3Agb2YgZWFjaCBvdGhlcixcbiAgICAvLyB3ZSBjYW4ndCB1c2UgdGhlIHNlbWktdHJhc3BhcmVudCBjb2xvciBmcm9tIHRoZSB0aGVtZSBkaXJlY3RseS4gSWYgdGhlIHZhbHVlIGlzIGEgY29sb3JcbiAgICAvLyAqdHlwZSosIHdlIGNvbnZlcnQgaXQgaW50byBhIHNvbGlkIGNvbG9yIGJ5IHRha2luZyB0aGUgb3BhY2l0eSBmcm9tIHRoZSByZ2JhIHZhbHVlIGFuZFxuICAgIC8vIHVzaW5nIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGJhY2tncm91bmQgdG8gcHV0IGludG8gZm9yZWdyb3VuZFxuICAgIC8vIHdoZW4gbWl4aW5nIHRoZSBjb2xvcnMgdG9nZXRoZXIuIE90aGVyd2lzZSwgaWYgaXQgcmVzb2x2ZXMgdG8gc29tZXRoaW5nIGRpZmZlcmVudFxuICAgIC8vIChlLmcuIGl0IHJlc29sdmVzIHRvIGEgQ1NTIHZhcmlhYmxlKSwgd2UgdXNlIHRoZSBjb2xvciBkaXJlY3RseS5cbiAgICBAaWYgKHR5cGUtb2YoJHRhYmxlLWJhY2tncm91bmQpID09IGNvbG9yIGFuZCB0eXBlLW9mKCR0ZXh0LWNvbG9yKSA9PSBjb2xvcikge1xuICAgICAgJHRleHQtb3BhY2l0eTogb3BhY2l0eSgkdGV4dC1jb2xvcik7XG4gICAgICBjb2xvcjogbWl4KCR0YWJsZS1iYWNrZ3JvdW5kLCByZ2JhKCR0ZXh0LWNvbG9yLCAxKSwgKDEgLSAkdGV4dC1vcGFjaXR5KSAqIDEwMCUpO1xuICAgIH1cbiAgICBAZWxzZSB7XG4gICAgICBjb2xvcjogJHRleHQtY29sb3I7XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBtYXQtc29ydC10eXBvZ3JhcGh5KCRjb25maWcpIHsgfVxuXG5cblxuXG5cbkBtaXhpbiBtYXQtdGFicy10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG4gICRoZWFkZXItYm9yZGVyOiAxcHggc29saWQgbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcblxuICAubWF0LXRhYi1uYXYtYmFyLFxuICAubWF0LXRhYi1oZWFkZXIge1xuICAgIGJvcmRlci1ib3R0b206ICRoZWFkZXItYm9yZGVyO1xuICB9XG5cbiAgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIHtcbiAgICAubWF0LXRhYi1uYXYtYmFyLFxuICAgIC5tYXQtdGFiLWhlYWRlciB7XG4gICAgICBib3JkZXItdG9wOiAkaGVhZGVyLWJvcmRlcjtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWxpbmsge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJi5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLXRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCB0ZXh0KTtcbiAgfVxuXG4gIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICAgIGJvcmRlci1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBoZWFkZXIgYm9yZGVyIHdoZW4gdGhlcmUgaXMgYSBiYWNrZ3JvdW5kIGNvbG9yXG4gIC5tYXQtdGFiLWdyb3VwW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10gLm1hdC10YWItaGVhZGVyLFxuICAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10ge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgYm9yZGVyLXRvcDogbm9uZTtcbiAgfVxuXG4gIC5tYXQtdGFiLWdyb3VwLCAubWF0LXRhYi1uYXYtYmFyIHtcbiAgICAkdGhlbWUtY29sb3JzOiAoXG4gICAgICBwcmltYXJ5OiAkcHJpbWFyeSxcbiAgICAgIGFjY2VudDogJGFjY2VudCxcbiAgICAgIHdhcm46ICR3YXJuXG4gICAgKTtcblxuICAgIEBlYWNoICRuYW1lLCAkY29sb3IgaW4gJHRoZW1lLWNvbG9ycyB7XG4gICAgICAvLyBTZXQgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHRhYnNcbiAgICAgICYubWF0LSN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWItbGFiZWwtZm9jdXMoJGNvbG9yKTtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1pbmstYmFyKCRjb2xvcik7XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgaW5rIGJhciB3aGVuIGJhY2tncm91bmQgY29sb3IgaXMgdGhlIHNhbWVcbiAgICAgICAgJi5tYXQtYmFja2dyb3VuZC0jeyRuYW1lfSB7XG4gICAgICAgICAgQGluY2x1ZGUgX21hdC1pbmstYmFyKCRjb2xvciwgZGVmYXVsdC1jb250cmFzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAZWFjaCAkbmFtZSwgJGNvbG9yIGluICR0aGVtZS1jb2xvcnMge1xuICAgICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRhYnMgYW5kIG92ZXJyaWRlIGZvY3VzIGNvbG9yXG4gICAgICAmLm1hdC1iYWNrZ3JvdW5kLSN7JG5hbWV9IHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWItbGFiZWwtZm9jdXMoJGNvbG9yKTtcbiAgICAgICAgQGluY2x1ZGUgX21hdC10YWJzLWJhY2tncm91bmQoJGNvbG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuQG1peGluIF9tYXQtaW5rLWJhcigkY29sb3IsICRodWU6IGRlZmF1bHQpIHtcbiAgLm1hdC1pbmstYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGNvbG9yLCAkaHVlKTtcbiAgfVxufVxuXG5AbWl4aW4gX21hdC10YWItbGFiZWwtZm9jdXMoJHRhYi1mb2N1cy1jb2xvcikge1xuICAubWF0LXRhYi1sYWJlbCxcbiAgLm1hdC10YWItbGluayB7XG4gICAgJi5jZGsta2V5Ym9hcmQtZm9jdXNlZCxcbiAgICAmLmNkay1wcm9ncmFtLWZvY3VzZWQge1xuICAgICAgJjpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogbWF0LWNvbG9yKCR0YWItZm9jdXMtY29sb3IsIGxpZ2h0ZXIsIDAuMyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBtaXhpbiBfbWF0LXRhYnMtYmFja2dyb3VuZCgkYmFja2dyb3VuZC1jb2xvcikge1xuICAvLyBTZXQgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIHRhYiBncm91cFxuICAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWxpbmtzIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IpO1xuICB9XG5cbiAgLy8gU2V0IGxhYmVscyB0byBjb250cmFzdCBhZ2FpbnN0IGJhY2tncm91bmRcbiAgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWxpbmsge1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QpO1xuXG4gICAgJi5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICAgIGNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QsIDAuNCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHBhZ2luYXRpb24gY2hldnJvbnMgdG8gY29udHJhc3QgYmFja2dyb3VuZFxuICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZC1jb2xvciwgZGVmYXVsdC1jb250cmFzdCk7XG4gIH1cblxuICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgICBib3JkZXItY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZC1jb2xvciwgZGVmYXVsdC1jb250cmFzdCwgMC40KTtcbiAgfVxuXG4gIC8vIFNldCByaXBwbGVzIGNvbG9yIHRvIGJlIHRoZSBjb250cmFzdCBjb2xvciBvZiB0aGUgbmV3IGJhY2tncm91bmQuIE90aGVyd2lzZSB0aGUgcmlwcGxlXG4gIC8vIGNvbG9yIHdpbGwgYmUgYmFzZWQgb24gdGhlIGFwcCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtYXQtY29sb3IoJGJhY2tncm91bmQtY29sb3IsIGRlZmF1bHQtY29udHJhc3QsIDAuMTIpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdGFicy10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10YWItZ3JvdXAge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LXRhYi1sYWJlbCwgLm1hdC10YWItbGluayB7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZywgYnV0dG9uKTtcbiAgICAgIHNpemU6IG1hdC1mb250LXNpemUoJGNvbmZpZywgYnV0dG9uKTtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJ1dHRvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5AbWl4aW4gX21hdC10b29sYmFyLWNvbG9yKCRwYWxldHRlKSB7XG4gIGJhY2tncm91bmQ6IG1hdC1jb2xvcigkcGFsZXR0ZSk7XG4gIGNvbG9yOiBtYXQtY29sb3IoJHBhbGV0dGUsIGRlZmF1bHQtY29udHJhc3QpO1xufVxuXG5AbWl4aW4gX21hdC10b29sYmFyLWZvcm0tZmllbGQtb3ZlcnJpZGVzIHtcbiAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSxcbiAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSxcbiAgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IGN1cnJlbnRDb2xvcjtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1sYWJlbCxcbiAgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCxcbiAgLm1hdC1zZWxlY3QtdmFsdWUsXG4gIC5tYXQtc2VsZWN0LWFycm93LFxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG5cbiAgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgICBjYXJldC1jb2xvcjogY3VycmVudENvbG9yO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdG9vbGJhci10aGVtZSgkdGhlbWUpIHtcbiAgJHByaW1hcnk6IG1hcC1nZXQoJHRoZW1lLCBwcmltYXJ5KTtcbiAgJGFjY2VudDogbWFwLWdldCgkdGhlbWUsIGFjY2VudCk7XG4gICR3YXJuOiBtYXAtZ2V0KCR0aGVtZSwgd2Fybik7XG4gICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICRmb3JlZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgZm9yZWdyb3VuZCk7XG5cbiAgLm1hdC10b29sYmFyIHtcbiAgICBiYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGJhY2tncm91bmQsIGFwcC1iYXIpO1xuICAgIGNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHRleHQpO1xuXG4gICAgJi5tYXQtcHJpbWFyeSB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJHByaW1hcnkpO1xuICAgIH1cblxuICAgICYubWF0LWFjY2VudCB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJGFjY2VudCk7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiB7XG4gICAgICBAaW5jbHVkZSBfbWF0LXRvb2xiYXItY29sb3IoJHdhcm4pO1xuICAgIH1cblxuICAgIEBpbmNsdWRlIF9tYXQtdG9vbGJhci1mb3JtLWZpZWxkLW92ZXJyaWRlcztcbiAgfVxufVxuXG5AbWl4aW4gbWF0LXRvb2xiYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtdG9vbGJhcixcbiAgLm1hdC10b29sYmFyIGgxLFxuICAubWF0LXRvb2xiYXIgaDIsXG4gIC5tYXQtdG9vbGJhciBoMyxcbiAgLm1hdC10b29sYmFyIGg0LFxuICAubWF0LXRvb2xiYXIgaDUsXG4gIC5tYXQtdG9vbGJhciBoNiB7XG4gICAgQGluY2x1ZGUgbWF0LXR5cG9ncmFwaHktbGV2ZWwtdG8tc3R5bGVzKCRjb25maWcsIHRpdGxlKTtcbiAgICBtYXJnaW46IDA7XG4gIH1cbn1cblxuXG5cblxuXG4kbWF0LXRvb2x0aXAtdGFyZ2V0LWhlaWdodDogMjJweDtcbiRtYXQtdG9vbHRpcC1mb250LXNpemU6IDEwcHg7XG4kbWF0LXRvb2x0aXAtdmVydGljYWwtcGFkZGluZzogKCRtYXQtdG9vbHRpcC10YXJnZXQtaGVpZ2h0IC0gJG1hdC10b29sdGlwLWZvbnQtc2l6ZSkgLyAyO1xuXG4kbWF0LXRvb2x0aXAtaGFuZHNldC10YXJnZXQtaGVpZ2h0OiAzMHB4O1xuJG1hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplOiAxNHB4O1xuJG1hdC10b29sdGlwLWhhbmRzZXQtdmVydGljYWwtcGFkZGluZzpcbiAgICAoJG1hdC10b29sdGlwLWhhbmRzZXQtdGFyZ2V0LWhlaWdodCAtICRtYXQtdG9vbHRpcC1oYW5kc2V0LWZvbnQtc2l6ZSkgLyAyO1xuXG5AbWl4aW4gbWF0LXRvb2x0aXAtdGhlbWUoJHRoZW1lKSB7XG4gIC5tYXQtdG9vbHRpcCB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRtYXQtZ3JleSwgNzAwLCAwLjkpO1xuICB9XG59XG5cbkBtaXhpbiBtYXQtdG9vbHRpcC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLm1hdC10b29sdGlwIHtcbiAgICBmb250LWZhbWlseTogbWF0LWZvbnQtZmFtaWx5KCRjb25maWcpO1xuICAgIGZvbnQtc2l6ZTogJG1hdC10b29sdGlwLWZvbnQtc2l6ZTtcbiAgICBwYWRkaW5nLXRvcDogJG1hdC10b29sdGlwLXZlcnRpY2FsLXBhZGRpbmc7XG4gICAgcGFkZGluZy1ib3R0b206ICRtYXQtdG9vbHRpcC12ZXJ0aWNhbC1wYWRkaW5nO1xuICB9XG5cbiAgLm1hdC10b29sdGlwLWhhbmRzZXQge1xuICAgIGZvbnQtc2l6ZTogJG1hdC10b29sdGlwLWhhbmRzZXQtZm9udC1zaXplO1xuICAgIHBhZGRpbmctdG9wOiAkbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nO1xuICAgIHBhZGRpbmctYm90dG9tOiAkbWF0LXRvb2x0aXAtaGFuZHNldC12ZXJ0aWNhbC1wYWRkaW5nO1xuICB9XG59XG5cblxuXG5cblxuQG1peGluIG1hdC1zbmFjay1iYXItdGhlbWUoJHRoZW1lKSB7XG4gICRpcy1kYXJrLXRoZW1lOiBtYXAtZ2V0KCR0aGVtZSwgaXMtZGFyayk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuXG4gIC5tYXQtc25hY2stYmFyLWNvbnRhaW5lciB7XG4gICAgLy8gVXNlIHRoZSBwcmltYXJ5IHRleHQgb24gdGhlIGRhcmsgdGhlbWUsIGV2ZW4gdGhvdWdoIHRoZSBsaWdodGVyIG9uZSB1c2VzXG4gICAgLy8gYSBzZWNvbmRhcnksIGJlY2F1c2UgdGhlIGNvbnRyYXN0IG9uIHRoZSBsaWdodCBwcmltYXJ5IHRleHQgaXMgcG9vci5cbiAgICBjb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsICRkYXJrLXByaW1hcnktdGV4dCwgJGxpZ2h0LXNlY29uZGFyeS10ZXh0KTtcbiAgICBiYWNrZ3JvdW5kOiBpZigkaXMtZGFyay10aGVtZSwgbWFwLWdldCgkbWF0LWdyZXksIDUwKSwgIzMyMzIzMik7XG5cbiAgICBAaW5jbHVkZSBfbWF0LXRoZW1lLWVsZXZhdGlvbig2LCAkdGhlbWUpO1xuICB9XG5cbiAgLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgICBjb2xvcjogaWYoJGlzLWRhcmstdGhlbWUsIGluaGVyaXQsIG1hdC1jb2xvcigkYWNjZW50KSk7XG4gIH1cbn1cblxuQG1peGluIG1hdC1zbmFjay1iYXItdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC5tYXQtc2ltcGxlLXNuYWNrYmFyIHtcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6IG1hdC1mb250LWZhbWlseSgkY29uZmlnLCBib2R5LTEpO1xuICAgICAgc2l6ZTogbWF0LWZvbnQtc2l6ZSgkY29uZmlnLCBib2R5LTEpO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiB7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgZm9udDoge1xuICAgICAgZmFtaWx5OiBpbmhlcml0O1xuICAgICAgc2l6ZTogaW5oZXJpdDtcbiAgICAgIHdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJ1dHRvbik7XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gVGhlbWUgc3R5bGVzIHRoYXQgb25seSBhcHBseSB0byB0aGUgZmlsbCBhcHBlYXJhbmNlIG9mIHRoZSBmb3JtLWZpZWxkLlxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtZmlsbC10aGVtZSgkdGhlbWUpIHtcbiAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcbiAgJGlzLWRhcmstdGhlbWU6IG1hcC1nZXQoJHRoZW1lLCBpcy1kYXJrKTtcblxuICAkZmlsbC1iYWNrZ3JvdW5kOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGJhc2UsIGlmKCRpcy1kYXJrLXRoZW1lLCAwLjEsIDAuMDQpKTtcbiAgJGZpbGwtZGlzYWJsZWQtYmFja2dyb3VuZDogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBiYXNlLCBpZigkaXMtZGFyay10aGVtZSwgMC4wNSwgMC4wMikpO1xuICAkdW5kZXJsaW5lLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIsIGlmKCRpcy1kYXJrLXRoZW1lLCAwLjUsIDAuNDIpKTtcbiAgJGxhYmVsLWRpc2FibGVkLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpc2FibGVkLXRleHQpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwge1xuICAgIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICRmaWxsLWJhY2tncm91bmQ7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtZmxleCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkZmlsbC1kaXNhYmxlZC1iYWNrZ3JvdW5kO1xuICAgIH1cblxuICAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRsYWJlbC1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlOiAwO1xuXG4vLyBBcHBsaWVzIGEgZmxvYXRpbmcgbGFiZWwgYWJvdmUgdGhlIGZvcm0gZmllbGQgY29udHJvbCBpdHNlbGYuXG5AbWl4aW4gX21hdC1mb3JtLWZpZWxkLWZpbGwtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtZmlsbC1kZWR1cGUpXG4gICAgICAgICAgICAgc2NhbGUoJGZvbnQtc2NhbGUpO1xuICB3aWR0aDogMTAwJSAvICRmb250LXNjYWxlICsgJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlO1xuXG4gICRtYXQtZm9ybS1maWVsZC1maWxsLWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWZpbGwtZGVkdXBlICsgMC4wMDAwMSAhZ2xvYmFsO1xufVxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtZmlsbC10eXBvZ3JhcGh5KCRjb25maWcpIHtcbiAgLy8gVGhlIHVuaXQtbGVzcyBsaW5lLWhlaWdodCBmcm9tIHRoZSBmb250IGNvbmZpZy5cbiAgJGxpbmUtaGVpZ2h0OiBtYXQtbGluZS1oZWlnaHQoJGNvbmZpZywgaW5wdXQpO1xuICAvLyBUaGUgYW1vdW50IHRvIHNjYWxlIHRoZSBmb250IGZvciB0aGUgZmxvYXRpbmcgbGFiZWwgYW5kIHN1YnNjcmlwdC5cbiAgJHN1YnNjcmlwdC1mb250LXNjYWxlOiAwLjc1O1xuICAvLyBUaGUgcGFkZGluZyBvbiB0b3Agb2YgdGhlIGluZml4LlxuICAkaW5maXgtcGFkZGluZy10b3A6IDAuMjVlbTtcbiAgLy8gVGhlIHBhZGRpbmcgYmVsb3cgdGhlIGluZml4LlxuICAkaW5maXgtcGFkZGluZy1ib3R0b206IDAuNzVlbTtcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIGFtb3VudCB3ZSBvZmZzZXQgdGhlIGxhYmVsIGZyb20gdGhlIGlucHV0IHRleHQgaW4gdGhlIGZpbGwgYXBwZWFyYW5jZS5cbiAgJGZpbGwtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ6IC0wLjVlbTtcblxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIHtcbiAgICAubWF0LWZvcm0tZmllbGQtaW5maXgge1xuICAgICAgcGFkZGluZzogJGluZml4LXBhZGRpbmctdG9wIDAgJGluZml4LXBhZGRpbmctYm90dG9tIDA7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZy10b3A7XG4gICAgICBtYXJnaW4tdG9wOiAkZmlsbC1hcHBlYXJhbmNlLWxhYmVsLW9mZnNldDtcbiAgICB9XG5cbiAgICAmLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCB7XG4gICAgICAmLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gICAgICAubWF0LWlucHV0LXNlcnZlcjpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1maWxsLWxhYmVsLWZsb2F0aW5nKFxuICAgICAgICAgICAgICAgICRzdWJzY3JpcHQtZm9udC1zY2FsZSwgJGluZml4LXBhZGRpbmctdG9wICsgJGZpbGwtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQsXG4gICAgICAgICAgICAgICAgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLWZpbGwtbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZy10b3AgKyAkZmlsbC1hcHBlYXJhbmNlLWxhYmVsLW9mZnNldCxcbiAgICAgICAgICAgICAgICAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbi8vIFRoZW1lIHN0eWxlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIGxlZ2FjeSBhcHBlYXJhbmNlIG9mIHRoZSBmb3JtLWZpZWxkLlxuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtbGVnYWN5LXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICRsYWJlbC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBzZWNvbmRhcnktdGV4dCk7XG4gICR1bmRlcmxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNywgMC40MikpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1oaW50IHtcbiAgICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yO1xuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gICAgICBAaW5jbHVkZSBtYXQtY29udHJvbC1kaXNhYmxlZC11bmRlcmxpbmUoJHVuZGVybGluZS1jb2xvcik7XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGU6IDA7XG5cbi8vIEFwcGxpZXMgYSBmbG9hdGluZyBsYWJlbCBhYm92ZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGl0c2VsZi5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nKCRmb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApIHtcbiAgLy8gV2UgdXNlIHBlcnNwZWN0aXZlIHRvIGZpeCB0aGUgdGV4dCBibHVycmluZXNzIGFzIGRlc2NyaWJlZCBoZXJlOlxuICAvLyBodHRwOi8vd3d3LnVzZXJhZ2VudG1hbi5jb20vYmxvZy8yMDE0LzA1LzA0L2ZpeGluZy10eXBvZ3JhcGh5LWluc2lkZS1vZi0yLWQtY3NzLXRyYW5zZm9ybXMvXG4gIC8vIFRoaXMgcmVzdWx0cyBpbiBhIHNtYWxsIGppdHRlciBhZnRlciB0aGUgbGFiZWwgZmxvYXRzIG9uIEZpcmVmb3gsIHdoaWNoIHRoZVxuICAvLyB0cmFuc2xhdGVaIGZpeGVzLlxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcpIHNjYWxlKCRmb250LXNjYWxlKSBwZXJzcGVjdGl2ZSgxMDBweClcbiAgdHJhbnNsYXRlWigwLjAwMXB4ICsgJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUpO1xuICAvLyBUaGUgdHJpY2tzIGFib3ZlIHVzZWQgdG8gc21vb3RoIG91dCB0aGUgYW5pbWF0aW9uIG9uIGNocm9tZSBhbmQgZmlyZWZveCBhY3R1YWxseSBtYWtlIHRoaW5nc1xuICAvLyB3b3JzZSBvbiBJRSwgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGluIHRoZSBJRSB2ZXJzaW9uLlxuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0kaW5maXgtbWFyZ2luLXRvcCAtICRpbmZpeC1wYWRkaW5nICsgJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUpXG4gICAgICAgICAgICAgICAgICBzY2FsZSgkZm9udC1zY2FsZSk7XG5cbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlO1xuXG4gICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlOiAkbWF0LWZvcm0tZmllbGQtbGVnYWN5LWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuLy8gU2FtZSBhcyBtaXhpbiBhYm92ZSwgYnV0IG9taXRzIHRoZSB0cmFuc2xhdGVaIGZvciBwcmludGluZyBwdXJwb3Nlcy5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KCRmb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApIHtcbiAgLy8gVGhpcyByZXN1bHRzIGluIGEgc21hbGwgaml0dGVyIGFmdGVyIHRoZSBsYWJlbCBmbG9hdHMgb24gRmlyZWZveCwgd2hpY2ggdGhlXG4gIC8vIHRyYW5zbGF0ZVogZml4ZXMuXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtJGluZml4LW1hcmdpbi10b3AgLSAkaW5maXgtcGFkZGluZyArICRtYXQtZm9ybS1maWVsZC1sZWdhY3ktZGVkdXBlKVxuICAgICAgICAgICAgICAgICAgc2NhbGUoJGZvbnQtc2NhbGUpO1xuICAvLyBUaGUgdHJpY2tzIGFib3ZlIHVzZWQgdG8gc21vb3RoIG91dCB0aGUgYW5pbWF0aW9uIG9uIGNocm9tZSBhbmQgZmlyZWZveCBhY3R1YWxseSBtYWtlIHRoaW5nc1xuICAvLyB3b3JzZSBvbiBJRSwgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGluIHRoZSBJRSB2ZXJzaW9uLlxuICAkbWF0LWZvcm0tZmllbGQtbGVnYWN5LWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWxlZ2FjeS1kZWR1cGUgKyAwLjAwMDAxICFnbG9iYWw7XG59XG5cbkBtaXhpbiBtYXQtZm9ybS1maWVsZC1sZWdhY3ktdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIGFtb3VudCBvZiBzcGFjZSBiZXR3ZWVuIHRoZSB0b3Agb2YgdGhlIGxpbmUgYW5kIHRoZSB0b3Agb2YgdGhlIGFjdHVhbCB0ZXh0XG4gIC8vIChhcyBhIGZyYWN0aW9uIG9mIHRoZSBmb250LXNpemUpLlxuICAkbGluZS1zcGFjaW5nOiAoJGxpbmUtaGVpZ2h0IC0gMSkgLyAyO1xuICAvLyBUaGUgcGFkZGluZyBvbiB0aGUgaW5maXguIE1vY2tzIHNob3cgaGFsZiBvZiB0aGUgdGV4dCBzaXplLCBidXQgc2VlbSB0byBtZWFzdXJlIGZyb20gdGhlIGVkZ2VcbiAgLy8gb2YgdGhlIHRleHQgaXRzZWxmLCBub3QgdGhlIGVkZ2Ugb2YgdGhlIGxpbmU7IHRoZXJlZm9yZSB3ZSBzdWJ0cmFjdCBvZmYgdGhlIGxpbmUgc3BhY2luZy5cbiAgJGluZml4LXBhZGRpbmc6IDAuNWVtIC0gJGxpbmUtc3BhY2luZztcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgLm1hdC1mb3JtLWZpZWxkLWZsZXggYXJlYSBhbmQgdGhlIHN1YnNjcmlwdCB3cmFwcGVyLlxuICAvLyBNb2NrcyBzaG93IGhhbGYgb2YgdGhlIHRleHQgc2l6ZSwgYnV0IHRoaXMgbWFyZ2luIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aXRoIHRoZSBzdWJzY3JpcHRcbiAgLy8gdGV4dCBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBzY2FsZSBmYWN0b3IgdG8gbWFrZSBpdCBoYWxmIG9mIHRoZSBvcmlnaW5hbCB0ZXh0XG4gIC8vIHNpemUuIFdlIGFnYWluIG5lZWQgdG8gc3VidHJhY3Qgb2ZmIHRoZSBsaW5lIHNwYWNpbmcgc2luY2UgdGhlIG1vY2tzIG1lYXN1cmUgdG8gdGhlIGVkZ2Ugb2YgdGhlXG4gIC8vIHRleHQsIG5vdCB0aGUgIGVkZ2Ugb2YgdGhlIGxpbmUuXG4gICRzdWJzY3JpcHQtbWFyZ2luLXRvcDogMC41ZW0gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGUgLSAoJGxpbmUtc3BhY2luZyAqIDIpO1xuICAvLyBUaGUgcGFkZGluZyBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLXdyYXBwZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN1YnNjcmlwdCwgc2luY2UgaXQnc1xuICAvLyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgc3Vic2NyaXB0J3MgbWFyZ2luIGFuZCBsaW5lLWhlaWdodCwgYnV0IHdlXG4gIC8vIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIHN1YnNjcmlwdCBmb250IHNjYWxlIGZhY3RvciBzaW5jZSB0aGUgd3JhcHBlciBoYXMgYSBsYXJnZXIgZm9udCBzaXplLlxuICAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTogKCRzdWJzY3JpcHQtbWFyZ2luLXRvcCArICRsaW5lLWhlaWdodCkgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IHtcbiAgICAubWF0LWZvcm0tZmllbGQtd3JhcHBlciB7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHdyYXBwZXItcGFkZGluZy1ib3R0b207XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgICAgIHBhZGRpbmc6ICRpbmZpeC1wYWRkaW5nIDA7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nKFxuICAgICAgICAgICAgICAgICRzdWJzY3JpcHQtZm9udC1zY2FsZSwgJGluZml4LXBhZGRpbmcsICRpbmZpeC1tYXJnaW4tdG9wKTtcbiAgICAgIH1cblxuICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCB3aWxsIHJlbHkgb24gQXV0b2ZpbGxNb25pdG9yIGluc3RlYWQuXG4gICAgICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbDotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sZWdhY3ktbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLWxlZ2FjeS1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZztcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIHVuZGVybGluZSB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAgIC8vIHNvIHdlIG1vdmUgaXQgdXAgYnkgdGhlIHBhZGRpbmcgYW1vdW50LlxuICAgICAgYm90dG9tOiAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTtcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xuICAgICAgbWFyZ2luLXRvcDogJHN1YnNjcmlwdC1tYXJnaW4tdG9wO1xuXG4gICAgICAvLyBXZSB3YW50IHRoZSBzdWJzY3JpcHQgdG8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudCBib3gsIG5vdCB0aGUgcGFkZGluZyBib3gsXG4gICAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudCAoYWRqdXN0ZWQgZm9yIHRoZSBzbWFsbGVyIGZvbnQgc2l6ZSk7XG4gICAgICB0b3A6IGNhbGMoMTAwJSAtICN7JHdyYXBwZXItcGFkZGluZy1ib3R0b20gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGV9KTtcbiAgICB9XG4gIH1cblxuICAvLyB0cmFuc2xhdGVaIGNhdXNlcyB0aGUgbGFiZWwgdG8gbm90IGFwcGVhciB3aGlsZSBwcmludGluZywgc28gd2Ugb3ZlcnJpZGUgaXQgdG8gbm90XG4gIC8vIGFwcGx5IHRyYW5zbGF0ZVogd2hpbGUgcHJpbnRpbmdcbiAgQG1lZGlhIHByaW50IHtcbiAgICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgICAmLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gICAgICAgIC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KFxuICAgICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCB3aWxsIHJlbHkgb24gQXV0b2ZpbGxNb25pdG9yIGluc3RlYWQuXG4gICAgICAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sZWdhY3ktbGFiZWwtZmxvYXRpbmctcHJpbnQoXG4gICAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgICAgLy8gKHVzZWQgYXMgYSBwdXJlIENTUyBzdGFuZC1pbiBmb3IgbWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0KS5cbiAgICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtbGVnYWN5LWxhYmVsLWZsb2F0aW5nLXByaW50KFxuICAgICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG5cblxuXG5cbi8vIFRoZW1lIHN0eWxlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIG91dGxpbmUgYXBwZWFyYW5jZSBvZiB0aGUgZm9ybS1maWVsZC5cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICRsYWJlbC1kaXNhYmxlZC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXNhYmxlZC10ZXh0KTtcbiAgJG91dGxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuMywgMC4xMikpO1xuICAkb3V0bGluZS1jb2xvci1ob3ZlcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyLCBpZigkaXMtZGFyay10aGVtZSwgMSwgMC44NykpO1xuICAkb3V0bGluZS1jb2xvci1wcmltYXJ5OiBtYXQtY29sb3IoJHByaW1hcnkpO1xuICAkb3V0bGluZS1jb2xvci1hY2NlbnQ6IG1hdC1jb2xvcigkYWNjZW50KTtcbiAgJG91dGxpbmUtY29sb3Itd2FybjogbWF0LWNvbG9yKCR3YXJuKTtcbiAgJG91dGxpbmUtY29sb3ItZGlzYWJsZWQ6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuMTUsIDAuMDYpKTtcblxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIHtcbiAgICAubWF0LWZvcm0tZmllbGQtb3V0bGluZSB7XG4gICAgICBjb2xvcjogJG91dGxpbmUtY29sb3I7XG4gICAgfVxuXG4gICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICAgICAgY29sb3I6ICRvdXRsaW5lLWNvbG9yLWhvdmVyO1xuICAgIH1cblxuICAgICYubWF0LWZvY3VzZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICAgICAgICBjb2xvcjogJG91dGxpbmUtY29sb3ItcHJpbWFyeTtcbiAgICAgIH1cblxuICAgICAgJi5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIHtcbiAgICAgICAgY29sb3I6ICRvdXRsaW5lLWNvbG9yLWFjY2VudDtcbiAgICAgIH1cblxuICAgICAgJi5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gICAgICAgIGNvbG9yOiAkb3V0bGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsYXNzIHJlcGVhdGVkIHNvIHRoYXQgcnVsZSBpcyBzcGVjaWZpYyBlbm91Z2ggdG8gb3ZlcnJpZGUgZm9jdXNlZCBhY2NlbnQgY29sb3IgY2FzZS5cbiAgICAmLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCB7XG4gICAgICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gICAgICAgIGNvbG9yOiAkb3V0bGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgICYubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQge1xuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgY29sb3I6ICRsYWJlbC1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cblxuICAgICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUge1xuICAgICAgICBjb2xvcjogJG91dGxpbmUtY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFVzZWQgdG8gbWFrZSBpbnN0YW5jZXMgb2YgdGhlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyBtaXhpbiBuZWdsaWdpYmx5IGRpZmZlcmVudCxcbi8vIGFuZCBwcmV2ZW50IEdvb2dsZSdzIENTUyBPcHRpbWl6ZXIgZnJvbSBjb2xsYXBzaW5nIHRoZSBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZVxuLy8gb2YgdGhlIHNlbGVjdG9ycyBjb250YWluIHBzZXVkby1jbGFzc2VzIG5vdCByZWNvZ25pemVkIGluIGFsbCBicm93c2Vycy4gSWYgYSBicm93c2VyIGVuY291bnRlcnNcbi8vIGFuIHVua25vd24gcHNldWRvLWNsYXNzIGl0IHdpbGwgZGlzY2FyZCB0aGUgZW50aXJlIHJ1bGUgc2V0LlxuJG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZGVkdXBlOiAwO1xuXG4vLyBBcHBsaWVzIGEgZmxvYXRpbmcgbGFiZWwgYWJvdmUgdGhlIGZvcm0gZmllbGQgY29udHJvbCBpdHNlbGYuXG5AbWl4aW4gX21hdC1mb3JtLWZpZWxkLW91dGxpbmUtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtb3V0bGluZS1kZWR1cGUpXG4gIHNjYWxlKCRmb250LXNjYWxlKTtcbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWRlZHVwZTtcblxuICAkbWF0LWZvcm0tZmllbGQtb3V0bGluZS1kZWR1cGU6ICRtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdHlwb2dyYXBoeSgkY29uZmlnKSB7XG4gIC8vIFRoZSB1bml0LWxlc3MgbGluZS1oZWlnaHQgZnJvbSB0aGUgZm9udCBjb25maWcuXG4gICRsaW5lLWhlaWdodDogbWF0LWxpbmUtaGVpZ2h0KCRjb25maWcsIGlucHV0KTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIHBhZGRpbmcgYWJvdmUgYW5kIGJlbG93IHRoZSBpbmZpeC5cbiAgJGluZml4LXBhZGRpbmc6IDFlbTtcbiAgLy8gVGhlIG1hcmdpbiBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLWluZml4IHRvIHJlc2VydmUgc3BhY2UgZm9yIHRoZSBmbG9hdGluZyBsYWJlbC5cbiAgJGluZml4LW1hcmdpbi10b3A6IDFlbSAqICRsaW5lLWhlaWdodCAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIHNwYWNlIGJldHdlZW4gdGhlIGJvdHRvbSBvZiB0aGUgLm1hdC1mb3JtLWZpZWxkLWZsZXggYXJlYSBhbmQgdGhlIHN1YnNjcmlwdCB3cmFwcGVyLlxuICAvLyBNb2NrcyBzaG93IGhhbGYgb2YgdGhlIHRleHQgc2l6ZSwgYnV0IHRoaXMgbWFyZ2luIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB3aXRoIHRoZSBzdWJzY3JpcHRcbiAgLy8gdGV4dCBmb250IHNpemUsIHNvIHdlIG5lZWQgdG8gZGl2aWRlIGJ5IHRoZSBzY2FsZSBmYWN0b3IgdG8gbWFrZSBpdCBoYWxmIG9mIHRoZSBvcmlnaW5hbCB0ZXh0XG4gIC8vIHNpemUuXG4gICRzdWJzY3JpcHQtbWFyZ2luLXRvcDogMC41ZW0gLyAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG4gIC8vIFRoZSBwYWRkaW5nIGFwcGxpZWQgdG8gdGhlIGZvcm0tZmllbGQtd3JhcHBlciB0byByZXNlcnZlIHNwYWNlIGZvciB0aGUgc3Vic2NyaXB0LCBzaW5jZSBpdCdzXG4gIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZC4gVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJzY3JpcHQncyBtYXJnaW4gYW5kIGxpbmUtaGVpZ2h0LCBidXQgd2VcbiAgLy8gbmVlZCB0byBtdWx0aXBseSBieSB0aGUgc3Vic2NyaXB0IGZvbnQgc2NhbGUgZmFjdG9yIHNpbmNlIHRoZSB3cmFwcGVyIGhhcyBhIGxhcmdlciBmb250IHNpemUuXG4gICR3cmFwcGVyLXBhZGRpbmctYm90dG9tOiAoJHN1YnNjcmlwdC1tYXJnaW4tdG9wICsgJGxpbmUtaGVpZ2h0KSAqICRzdWJzY3JpcHQtZm9udC1zY2FsZTtcbiAgLy8gVGhlIGFtb3VudCB3ZSBvZmZzZXQgdGhlIGxhYmVsIGZyb20gdGhlIGlucHV0IHRleHQgaW4gdGhlIG91dGxpbmUgYXBwZWFyYW5jZS5cbiAgJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ6IC0wLjI1ZW07XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgICAgIHBhZGRpbmc6ICRpbmZpeC1wYWRkaW5nIDAgJGluZml4LXBhZGRpbmcgMDtcbiAgICB9XG5cbiAgICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgdG9wOiAkaW5maXgtbWFyZ2luLXRvcCArICRpbmZpeC1wYWRkaW5nO1xuICAgICAgbWFyZ2luLXRvcDogJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQ7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQge1xuICAgICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgICAgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgICAgICBAaW5jbHVkZSBfbWF0LWZvcm0tZmllbGQtb3V0bGluZS1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgICAkc3Vic2NyaXB0LWZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nICsgJG91dGxpbmUtYXBwZWFyYW5jZS1sYWJlbC1vZmZzZXQsXG4gICAgICAgICAgICAgICAgJGluZml4LW1hcmdpbi10b3ApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXJ2ZXItc2lkZSByZW5kZXJlZCBtYXRJbnB1dCB3aXRoIGEgbGFiZWwgYXR0cmlidXRlIGJ1dCBsYWJlbCBub3Qgc2hvd25cbiAgICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgICAgQGluY2x1ZGUgX21hdC1mb3JtLWZpZWxkLW91dGxpbmUtbGFiZWwtZmxvYXRpbmcoXG4gICAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZyArICRvdXRsaW5lLWFwcGVhcmFuY2UtbGFiZWwtb2Zmc2V0LFxuICAgICAgICAgICAgICAgICRpbmZpeC1tYXJnaW4tdG9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuLy8gVGhlbWUgc3R5bGVzIHRoYXQgb25seSBhcHBseSB0byB0aGUgc3RhbmRhcmQgYXBwZWFyYW5jZSBvZiB0aGUgZm9ybS1maWVsZC5cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gICR1bmRlcmxpbmUtY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgZGl2aWRlciwgaWYoJGlzLWRhcmstdGhlbWUsIDAuNywgMC40MikpO1xuXG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3I7XG4gICAgfVxuXG4gICAgJi5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgICAgIEBpbmNsdWRlIG1hdC1jb250cm9sLWRpc2FibGVkLXVuZGVybGluZSgkdW5kZXJsaW5lLWNvbG9yKTtcbiAgICB9XG4gIH1cbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXR5cG9ncmFwaHkoJGNvbmZpZykge31cblxuXG4vLyBUaGVtZSBzdHlsZXMgdGhhdCBhcHBseSB0byBhbGwgYXBwZWFyYW5jZXMgb2YgdGhlIGZvcm0tZmllbGQuXG5AbWl4aW4gbWF0LWZvcm0tZmllbGQtdGhlbWUoJHRoZW1lKSB7XG4gICRwcmltYXJ5OiBtYXAtZ2V0KCR0aGVtZSwgcHJpbWFyeSk7XG4gICRhY2NlbnQ6IG1hcC1nZXQoJHRoZW1lLCBhY2NlbnQpO1xuICAkd2FybjogbWFwLWdldCgkdGhlbWUsIHdhcm4pO1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuICAkaXMtZGFyay10aGVtZTogbWFwLWdldCgkdGhlbWUsIGlzLWRhcmspO1xuXG4gIC8vIExhYmVsIGNvbG9ycy4gUmVxdWlyZWQgaXMgdXNlZCBmb3IgdGhlIGAqYCBzdGFyIHNob3duIGluIHRoZSBsYWJlbC5cbiAgJGxhYmVsLWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIHNlY29uZGFyeS10ZXh0LCBpZigkaXMtZGFyay10aGVtZSwgMC43LCAwLjYpKTtcbiAgJGZvY3VzZWQtbGFiZWwtY29sb3I6IG1hdC1jb2xvcigkcHJpbWFyeSk7XG4gICRyZXF1aXJlZC1sYWJlbC1jb2xvcjogbWF0LWNvbG9yKCRhY2NlbnQpO1xuXG4gIC8vIFVuZGVybGluZSBjb2xvcnMuXG4gICR1bmRlcmxpbmUtY29sb3ItYmFzZTogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyLCBpZigkaXMtZGFyay10aGVtZSwgMSwgMC44NykpO1xuICAkdW5kZXJsaW5lLWNvbG9yLWFjY2VudDogbWF0LWNvbG9yKCRhY2NlbnQpO1xuICAkdW5kZXJsaW5lLWNvbG9yLXdhcm46IG1hdC1jb2xvcigkd2Fybik7XG4gICR1bmRlcmxpbmUtZm9jdXNlZC1jb2xvcjogbWF0LWNvbG9yKCRwcmltYXJ5KTtcblxuICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gIH1cblxuICAubWF0LWhpbnQge1xuICAgIGNvbG9yOiAkbGFiZWwtY29sb3I7XG4gIH1cblxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICBjb2xvcjogJGZvY3VzZWQtbGFiZWwtY29sb3I7XG5cbiAgICAmLm1hdC1hY2NlbnQge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYWNjZW50O1xuICAgIH1cblxuICAgICYubWF0LXdhcm4ge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtY29sb3Itd2FybjtcbiAgICB9XG4gIH1cblxuICAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciB7XG4gICAgY29sb3I6ICRyZXF1aXJlZC1sYWJlbC1jb2xvcjtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYmFzZTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkdW5kZXJsaW5lLWZvY3VzZWQtY29sb3I7XG5cbiAgICAgICYubWF0LWFjY2VudCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3ItYWNjZW50O1xuICAgICAgfVxuXG4gICAgICAmLm1hdC13YXJuIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkge1xuICAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICAgICAgY29sb3I6ICR1bmRlcmxpbmUtZm9jdXNlZC1jb2xvcjtcbiAgICB9XG5cbiAgICAmLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gICAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci1hY2NlbnQ7XG4gICAgfVxuXG4gICAgJi5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVyIHtcbiAgICAgIGNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yLXdhcm47XG4gICAgfVxuICB9XG5cbiAgLy8gU3R5bGluZyBmb3IgdGhlIGVycm9yIHN0YXRlIG9mIHRoZSBmb3JtIGZpZWxkLiBOb3RlIHRoYXQgd2hpbGUgdGhlIHNhbWUgY2FuIGJlXG4gIC8vIGFjaGlldmVkIHdpdGggdGhlIG5nLSogY2xhc3Nlcywgd2UgdXNlIHRoaXMgYXBwcm9hY2ggaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIHNhbWVcbiAgLy8gbG9naWMgaXMgdXNlZCB0byBzdHlsZSB0aGUgZXJyb3Igc3RhdGUgYW5kIHRvIHNob3cgdGhlIGVycm9yIG1lc3NhZ2VzLlxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCB7XG4gICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIGNvbG9yOiAkdW5kZXJsaW5lLWNvbG9yLXdhcm47XG5cbiAgICAgICYubWF0LWFjY2VudCxcbiAgICAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIge1xuICAgICAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4gICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR1bmRlcmxpbmUtY29sb3Itd2FybjtcbiAgICB9XG4gIH1cblxuICAubWF0LWVycm9yIHtcbiAgICBjb2xvcjogJHVuZGVybGluZS1jb2xvci13YXJuO1xuICB9XG5cbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtbGVnYWN5LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1mb3JtLWZpZWxkLXN0YW5kYXJkLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1mb3JtLWZpZWxkLWZpbGwtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGVtZSgkdGhlbWUpO1xufVxuXG4vLyBVc2VkIHRvIG1ha2UgaW5zdGFuY2VzIG9mIHRoZSBfbWF0LWZvcm0tZmllbGQtbGFiZWwtZmxvYXRpbmcgbWl4aW4gbmVnbGlnaWJseSBkaWZmZXJlbnQsXG4vLyBhbmQgcHJldmVudCBHb29nbGUncyBDU1MgT3B0aW1pemVyIGZyb20gY29sbGFwc2luZyB0aGUgZGVjbGFyYXRpb25zLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWVcbi8vIG9mIHRoZSBzZWxlY3RvcnMgY29udGFpbiBwc2V1ZG8tY2xhc3NlcyBub3QgcmVjb2duaXplZCBpbiBhbGwgYnJvd3NlcnMuIElmIGEgYnJvd3NlciBlbmNvdW50ZXJzXG4vLyBhbiB1bmtub3duIHBzZXVkby1jbGFzcyBpdCB3aWxsIGRpc2NhcmQgdGhlIGVudGlyZSBydWxlIHNldC5cbiRtYXQtZm9ybS1maWVsZC1kZWR1cGU6IDA7XG5cbi8vIEFwcGxpZXMgYSBmbG9hdGluZyBsYWJlbCBhYm92ZSB0aGUgZm9ybSBmaWVsZCBjb250cm9sIGl0c2VsZi5cbkBtaXhpbiBfbWF0LWZvcm0tZmllbGQtbGFiZWwtZmxvYXRpbmcoJGZvbnQtc2NhbGUsICRpbmZpeC1wYWRkaW5nLCAkaW5maXgtbWFyZ2luLXRvcCkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLSRpbmZpeC1tYXJnaW4tdG9wIC0gJGluZml4LXBhZGRpbmcgKyAkbWF0LWZvcm0tZmllbGQtZGVkdXBlKVxuICAgICAgICAgICAgIHNjYWxlKCRmb250LXNjYWxlKTtcbiAgd2lkdGg6IDEwMCUgLyAkZm9udC1zY2FsZSArICRtYXQtZm9ybS1maWVsZC1kZWR1cGU7XG5cbiAgJG1hdC1mb3JtLWZpZWxkLWRlZHVwZTogJG1hdC1mb3JtLWZpZWxkLWRlZHVwZSArIDAuMDAwMDEgIWdsb2JhbDtcbn1cblxuQG1peGluIG1hdC1mb3JtLWZpZWxkLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAvLyBUaGUgdW5pdC1sZXNzIGxpbmUtaGVpZ2h0IGZyb20gdGhlIGZvbnQgY29uZmlnLlxuICAkbGluZS1oZWlnaHQ6IG1hdC1saW5lLWhlaWdodCgkY29uZmlnLCBpbnB1dCk7XG5cbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIGZsb2F0aW5nIGxhYmVsIGFuZCBzdWJzY3JpcHQuXG4gICRzdWJzY3JpcHQtZm9udC1zY2FsZTogMC43NTtcbiAgLy8gVGhlIGFtb3VudCB0byBzY2FsZSB0aGUgZm9udCBmb3IgdGhlIHByZWZpeCBhbmQgc3VmZml4IGljb25zLlxuICAkcHJlZml4LXN1ZmZpeC1pY29uLWZvbnQtc2NhbGU6IDEuNTtcblxuICAvLyBUaGUgcGFkZGluZyBvbiB0aGUgaW5maXguIE1vY2tzIHNob3cgaGFsZiBvZiB0aGUgdGV4dCBzaXplLlxuICAkaW5maXgtcGFkZGluZzogMC41ZW07XG4gIC8vIFRoZSBtYXJnaW4gYXBwbGllZCB0byB0aGUgZm9ybS1maWVsZC1pbmZpeCB0byByZXNlcnZlIHNwYWNlIGZvciB0aGUgZmxvYXRpbmcgbGFiZWwuXG4gICRpbmZpeC1tYXJnaW4tdG9wOiAxZW0gKiAkbGluZS1oZWlnaHQgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG4gIC8vIEZvbnQgc2l6ZSB0byB1c2UgZm9yIHRoZSBsYWJlbCBhbmQgc3Vic2NyaXB0IHRleHQuXG4gICRzdWJzY3JpcHQtZm9udC1zaXplOiAkc3Vic2NyaXB0LWZvbnQtc2NhbGUgKiAxMDAlO1xuICAvLyBGb250IHNpemUgdG8gdXNlIGZvciB0aGUgZm9yIHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBpY29ucy5cbiAgJHByZWZpeC1zdWZmaXgtaWNvbi1mb250LXNpemU6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zY2FsZSAqIDEwMCU7XG4gIC8vIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBib3R0b20gb2YgdGhlIC5tYXQtZm9ybS1maWVsZC1mbGV4IGFyZWEgYW5kIHRoZSBzdWJzY3JpcHQgd3JhcHBlci5cbiAgLy8gTW9ja3Mgc2hvdyBoYWxmIG9mIHRoZSB0ZXh0IHNpemUsIGJ1dCB0aGlzIG1hcmdpbiBpcyBhcHBsaWVkIHRvIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3Vic2NyaXB0XG4gIC8vIHRleHQgZm9udCBzaXplLCBzbyB3ZSBuZWVkIHRvIGRpdmlkZSBieSB0aGUgc2NhbGUgZmFjdG9yIHRvIG1ha2UgaXQgaGFsZiBvZiB0aGUgb3JpZ2luYWwgdGV4dFxuICAvLyBzaXplLlxuICAkc3Vic2NyaXB0LW1hcmdpbi10b3A6IDAuNWVtIC8gJHN1YnNjcmlwdC1mb250LXNjYWxlO1xuICAvLyBUaGUgcGFkZGluZyBhcHBsaWVkIHRvIHRoZSBmb3JtLWZpZWxkLXdyYXBwZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHN1YnNjcmlwdCwgc2luY2UgaXQnc1xuICAvLyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgc3Vic2NyaXB0J3MgbWFyZ2luIGFuZCBsaW5lLWhlaWdodCwgYnV0IHdlXG4gIC8vIG5lZWQgdG8gbXVsdGlwbHkgYnkgdGhlIHN1YnNjcmlwdCBmb250IHNjYWxlIGZhY3RvciBzaW5jZSB0aGUgd3JhcHBlciBoYXMgYSBsYXJnZXIgZm9udCBzaXplLlxuICAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTogKCRzdWJzY3JpcHQtbWFyZ2luLXRvcCArICRsaW5lLWhlaWdodCkgKiAkc3Vic2NyaXB0LWZvbnQtc2NhbGU7XG5cbiAgLm1hdC1mb3JtLWZpZWxkIHtcbiAgICBAaW5jbHVkZSBtYXQtdHlwb2dyYXBoeS1sZXZlbC10by1zdHlsZXMoJGNvbmZpZywgaW5wdXQpO1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIge1xuICAgIHBhZGRpbmctYm90dG9tOiAkd3JhcHBlci1wYWRkaW5nLWJvdHRvbTtcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1wcmVmaXgsXG4gIC5tYXQtZm9ybS1maWVsZC1zdWZmaXgge1xuICAgIC8vIEFsbG93IGljb25zIGluIGEgcHJlZml4IG9yIHN1ZmZpeCB0byBhZGFwdCB0byB0aGUgY29ycmVjdCBzaXplLlxuICAgIC5tYXQtaWNvbiB7XG4gICAgICBmb250LXNpemU6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zaXplO1xuICAgICAgbGluZS1oZWlnaHQ6ICRsaW5lLWhlaWdodDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBpY29uIGJ1dHRvbnMgaW4gYSBwcmVmaXggb3Igc3VmZml4IHRvIGFkYXB0IHRvIHRoZSBjb3JyZWN0IHNpemUuXG4gICAgLm1hdC1pY29uLWJ1dHRvbiB7XG4gICAgICBoZWlnaHQ6ICRwcmVmaXgtc3VmZml4LWljb24tZm9udC1zY2FsZSAqIDFlbTtcbiAgICAgIHdpZHRoOiAkcHJlZml4LXN1ZmZpeC1pY29uLWZvbnQtc2NhbGUgKiAxZW07XG5cbiAgICAgIC5tYXQtaWNvbiB7XG4gICAgICAgIGhlaWdodDogJGxpbmUtaGVpZ2h0ICogMWVtO1xuICAgICAgICBsaW5lLWhlaWdodDogJGxpbmUtaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gICAgcGFkZGluZzogJGluZml4LXBhZGRpbmcgMDtcbiAgICAvLyBUaHJvd3Mgb2ZmIHRoZSBiYXNlbGluZSBpZiB3ZSBkbyBpdCBhcyBhIHJlYWwgbWFyZ2luLCBzbyB3ZSBkbyBpdCBhcyBhIGJvcmRlciBpbnN0ZWFkLlxuICAgIGJvcmRlci10b3A6ICRpbmZpeC1tYXJnaW4tdG9wIHNvbGlkIHRyYW5zcGFyZW50O1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCB7XG4gICAgJi5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAgIC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgIH1cblxuICAgIC8vIFNlcnZlci1zaWRlIHJlbmRlcmVkIG1hdElucHV0IHdpdGggYSBsYWJlbCBhdHRyaWJ1dGUgYnV0IGxhYmVsIG5vdCBzaG93blxuICAgIC8vICh1c2VkIGFzIGEgcHVyZSBDU1Mgc3RhbmQtaW4gZm9yIG1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCkuXG4gICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbiAgICAgICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtZm9ybS1maWVsZC1sYWJlbC1mbG9hdGluZyhcbiAgICAgICAgICAgICAgJHN1YnNjcmlwdC1mb250LXNjYWxlLCAkaW5maXgtcGFkZGluZywgJGluZml4LW1hcmdpbi10b3ApO1xuICAgIH1cbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIHtcbiAgICB0b3A6IC0kaW5maXgtbWFyZ2luLXRvcDtcbiAgICBwYWRkaW5nLXRvcDogJGluZml4LW1hcmdpbi10b3A7XG4gIH1cblxuICAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICAgIHRvcDogJGluZml4LW1hcmdpbi10b3AgKyAkaW5maXgtcGFkZGluZztcbiAgfVxuXG4gIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICAgIC8vIFdlIHdhbnQgdGhlIHVuZGVybGluZSB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudC5cbiAgICBib3R0b206ICR3cmFwcGVyLXBhZGRpbmctYm90dG9tO1xuICB9XG5cbiAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcbiAgICBmb250LXNpemU6ICRzdWJzY3JpcHQtZm9udC1zaXplO1xuICAgIG1hcmdpbi10b3A6ICRzdWJzY3JpcHQtbWFyZ2luLXRvcDtcblxuICAgIC8vIFdlIHdhbnQgdGhlIHN1YnNjcmlwdCB0byBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50IGJveCwgbm90IHRoZSBwYWRkaW5nIGJveCxcbiAgICAvLyBzbyB3ZSBtb3ZlIGl0IHVwIGJ5IHRoZSBwYWRkaW5nIGFtb3VudCAoYWRqdXN0ZWQgZm9yIHRoZSBzbWFsbGVyIGZvbnQgc2l6ZSk7XG4gICAgdG9wOiBjYWxjKDEwMCUgLSAjeyR3cmFwcGVyLXBhZGRpbmctYm90dG9tIC8gJHN1YnNjcmlwdC1mb250LXNjYWxlfSk7XG4gIH1cblxuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC1sZWdhY3ktdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtc3RhbmRhcmQtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtZmlsbC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG59XG5cblxuXG5cblxuQG1peGluIG1hdC10cmVlLXRoZW1lKCR0aGVtZSkge1xuICAkYmFja2dyb3VuZDogbWFwLWdldCgkdGhlbWUsIGJhY2tncm91bmQpO1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtdHJlZSB7XG4gICAgYmFja2dyb3VuZDogbWF0LWNvbG9yKCRiYWNrZ3JvdW5kLCAnY2FyZCcpO1xuICB9XG5cbiAgLm1hdC10cmVlLW5vZGUsXG4gIC5tYXQtbmVzdGVkLXRyZWUtbm9kZSB7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cbn1cblxuQG1peGluIG1hdC10cmVlLXR5cG9ncmFwaHkoJGNvbmZpZykge1xuICAubWF0LXRyZWUge1xuICAgIGZvbnQtZmFtaWx5OiBtYXQtZm9udC1mYW1pbHkoJGNvbmZpZyk7XG4gIH1cblxuICAubWF0LXRyZWUtbm9kZSxcbiAgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlIHtcbiAgICBmb250LXdlaWdodDogbWF0LWZvbnQtd2VpZ2h0KCRjb25maWcsIGJvZHktMSk7XG4gICAgZm9udC1zaXplOiBtYXQtZm9udC1zaXplKCRjb25maWcsIGJvZHktMSk7XG4gIH1cbn1cblxuXG5cbi8vIEluY2x1ZGVzIGFsbCBvZiB0aGUgdHlwb2dyYXBoaWMgc3R5bGVzLlxuQG1peGluIGFuZ3VsYXItbWF0ZXJpYWwtdHlwb2dyYXBoeSgkY29uZmlnOiBudWxsKSB7XG4gIEBpZiAkY29uZmlnID09IG51bGwge1xuICAgICRjb25maWc6IG1hdC10eXBvZ3JhcGh5LWNvbmZpZygpO1xuICB9XG5cbiAgQGluY2x1ZGUgbWF0LWJhZGdlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1iYXNlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1hdXRvY29tcGxldGUtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWJvdHRvbS1zaGVldC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtYnV0dG9uLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1idXR0b24tdG9nZ2xlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1jYXJkLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1jaGVja2JveC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtY2hpcHMtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXRhYmxlLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1kYXRlcGlja2VyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1kaWFsb2ctdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LWV4cGFuc2lvbi1wYW5lbC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZm9ybS1maWVsZC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtZ3JpZC1saXN0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1pY29uLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1pbnB1dC10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtbWVudS10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtcGFnaW5hdG9yLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1wcm9ncmVzcy1iYXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXByb2dyZXNzLXNwaW5uZXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXJhZGlvLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zZWxlY3QtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXNpZGVuYXYtdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXNsaWRlLXRvZ2dsZS10eXBvZ3JhcGh5KCRjb25maWcpO1xuICBAaW5jbHVkZSBtYXQtc2xpZGVyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zdGVwcGVyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zb3J0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10YWJzLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10b29sYmFyLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC10b29sdGlwLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1saXN0LXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1vcHRpb24tdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LW9wdGdyb3VwLXR5cG9ncmFwaHkoJGNvbmZpZyk7XG4gIEBpbmNsdWRlIG1hdC1zbmFjay1iYXItdHlwb2dyYXBoeSgkY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXRyZWUtdHlwb2dyYXBoeSgkY29uZmlnKTtcbn1cblxuXG4vLyBNaXhpbiB0aGF0IHJlbmRlcnMgYWxsIG9mIHRoZSBjb3JlIHN0eWxlcyB0aGF0IGFyZSBub3QgdGhlbWUtZGVwZW5kZW50LlxuQG1peGluIG1hdC1jb3JlKCR0eXBvZ3JhcGh5LWNvbmZpZzogbnVsbCkge1xuICBAaW5jbHVkZSBhbmd1bGFyLW1hdGVyaWFsLXR5cG9ncmFwaHkoJHR5cG9ncmFwaHktY29uZmlnKTtcbiAgQGluY2x1ZGUgbWF0LXJpcHBsZSgpO1xuICBAaW5jbHVkZSBjZGstYTExeSgpO1xuICBAaW5jbHVkZSBjZGstb3ZlcmxheSgpO1xuICBAaW5jbHVkZSBjZGstdGV4dC1maWVsZCgpO1xufVxuXG4vLyBNaXhpbiB0aGF0IHJlbmRlcnMgYWxsIG9mIHRoZSBjb3JlIHN0eWxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgdGhlbWUuXG5AbWl4aW4gbWF0LWNvcmUtdGhlbWUoJHRoZW1lKSB7XG4gIEBpbmNsdWRlIG1hdC1yaXBwbGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LW9wdGlvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtb3B0Z3JvdXAtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXBzZXVkby1jaGVja2JveC10aGVtZSgkdGhlbWUpO1xuXG4gIC8vIFByb3ZpZGVzIGV4dGVybmFsIENTUyBjbGFzc2VzIGZvciBlYWNoIGVsZXZhdGlvbiB2YWx1ZS4gRWFjaCBDU1MgY2xhc3MgaXMgZm9ybWF0dGVkIGFzXG4gIC8vIGBtYXQtZWxldmF0aW9uLXokelZhbHVlYCB3aGVyZSBgJHpWYWx1ZWAgY29ycmVzcG9uZHMgdG8gdGhlIHotc3BhY2UgdG8gd2hpY2ggdGhlIGVsZW1lbnQgaXNcbiAgLy8gZWxldmF0ZWQuXG4gIEBmb3IgJHpWYWx1ZSBmcm9tIDAgdGhyb3VnaCAyNCB7XG4gICAgLiN7JF9tYXQtZWxldmF0aW9uLXByZWZpeH0jeyR6VmFsdWV9IHtcbiAgICAgIEBpbmNsdWRlIF9tYXQtdGhlbWUtZWxldmF0aW9uKCR6VmFsdWUsICR0aGVtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JhcHBlciBlbGVtZW50IHRoYXQgcHJvdmlkZXMgdGhlIHRoZW1lIGJhY2tncm91bmQgd2hlbiB0aGUgdXNlcidzIGNvbnRlbnQgaXNuJ3RcbiAgLy8gaW5zaWRlIG9mIGEgYG1hdC1zaWRlbmF2LWNvbnRhaW5lcmAuIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGV4Y2x1ZGUgdGhlIGFtcGVyc2FuZFxuICAvLyBzZWxlY3RvciBpbiBjYXNlIHRoZSBtaXhpbiBpcyBpbmNsdWRlZCBhdCB0aGUgdG9wIGxldmVsLlxuICAubWF0LWFwcC1iYWNrZ3JvdW5kI3tpZigmLCAnLCAmLm1hdC1hcHAtYmFja2dyb3VuZCcsICcnKX0ge1xuICAgICRiYWNrZ3JvdW5kOiBtYXAtZ2V0KCR0aGVtZSwgYmFja2dyb3VuZCk7XG4gICAgJGZvcmVncm91bmQ6IG1hcC1nZXQoJHRoZW1lLCBmb3JlZ3JvdW5kKTtcblxuICAgIGJhY2tncm91bmQtY29sb3I6IG1hdC1jb2xvcigkYmFja2dyb3VuZCwgYmFja2dyb3VuZCk7XG4gICAgY29sb3I6IG1hdC1jb2xvcigkZm9yZWdyb3VuZCwgdGV4dCk7XG4gIH1cblxuICAvLyBNYXJrZXIgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB1c2VyIGhhcyBhZGRlZCBhIHRoZW1lIHRvIHRoZWlyIHBhZ2UuXG4gIEBhdC1yb290IHtcbiAgICAubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuQG1peGluIG1hdC1kaXZpZGVyLXRoZW1lKCR0aGVtZSkge1xuICAkZm9yZWdyb3VuZDogbWFwLWdldCgkdGhlbWUsIGZvcmVncm91bmQpO1xuXG4gIC5tYXQtZGl2aWRlciB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogbWF0LWNvbG9yKCRmb3JlZ3JvdW5kLCBkaXZpZGVyKTtcbiAgfVxuXG4gIC5tYXQtZGl2aWRlci12ZXJ0aWNhbCB7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBtYXQtY29sb3IoJGZvcmVncm91bmQsIGRpdmlkZXIpO1xuICB9XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIENyZWF0ZSBhIHRoZW1lLlxuQG1peGluIGFuZ3VsYXItbWF0ZXJpYWwtdGhlbWUoJHRoZW1lKSB7XG4gIEBpbmNsdWRlIG1hdC1jb3JlLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1hdXRvY29tcGxldGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWJhZGdlLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1ib3R0b20tc2hlZXQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWJ1dHRvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtYnV0dG9uLXRvZ2dsZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtY2FyZC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtY2hlY2tib3gtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWNoaXBzLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC10YWJsZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtZGF0ZXBpY2tlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtZGlhbG9nLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1kaXZpZGVyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1leHBhbnNpb24tcGFuZWwtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWZvcm0tZmllbGQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWdyaWQtbGlzdC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtaWNvbi10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtaW5wdXQtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LWxpc3QtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LW1lbnUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXBhZ2luYXRvci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtcHJvZ3Jlc3MtYmFyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1wcm9ncmVzcy1zcGlubmVyLXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1yYWRpby10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc2VsZWN0LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1zaWRlbmF2LXRoZW1lKCR0aGVtZSk7XG4gIEBpbmNsdWRlIG1hdC1zbGlkZS10b2dnbGUtdGhlbWUoJHRoZW1lKTtcbiAgQGluY2x1ZGUgbWF0LXNsaWRlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc3RlcHBlci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc29ydC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdGFicy10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdG9vbGJhci10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdG9vbHRpcC10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtdHJlZS10aGVtZSgkdGhlbWUpO1xuICBAaW5jbHVkZSBtYXQtc25hY2stYmFyLXRoZW1lKCR0aGVtZSk7XG59XG4iLCJAaW1wb3J0ICd+QGFuZ3VsYXIvbWF0ZXJpYWwvdGhlbWluZyc7XG5cbkBpbmNsdWRlIG1hdC1jb3JlKCk7XG5cbi8vIFVzZWQgaHR0cDovL21jZy5tYml0c29uLmNvbSB0byBnZW5lcmF0ZSB0aGUgbWF0ZXJpYWwgcGFsZXR0ZS5cblxuLy8gIzVFMzVCMSAtLSBQUklNQVJZX0NPTE9SXG4kdmVyaWx5LXByaW1hcnk6IChcbiAgICA1MCA6ICNlY2U3ZjYsXG4gICAgMTAwIDogI2NmYzJlOCxcbiAgICAyMDAgOiAjYWY5YWQ4LFxuICAgIDMwMCA6ICM4ZTcyYzgsXG4gICAgNDAwIDogIzc2NTNiZCxcbiAgICA1MDAgOiAjNWUzNWIxLFxuICAgIDYwMCA6ICM1NjMwYWEsXG4gICAgNzAwIDogIzRjMjhhMSxcbiAgICA4MDAgOiAjNDIyMjk4LFxuICAgIDkwMCA6ICMzMTE2ODgsXG4gICAgQTEwMCA6ICNjYmJlZmYsXG4gICAgQTIwMCA6ICNhMzhiZmYsXG4gICAgQTQwMCA6ICM3YTU4ZmYsXG4gICAgQTcwMCA6ICM2NjNlZmYsXG4gICAgY29udHJhc3Q6IChcbiAgICAgICAgNTAgOiAjMDAwMDAwLFxuICAgICAgICAxMDAgOiAjMDAwMDAwLFxuICAgICAgICAyMDAgOiAjMDAwMDAwLFxuICAgICAgICAzMDAgOiAjMDAwMDAwLFxuICAgICAgICA0MDAgOiAjZmZmZmZmLFxuICAgICAgICA1MDAgOiAjZmZmZmZmLFxuICAgICAgICA2MDAgOiAjZmZmZmZmLFxuICAgICAgICA3MDAgOiAjZmZmZmZmLFxuICAgICAgICA4MDAgOiAjZmZmZmZmLFxuICAgICAgICA5MDAgOiAjZmZmZmZmLFxuICAgICAgICBBMTAwIDogIzAwMDAwMCxcbiAgICAgICAgQTIwMCA6ICMwMDAwMDAsXG4gICAgICAgIEE0MDAgOiAjZmZmZmZmLFxuICAgICAgICBBNzAwIDogI2ZmZmZmZixcbiAgICApXG4pO1xuXG5cbi8vICNDNDEwNjEgLS0gU0VDT05EQVJZX0NPTE9SXG4kdmVyaWx5LXNlY29uZGFyeTogKFxuICA1MCA6ICNmOGUyZWMsXG4gIDEwMCA6ICNlZGI3ZDAsXG4gIDIwMCA6ICNlMjg4YjAsXG4gIDMwMCA6ICNkNjU4OTAsXG4gIDQwMCA6ICNjZDM0NzksXG4gIDUwMCA6ICNjNDEwNjEsXG4gIDYwMCA6ICNiZTBlNTksXG4gIDcwMCA6ICNiNjBjNGYsXG4gIDgwMCA6ICNhZjA5NDUsXG4gIDkwMCA6ICNhMjA1MzMsXG4gIEExMDAgOiAjZmZjZGQ5LFxuICBBMjAwIDogI2ZmOWFiMixcbiAgQTQwMCA6ICNmZjY3OGIsXG4gIEE3MDAgOiAjZmY0ZDc3LFxuICBjb250cmFzdDogKFxuICAgICAgNTAgOiAjMDAwMDAwLFxuICAgICAgMTAwIDogIzAwMDAwMCxcbiAgICAgIDIwMCA6ICMwMDAwMDAsXG4gICAgICAzMDAgOiAjMDAwMDAwLFxuICAgICAgNDAwIDogI2ZmZmZmZixcbiAgICAgIDUwMCA6ICNmZmZmZmYsXG4gICAgICA2MDAgOiAjZmZmZmZmLFxuICAgICAgNzAwIDogI2ZmZmZmZixcbiAgICAgIDgwMCA6ICNmZmZmZmYsXG4gICAgICA5MDAgOiAjZmZmZmZmLFxuICAgICAgQTEwMCA6ICMwMDAwMDAsXG4gICAgICBBMjAwIDogIzAwMDAwMCxcbiAgICAgIEE0MDAgOiAjMDAwMDAwLFxuICAgICAgQTcwMCA6ICMwMDAwMDAsXG4gIClcbik7XG5cblxuXG5cbiR2ZXJpbHktYXBwLXByaW1hcnk6IG1hdC1wYWxldHRlKCR2ZXJpbHktcHJpbWFyeSk7XG4kdmVyaWx5LWFwcC1hY2NlbnQ6ICBtYXQtcGFsZXR0ZSgkdmVyaWx5LXNlY29uZGFyeSk7XG5cbiR2ZXJpbHktYXBwLXdhcm46ICAgIG1hdC1wYWxldHRlKCRtYXQtcmVkKTtcblxuJHZlcmlseS1hcHAtdGhlbWU6IG1hdC1saWdodC10aGVtZSgkdmVyaWx5LWFwcC1wcmltYXJ5LCAkdmVyaWx5LWFwcC1hY2NlbnQsICR2ZXJpbHktYXBwLXdhcm4pO1xuXG5AaW5jbHVkZSBhbmd1bGFyLW1hdGVyaWFsLXRoZW1lKCR2ZXJpbHktYXBwLXRoZW1lKTsiLCIvKiBEZWZhdWx0IEFuZ3VsYXIgTWF0ZXJpYWwgcHJlYnVpbHQgdGhlbWUuICovXG4vKiBUaGVtZSBmb3IgdGhlIHJpcHBsZSBlbGVtZW50cy4qL1xuLyogc3R5bGVsaW50LWRpc2FibGUgbWF0ZXJpYWwvbm8tcHJlZml4ZXMgKi9cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vXCIpO1xuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9TW9udHNlcnJhdFwiKTtcbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVdvcmsrU2Fuc1wiKTtcbi5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgZm9udC1zaXplOiA2cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBmb250LXNpemU6IDI0cHg7IH1cblxuLm1hdC1oMSwgLm1hdC1oZWFkbGluZSwgLm1hdC10eXBvZ3JhcGh5IGgxIHtcbiAgZm9udDogNDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwIDAgMTZweDsgfVxuXG4ubWF0LWgyLCAubWF0LXRpdGxlLCAubWF0LXR5cG9ncmFwaHkgaDIge1xuICBmb250OiA1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDMsIC5tYXQtc3ViaGVhZGluZy0yLCAubWF0LXR5cG9ncmFwaHkgaDMge1xuICBmb250OiA0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDQsIC5tYXQtc3ViaGVhZGluZy0xLCAubWF0LXR5cG9ncmFwaHkgaDQge1xuICBmb250OiA0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxNnB4OyB9XG5cbi5tYXQtaDUsIC5tYXQtdHlwb2dyYXBoeSBoNSB7XG4gIGZvbnQ6IDQwMCAxMS42MnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIG1hcmdpbjogMCAwIDEycHg7IH1cblxuLm1hdC1oNiwgLm1hdC10eXBvZ3JhcGh5IGg2IHtcbiAgZm9udDogNDAwIDkuMzhweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCAxMnB4OyB9XG5cbi5tYXQtYm9keS1zdHJvbmcsIC5tYXQtYm9keS0yIHtcbiAgZm9udDogNTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWJvZHksIC5tYXQtYm9keS0xLCAubWF0LXR5cG9ncmFwaHkge1xuICBmb250OiA0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG4gIC5tYXQtYm9keSBwLCAubWF0LWJvZHktMSBwLCAubWF0LXR5cG9ncmFwaHkgcCB7XG4gICAgbWFyZ2luOiAwIDAgMTJweDsgfVxuXG4ubWF0LXNtYWxsLCAubWF0LWNhcHRpb24ge1xuICBmb250OiA0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtZGlzcGxheS00LCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTQge1xuICBmb250OiAzMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIG1hcmdpbjogMCAwIDU2cHg7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wNWVtOyB9XG5cbi5tYXQtZGlzcGxheS0zLCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTMge1xuICBmb250OiA0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCA2NHB4O1xuICBsZXR0ZXItc3BhY2luZzogLTAuMDJlbTsgfVxuXG4ubWF0LWRpc3BsYXktMiwgLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0yIHtcbiAgZm9udDogNDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwIDAgNjRweDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAwNWVtOyB9XG5cbi5tYXQtZGlzcGxheS0xLCAubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTEge1xuICBmb250OiA0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBtYXJnaW46IDAgMCA2NHB4OyB9XG5cbi5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lciB7XG4gIGZvbnQ6IDQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1idXR0b24sIC5tYXQtcmFpc2VkLWJ1dHRvbiwgLm1hdC1pY29uLWJ1dHRvbiwgLm1hdC1zdHJva2VkLWJ1dHRvbixcbi5tYXQtZmxhdC1idXR0b24sIC5tYXQtZmFiLCAubWF0LW1pbmktZmFiIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtY2FyZCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWNhcmQtdGl0bGUge1xuICBmb250LXNpemU6IDI0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1jYXJkLWhlYWRlciAubWF0LWNhcmQtdGl0bGUge1xuICBmb250LXNpemU6IDIwcHg7IH1cblxuLm1hdC1jYXJkLXN1YnRpdGxlLFxuLm1hdC1jYXJkLWNvbnRlbnQge1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1jaGVja2JveCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVsIHtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7IH1cblxuLm1hdC1jaGlwIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNTAwOyB9XG4gIC5tYXQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbixcbiAgLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb24ge1xuICAgIGZvbnQtc2l6ZTogMThweDsgfVxuXG4ubWF0LXRhYmxlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtaGVhZGVyLWNlbGwge1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC1jZWxsLCAubWF0LWZvb3Rlci1jZWxsIHtcbiAgZm9udC1zaXplOiAxNHB4OyB9XG5cbi5tYXQtY2FsZW5kYXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5IHtcbiAgZm9udC1zaXplOiAxM3B4OyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCxcbi5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aCB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LWRpYWxvZy10aXRsZSB7XG4gIGZvbnQ6IDUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudCB7XG4gIGZvbnQ6IDQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1mb3JtLWZpZWxkIHtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBmb250LXdlaWdodDogNDAwO1xuICBsaW5lLWhlaWdodDogMS4xMjU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtd3JhcHBlciB7XG4gIHBhZGRpbmctYm90dG9tOiAxLjM0Mzc1ZW07IH1cblxuLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sXG4ubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbiB7XG4gIGZvbnQtc2l6ZTogMTUwJTtcbiAgbGluZS1oZWlnaHQ6IDEuMTI1OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbixcbi5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiB7XG4gIGhlaWdodDogMS41ZW07XG4gIHdpZHRoOiAxLjVlbTsgfVxuICAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLFxuICAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uIHtcbiAgICBoZWlnaHQ6IDEuMTI1ZW07XG4gICAgbGluZS1oZWlnaHQ6IDEuMTI1OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG4gIGJvcmRlci10b3A6IDAuODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzMzMzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIHtcbiAgdG9wOiAtMC44NDM3NWVtO1xuICBwYWRkaW5nLXRvcDogMC44NDM3NWVtOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gIHRvcDogMS4zNDM3NWVtOyB9XG5cbi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBib3R0b206IDEuMzQzNzVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xuICBmb250LXNpemU6IDc1JTtcbiAgbWFyZ2luLXRvcDogMC42NjY2NjY2N2VtO1xuICB0b3A6IGNhbGMoMTAwJSAtIDEuNzkxNjY2NjdlbSk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVyIHtcbiAgcGFkZGluZy1ib3R0b206IDEuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgcGFkZGluZzogMC40Mzc1ZW0gMDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzMzMzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlclxuLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpO1xuICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO1xuICB3aWR0aDogMTMzLjMzMzM1MzMzJTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdG9wOiAxLjI4MTI1ZW07IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBib3R0b206IDEuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIHtcbiAgbWFyZ2luLXRvcDogMC41NDE2NjY2N2VtO1xuICB0b3A6IGNhbGMoMTAwJSAtIDEuNjY2NjY2NjdlbSk7IH1cblxuQG1lZGlhIHByaW50IHtcbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSk7IH1cbiAgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbDotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpOyB9XG4gIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJcbi5tYXQtZm9ybS1maWVsZC1sYWJlbCB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSk7IH0gfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeCB7XG4gIHBhZGRpbmc6IDAuMjVlbSAwIDAuNzVlbSAwOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgdG9wOiAxLjA5Mzc1ZW07XG4gIG1hcmdpbi10b3A6IC0wLjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzMzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWluZml4IHtcbiAgcGFkZGluZzogMWVtIDAgMWVtIDA7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0b3A6IDEuODQzNzVlbTtcbiAgbWFyZ2luLXRvcDogLTAuMjVlbTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzMzMzMlOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyXG4ubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7XG4gIHdpZHRoOiAxMzMuMzMzMzQzMzMlOyB9XG5cbi5tYXQtZ3JpZC10aWxlLWhlYWRlcixcbi5tYXQtZ3JpZC10aWxlLWZvb3RlciB7XG4gIGZvbnQtc2l6ZTogMTRweDsgfVxuICAubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lLFxuICAubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIC5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMiksXG4gICAgLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDEycHg7IH1cblxuaW5wdXQubWF0LWlucHV0LWVsZW1lbnQge1xuICBtYXJnaW4tdG9wOiAtMC4wNjI1ZW07IH1cblxuLm1hdC1tZW51LWl0ZW0ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LXBhZ2luYXRvcixcbi5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2VyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDEycHg7IH1cblxuLm1hdC1yYWRpby1idXR0b24ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1zZWxlY3Qge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1zZWxlY3QtdHJpZ2dlciB7XG4gIGhlaWdodDogMS4xMjVlbTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LXN0ZXBwZXItdmVydGljYWwsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc3RlcC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDsgfVxuXG4ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yIHtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfVxuXG4ubWF0LXN0ZXAtbGFiZWwtZXJyb3Ige1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBmb250LXdlaWdodDogNTAwOyB9XG5cbi5tYXQtdGFiLWdyb3VwIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1saW5rIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC10b29sYmFyLFxuLm1hdC10b29sYmFyIGgxLFxuLm1hdC10b29sYmFyIGgyLFxuLm1hdC10b29sYmFyIGgzLFxuLm1hdC10b29sYmFyIGg0LFxuLm1hdC10b29sYmFyIGg1LFxuLm1hdC10b29sYmFyIGg2IHtcbiAgZm9udDogNTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgbWFyZ2luOiAwOyB9XG5cbi5tYXQtdG9vbHRpcCB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBwYWRkaW5nLXRvcDogNnB4O1xuICBwYWRkaW5nLWJvdHRvbTogNnB4OyB9XG5cbi5tYXQtdG9vbHRpcC1oYW5kc2V0IHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBwYWRkaW5nLXRvcDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogOHB4OyB9XG5cbi5tYXQtbGlzdC1pdGVtIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtbGlzdC1vcHRpb24ge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0ge1xuICBmb250LXNpemU6IDE2cHg7IH1cbiAgLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgfVxuICAgIC5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTZweDsgfVxuICAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0ge1xuICBmb250LXNpemU6IDEycHg7IH1cbiAgLm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiAgICAubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTJweDsgfVxuICAubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG4gICAgLm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDsgfVxuXG4ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1zdWJoZWFkZXIge1xuICBmb250LWZhbWlseTogUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDsgfVxuXG4ubWF0LW9wdGlvbiB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNnB4OyB9XG5cbi5tYXQtb3B0Z3JvdXAtbGFiZWwge1xuICBmb250OiA1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtc2ltcGxlLXNuYWNrYmFyIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO1xuICBmb250LXNpemU6IDE0cHg7IH1cblxuLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICBmb250LXNpemU6IGluaGVyaXQ7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7IH1cblxuLm1hdC10cmVlIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmOyB9XG5cbi5tYXQtdHJlZS1ub2RlLFxuLm1hdC1uZXN0ZWQtdHJlZS1ub2RlIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zaXplOiAxNHB4OyB9XG5cbi5tYXQtcmlwcGxlIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7IH1cblxuLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSwgdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfVxuICBAbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7IH0gfVxuXG4uY2RrLXZpc3VhbGx5LWhpZGRlbiB7XG4gIGJvcmRlcjogMDtcbiAgY2xpcDogcmVjdCgwIDAgMCAwKTtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogLTFweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMXB4O1xuICBvdXRsaW5lOiAwO1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIC1tb3otYXBwZWFyYW5jZTogbm9uZTsgfVxuXG4uY2RrLW92ZXJsYXktY29udGFpbmVyLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlOyB9XG5cbi5jZGstb3ZlcmxheS1jb250YWluZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDEwMDA7IH1cbiAgLmNkay1vdmVybGF5LWNvbnRhaW5lcjplbXB0eSB7XG4gICAgZGlzcGxheTogbm9uZTsgfVxuXG4uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwMDA7IH1cblxuLmNkay1vdmVybGF5LXBhbmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIG1heC1oZWlnaHQ6IDEwMCU7IH1cblxuLmNkay1vdmVybGF5LWJhY2tkcm9wIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG4gIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO1xuICBvcGFjaXR5OiAwOyB9XG4gIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICBvcGFjaXR5OiAxOyB9XG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgICAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIHtcbiAgICAgICAgb3BhY2l0eTogMC42OyB9IH1cblxuLmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3Age1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOyB9XG5cbi5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcge1xuICBvcGFjaXR5OiAwOyB9XG5cbi5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxMDAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBtaW4td2lkdGg6IDFweDtcbiAgbWluLWhlaWdodDogMXB4OyB9XG5cbi5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3cteTogc2Nyb2xsOyB9XG5cbkBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQge1xuICAvKiEqLyB9XG5cbkBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIHtcbiAgLyohKi8gfVxuXG4uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGwge1xuICBhbmltYXRpb24tbmFtZTogY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQ7IH1cblxuLmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpIHtcbiAgYW5pbWF0aW9uLW5hbWU6IGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZDsgfVxuXG50ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUge1xuICByZXNpemU6IG5vbmU7IH1cblxudGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZyB7XG4gIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gIHBhZGRpbmc6IDJweCAwICFpbXBvcnRhbnQ7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7IH1cblxuLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xKTsgfVxuXG4ubWF0LW9wdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG4gIC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCkge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7IH1cbiAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuICAubWF0LW9wdGlvbi5tYXQtYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpO1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG4gIC5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWQge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94IHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cbiAgLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVyIHtcbiAgICBjb2xvcjogI2ZhZmFmYTsgfVxuXG4ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gIGNvbG9yOiAjYjBiMGIwOyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsXG4ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLFxuLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxcbi5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjYzQxMDYxOyB9XG5cbi5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjNWUzNWIxOyB9XG5cbi5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLFxuLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUge1xuICBiYWNrZ3JvdW5kOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCxcbi5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCB7XG4gIGJhY2tncm91bmQ6ICNiMGIwYjA7IH1cblxuLm1hdC1lbGV2YXRpb24tejAge1xuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejEge1xuICBib3gtc2hhZG93OiAwcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyIHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MyB7XG4gIGJveC1zaGFkb3c6IDBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejQge1xuICBib3gtc2hhZG93OiAwcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16NSB7XG4gIGJveC1zaGFkb3c6IDBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo2IHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo3IHtcbiAgYm94LXNoYWRvdzogMHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo4IHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXo5IHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxMCB7XG4gIGJveC1zaGFkb3c6IDBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejExIHtcbiAgYm94LXNoYWRvdzogMHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MTIge1xuICBib3gtc2hhZG93OiAwcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxMyB7XG4gIGJveC1zaGFkb3c6IDBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejE0IHtcbiAgYm94LXNoYWRvdzogMHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MTUge1xuICBib3gtc2hhZG93OiAwcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxNiB7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxNyB7XG4gIGJveC1zaGFkb3c6IDBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxOCB7XG4gIGJveC1zaGFkb3c6IDBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoxOSB7XG4gIGJveC1zaGFkb3c6IDBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyMCB7XG4gIGJveC1zaGFkb3c6IDBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MjEge1xuICBib3gtc2hhZG93OiAwcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1lbGV2YXRpb24tejIyIHtcbiAgYm94LXNoYWRvdzogMHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZWxldmF0aW9uLXoyMyB7XG4gIGJveC1zaGFkb3c6IDBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWVsZXZhdGlvbi16MjQge1xuICBib3gtc2hhZG93OiAwcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1hcHAtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlciB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLm1hdC1hdXRvY29tcGxldGUtcGFuZWwge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcikge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlOyB9XG4gICAgLm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSB7XG4gICAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWJhZGdlLWNvbnRlbnQge1xuICBjb2xvcjogd2hpdGU7XG4gIGJhY2tncm91bmQ6ICM1ZTM1YjE7IH1cbiAgQG1lZGlhICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSB7XG4gICAgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgICAgIG91dGxpbmU6IHNvbGlkIDFweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7IH0gfVxuXG4ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjYzQxMDYxO1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgYmFja2dyb3VuZDogI2Y0NDMzNjsgfVxuXG4ubWF0LWJhZGdlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlOyB9XG5cbi5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGRpc3BsYXk6IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBiYWNrZ3JvdW5kOiAjYjliOWI5O1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWJhZGdlLWNvbnRlbnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmUge1xuICB0cmFuc2Zvcm06IG5vbmU7IH1cblxuLm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB3aWR0aDogMTZweDtcbiAgaGVpZ2h0OiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTZweDsgfVxuXG4ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB0b3A6IC04cHg7IH1cblxuLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgYm90dG9tOiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiAtMTZweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogYXV0bztcbiAgcmlnaHQ6IC0xNnB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMTZweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnQge1xuICByaWdodDogYXV0bztcbiAgbGVmdDogLTE2cHg7IH1cblxuLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IC04cHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IGF1dG87XG4gIHJpZ2h0OiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtOHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiBhdXRvO1xuICBsZWZ0OiAtOHB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGxpbmUtaGVpZ2h0OiAyMnB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICB0b3A6IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBib3R0b206IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogLTIycHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTIycHg7IH1cblxuLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMjJweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IGF1dG87XG4gIGxlZnQ6IC0yMnB4OyB9XG5cbi5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogLTExcHg7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTExcHg7IH1cblxuLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMTFweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IGF1dG87XG4gIGxlZnQ6IC0xMXB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgd2lkdGg6IDI4cHg7XG4gIGhlaWdodDogMjhweDtcbiAgbGluZS1oZWlnaHQ6IDI4cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgdG9wOiAtMTRweDsgfVxuXG4ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBib3R0b206IC0xNHB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiAtMjhweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgbGVmdDogYXV0bztcbiAgcmlnaHQ6IC0yOHB4OyB9XG5cbi5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiAtMjhweDsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnQge1xuICByaWdodDogYXV0bztcbiAgbGVmdDogLTI4cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIGxlZnQ6IC0xNHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnQge1xuICBsZWZ0OiBhdXRvO1xuICByaWdodDogLTE0cHg7IH1cblxuLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50IHtcbiAgcmlnaHQ6IC0xNHB4OyB9XG5cbltkaXI9J3J0bCddIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudCB7XG4gIHJpZ2h0OiBhdXRvO1xuICBsZWZ0OiAtMTRweDsgfVxuXG4ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXIge1xuICBib3gtc2hhZG93OiAwcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtYnV0dG9uLCAubWF0LWljb24tYnV0dG9uLCAubWF0LXN0cm9rZWQtYnV0dG9uIHtcbiAgY29sb3I6IGluaGVyaXQ7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XG4gIC5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5IHtcbiAgICBjb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtYWNjZW50LCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCB7XG4gICAgY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1idXR0b24ubWF0LXdhcm4sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4ge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG4gIC5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuICAubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cbiAgLm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIG9wYWNpdHk6IDAuMTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7IH1cblxuLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSB7XG4gIGJhY2tncm91bmQ6IGJsYWNrOyB9XG5cbi5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZmxhdC1idXR0b24sIC5tYXQtcmFpc2VkLWJ1dHRvbiwgLm1hdC1mYWIsIC5tYXQtbWluaS1mYWIge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWZhYi5tYXQtcHJpbWFyeSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSB7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtZmFiLm1hdC1hY2NlbnQsIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCB7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwgLm1hdC1mYWIubWF0LXdhcm4sIC5tYXQtbWluaS1mYWIubWF0LXdhcm4ge1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LCAubWF0LWZhYi5tYXQtcHJpbWFyeSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQsIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LCAubWF0LWZhYi5tYXQtYWNjZW50LCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLCAubWF0LWZhYi5tYXQtd2FybiwgLm1hdC1taW5pLWZhYi5tYXQtd2FybiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsgfVxuICAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyB9XG4gIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyB9XG5cbi5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSwgLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LXJhaXNlZC1idXR0b246bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgYm94LXNoYWRvdzogMHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWZhYjpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pLCAubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICBib3gtc2hhZG93OiAwcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pLCAubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gIGJveC1zaGFkb3c6IDBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICBib3gtc2hhZG93OiAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAge1xuICBib3gtc2hhZG93OiAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gIGJveC1zaGFkb3c6IG5vbmU7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cbiAgLm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7XG4gIGJhY2tncm91bmQ6IHdoaXRlOyB9XG4gIC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUgKyAubWF0LWJ1dHRvbi10b2dnbGUge1xuICBib3JkZXItbGVmdDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuW2Rpcj0ncnRsJ10gLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlICsgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gIGJvcmRlci1yaWdodDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlICsgLm1hdC1idXR0b24tdG9nZ2xlIHtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gIGJvcmRlci1yaWdodDogbm9uZTtcbiAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjU0KTsgfVxuICAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsgfVxuICAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7IH1cbiAgLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7IH1cblxuLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxcbi5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIHtcbiAgYm9yZGVyOiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWNhcmQge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1jYXJkOm5vdChbY2xhc3MqPSdtYXQtZWxldmF0aW9uLXonXSkge1xuICAgIGJveC1zaGFkb3c6IDBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1jYXJkLm1hdC1jYXJkLWZsYXQ6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtY2FyZC1zdWJ0aXRsZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2hlY2tib3gtZnJhbWUge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1jaGVja2JveC1jaGVja21hcmsge1xuICBmaWxsOiAjZmFmYWZhOyB9XG5cbi5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgge1xuICBzdHJva2U6ICNmYWZhZmEgIWltcG9ydGFudDsgfVxuICBAbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBibGFjay1vbi13aGl0ZSkge1xuICAgIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgge1xuICAgICAgc3Ryb2tlOiAjMDAwICFpbXBvcnRhbnQ7IH0gfVxuXG4ubWF0LWNoZWNrYm94LW1peGVkbWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7IH1cblxuLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNiMGIwYjA7IH1cblxuLm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1lIHtcbiAgYm9yZGVyLWNvbG9yOiAjYjBiMGIwOyB9XG5cbi5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbkBtZWRpYSAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSkge1xuICAubWF0LWNoZWNrYm94LWRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7IH0gfVxuXG5AbWVkaWEgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpIHtcbiAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lOyB9IH1cblxuLm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1jaGVja2JveDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWNoZWNrYm94Om5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmUge1xuICAgIGJveC1zaGFkb3c6IDBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXIge1xuICAgIG9wYWNpdHk6IDAuNTQ7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjQ7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlciB7XG4gICAgYmFja2dyb3VuZDogYmxhY2s7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3ZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3ZlIHtcbiAgICBjb2xvcjogd2hpdGU7XG4gICAgb3BhY2l0eTogMC40OyB9XG4gIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxO1xuICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZSB7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIG9wYWNpdHk6IDAuNDsgfVxuICAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IH1cblxuLm1hdC10YWJsZSB7XG4gIGJhY2tncm91bmQ6IHdoaXRlOyB9XG5cbi5tYXQtdGFibGUgdGhlYWQsIC5tYXQtdGFibGUgdGJvZHksIC5tYXQtdGFibGUgdGZvb3QsXG5tYXQtaGVhZGVyLXJvdywgbWF0LXJvdywgbWF0LWZvb3Rlci1yb3csXG5bbWF0LWhlYWRlci1yb3ddLCBbbWF0LXJvd10sIFttYXQtZm9vdGVyLXJvd10sXG4ubWF0LXRhYmxlLXN0aWNreSB7XG4gIGJhY2tncm91bmQ6IGluaGVyaXQ7IH1cblxubWF0LXJvdywgbWF0LWhlYWRlci1yb3csIG1hdC1mb290ZXItcm93LFxudGgubWF0LWhlYWRlci1jZWxsLCB0ZC5tYXQtY2VsbCwgdGQubWF0LWZvb3Rlci1jZWxsIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWhlYWRlci1jZWxsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1jZWxsLCAubWF0LWZvb3Rlci1jZWxsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1jYWxlbmRhci1hcnJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1kYXRlcGlja2VyLXRvZ2dsZSxcbi5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b24sXG4ubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXIge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxuXG4ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLFxuLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLFxuLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDQpOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCkge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xOCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoOTQsIDUzLCAxNzcsIDAuNCk7IH1cblxuLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkIHtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHdoaXRlOyB9XG5cbi5tYXQtZGF0ZXBpY2tlci1jb250ZW50IHtcbiAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTtcbiAgICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQgPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTk2LCAxNiwgOTcsIDAuNCk7IH1cbiAgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB3aGl0ZTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7XG4gICAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDQsIDY3LCA1NCwgMC40KTsgfVxuICAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQge1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCB3aGl0ZTsgfVxuXG4ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaCB7XG4gIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnQge1xuICAgIGNvbG9yOiAjYzQxMDYxOyB9XG4gIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuIHtcbiAgICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWRpYWxvZy1jb250YWluZXIge1xuICBib3gtc2hhZG93OiAwcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWRpdmlkZXIge1xuICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtZGl2aWRlci12ZXJ0aWNhbCB7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbCB7XG4gIGJhY2tncm91bmQ6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj0nbWF0LWVsZXZhdGlvbi16J10pIHtcbiAgICBib3gtc2hhZG93OiAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtYWN0aW9uLXJvdyB7XG4gIGJvcmRlci10b3AtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSkuY2RrLWtleWJvYXJkLWZvY3VzZWQsIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pLmNkay1wcm9ncmFtLWZvY3VzZWQsIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6bm90KFthcmlhLWRpc2FibGVkPSd0cnVlJ10pOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG5AbWVkaWEgKGhvdmVyOiBub25lKSB7XG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSlcbi5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7IH0gfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sXG4ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9J3RydWUnXSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjYpOyB9XG4gIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPSd0cnVlJ10gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLFxuICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD0ndHJ1ZSddIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiB7XG4gICAgY29sb3I6IGluaGVyaXQ7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsgfVxuXG4ubWF0LWhpbnQge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnQge1xuICAgIGNvbG9yOiAjYzQxMDYxOyB9XG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm4ge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWUzNWIxOyB9XG4gIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cbiAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm4ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVyIHtcbiAgY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuICAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudCxcbiAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIge1xuICAgIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZXJyb3Ige1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtaGludCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0cHggMTAwJTtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDIpOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUge1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7XG4gIGJhY2tncm91bmQtc2l6ZTogNHB4IDEwMCU7XG4gIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1mbGV4IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjAyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayB7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDYpOyB9XG5cbi5tYXQtaWNvbi5tYXQtcHJpbWFyeSB7XG4gIGNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtaWNvbi5tYXQtYWNjZW50IHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC1pY29uLm1hdC13YXJuIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxcbi5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXIge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWlucHV0LWVsZW1lbnQge1xuICBjYXJldC1jb2xvcjogIzVlMzViMTsgfVxuICAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQyKTsgfVxuICAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDIpOyB9XG4gIC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cbiAgLm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50IHtcbiAgY2FyZXQtY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxcbi5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudCB7XG4gIGNhcmV0LWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlciB7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cblxuLm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1saXN0LWl0ZW0tZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyB9XG5cbi5tYXQtbGlzdC1vcHRpb246aG92ZXIsIC5tYXQtbGlzdC1vcHRpb246Zm9jdXMsXG4ubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLFxuLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cyxcbi5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsXG4ubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3VzIHtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA0KTsgfVxuXG4ubWF0LW1lbnUtcGFuZWwge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTsgfVxuICAubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1tZW51LWl0ZW0ge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVyIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsXG4ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLFxuLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksXG4ubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksXG4ubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSkge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cblxuLm1hdC1wYWdpbmF0b3IsXG4ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlciB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxcbi5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpO1xuICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxcbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCxcbi5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWZpcnN0LFxuLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdCB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgZmlsbDogI2NmYzJlODsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2ZjMmU4OyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzVlMzViMTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmQge1xuICBmaWxsOiAjZWRiN2QwOyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VkYjdkMDsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIHtcbiAgZmlsbDogI2ZmY2RkMjsgfVxuXG4ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZjZGQyOyB9XG5cbi5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLCAubWF0LXNwaW5uZXIgY2lyY2xlIHtcbiAgc3Ryb2tlOiAjNWUzNWIxOyB9XG5cbi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlIHtcbiAgc3Ryb2tlOiAjYzQxMDYxOyB9XG5cbi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGUsIC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGUge1xuICBzdHJva2U6ICNmNDQzMzY7IH1cblxuLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41NCk7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUge1xuICBib3JkZXItY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeTphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQ6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlIHtcbiAgYm9yZGVyLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLFxuLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm46YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCxcbi5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzgpOyB9XG5cbi5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LXNlbGVjdC12YWx1ZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40Mik7IH1cblxuLm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtdmFsdWUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNlbGVjdC1hcnJvdyB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtc2VsZWN0LXBhbmVsIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cbiAgLm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9J21hdC1lbGV2YXRpb24teiddKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSkge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93IHtcbiAgY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogI2Y0NDMzNjsgfVxuXG4ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93IHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3cge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LWRyYXdlci1jb250YWluZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LWRyYXdlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuICAubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2gge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1zaWRlKSB7XG4gICAgYm94LXNoYWRvdzogMHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1kcmF3ZXItc2lkZSB7XG4gIGJvcmRlci1yaWdodDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cbiAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZCB7XG4gICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgIGJvcmRlci1yaWdodDogbm9uZTsgfVxuXG5bZGlyPSdydGwnXSAubWF0LWRyYXdlci1zaWRlIHtcbiAgYm9yZGVyLWxlZnQ6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBib3JkZXItcmlnaHQ6IG5vbmU7IH1cbiAgW2Rpcj0ncnRsJ10gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZCB7XG4gICAgYm9yZGVyLWxlZnQ6IG5vbmU7XG4gICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpOyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5NiwgMTYsIDk3LCAwLjU0KTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSg5NCwgNTMsIDE3NywgMC41NCk7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ0LCA2NywgNTQsIDAuNTQpOyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWNoZWNrZWQpIC5tYXQtcmlwcGxlLWVsZW1lbnQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgfVxuXG4ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYiB7XG4gIGJveC1zaGFkb3c6IDBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7IH1cblxuLm1hdC1zbGlkZS10b2dnbGUtYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuXG4ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbi5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYixcbi5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxcbi5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLFxuLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzQxMDYxOyB9XG5cbi5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQge1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsXG4ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0IHtcbiAgY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5NiwgMTYsIDk3LCAwLjIpOyB9XG5cbi5tYXQtc2xpZGVyOmhvdmVyIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsXG4uY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCxcbi5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsXG4ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItZGlzYWJsZWQ6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsXG4ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLFxuLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNik7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cblxuLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWIsIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI2KTsgfVxuXG4ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXIge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC43KTsgfVxuXG4ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7XG4gIGJhY2tncm91bmQtaW1hZ2U6IC1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpOyB9XG5cbi5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzIHtcbiAgYmFja2dyb3VuZC1pbWFnZTogcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCwgLm1hdC1zdGVwLWhlYWRlcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNCk7IH1cblxuQG1lZGlhIChob3Zlcjogbm9uZSkge1xuICAubWF0LXN0ZXAtaGVhZGVyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lOyB9IH1cblxuLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtbGFiZWwsXG4ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbCB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNTQpO1xuICBjb2xvcjogd2hpdGU7IH1cblxuLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCxcbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZSxcbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yIHtcbiAgY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC1zdGVwcGVyLWhvcml6b250YWwsIC5tYXQtc3RlcHBlci12ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lOjpiZWZvcmUge1xuICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSxcbi5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YWZ0ZXIsXG4ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjEyKTsgfVxuXG4ubWF0LXNvcnQtaGVhZGVyLWFycm93IHtcbiAgY29sb3I6ICM3NTc1NzU7IH1cblxuLm1hdC10YWItbmF2LWJhcixcbi5tYXQtdGFiLWhlYWRlciB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLFxuLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBib3JkZXItYm90dG9tOiBub25lOyB9XG5cbi5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1saW5rIHtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM4KTsgfVxuXG4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODcpOyB9XG5cbi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zOCk7IH1cblxuLm1hdC10YWItZ3JvdXBbY2xhc3MqPSdtYXQtYmFja2dyb3VuZC0nXSAubWF0LXRhYi1oZWFkZXIsXG4ubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj0nbWF0LWJhY2tncm91bmQtJ10ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICBib3JkZXItdG9wOiBub25lOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMDcsIDE5NCwgMjMyLCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWUzNWIxOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzcsIDE4MywgMjA4LCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M0MTA2MTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjA1LCAyMTAsIDAuMyk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNDQzMzY7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwNywgMTk0LCAyMzIsIDAuMyk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3MsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1ZTM1YjE7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rIHtcbiAgY29sb3I6IHdoaXRlOyB9XG4gIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkIHtcbiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHdoaXRlOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzcsIDE4MywgMjA4LCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNjNDEwNjE7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsge1xuICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiB7XG4gIGJvcmRlci1jb2xvcjogd2hpdGU7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24ge1xuICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxcbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksXG4ubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLFxuLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDIwNSwgMjEwLCAwLjMpOyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtzLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjQ0MzM2OyB9XG5cbi5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluaywgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluayB7XG4gIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCB7XG4gICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiB3aGl0ZTsgfVxuXG4ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7IH1cblxuLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7IH1cblxuLm1hdC10b29sYmFyIHtcbiAgYmFja2dyb3VuZDogd2hpdGVzbW9rZTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44Nyk7IH1cbiAgLm1hdC10b29sYmFyLm1hdC1wcmltYXJ5IHtcbiAgICBiYWNrZ3JvdW5kOiAjNWUzNWIxO1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRvb2xiYXIubWF0LWFjY2VudCB7XG4gICAgYmFja2dyb3VuZDogI2M0MTA2MTtcbiAgICBjb2xvcjogd2hpdGU7IH1cbiAgLm1hdC10b29sYmFyLm1hdC13YXJuIHtcbiAgICBiYWNrZ3JvdW5kOiAjZjQ0MzM2O1xuICAgIGNvbG9yOiB3aGl0ZTsgfVxuICAubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSxcbiAgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsXG4gIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogY3VycmVudENvbG9yOyB9XG4gIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtbGFiZWwsXG4gIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLFxuICAubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsXG4gIC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC1hcnJvdyxcbiAgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvdyB7XG4gICAgY29sb3I6IGluaGVyaXQ7IH1cbiAgLm1hdC10b29sYmFyIC5tYXQtaW5wdXQtZWxlbWVudCB7XG4gICAgY2FyZXQtY29sb3I6IGN1cnJlbnRDb2xvcjsgfVxuXG4ubWF0LXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiByZ2JhKDk3LCA5NywgOTcsIDAuOSk7IH1cblxuLm1hdC10cmVlIHtcbiAgYmFja2dyb3VuZDogd2hpdGU7IH1cblxuLm1hdC10cmVlLW5vZGUsXG4ubWF0LW5lc3RlZC10cmVlLW5vZGUge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjg3KTsgfVxuXG4ubWF0LXNuYWNrLWJhci1jb250YWluZXIge1xuICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICBiYWNrZ3JvdW5kOiAjMzIzMjMyO1xuICBib3gtc2hhZG93OiAwcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7IH1cblxuLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIHtcbiAgY29sb3I6ICNjNDEwNjE7IH1cblxuLyogVmVyaWx5IGJyYW5kaW5nIGJhc2ljcyAqL1xuKiB7XG4gIGZvbnQtZmFtaWx5OiAnV29yayBTYW5zJywgc2Fucy1zZXJpZjsgfVxuXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucyc7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgc3JjOiBsb2NhbChcIk1hdGVyaWFsIEljb25zXCIpLCBsb2NhbChcIk1hdGVyaWFsSWNvbnMtUmVndWxhclwiKSwgdXJsKC4vYXNzZXRzL21hdGVyaWFsX2ljb25zL01hdGVyaWFsSWNvbnMtUmVndWxhci53b2ZmKSBmb3JtYXQoXCJ3b2ZmXCIpOyB9XG5cbi5tYXRlcmlhbC1pY29ucyB7XG4gIGZvbnQtZmFtaWx5OiAnTWF0ZXJpYWwgSWNvbnMnO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgLyogUHJlZmVycmVkIGljb24gc2l6ZSAqL1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgd29yZC13cmFwOiBub3JtYWw7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGRpcmVjdGlvbjogbHRyO1xuICAvKiBTdXBwb3J0IGZvciBhbGwgV2ViS2l0IGJyb3dzZXJzLiAqL1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLyogU3VwcG9ydCBmb3IgU2FmYXJpIGFuZCBDaHJvbWUuICovXG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIC8qIFN1cHBvcnQgZm9yIEZpcmVmb3guICovXG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG4gIC8qIFN1cHBvcnQgZm9yIElFLiAqL1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6ICdsaWdhJzsgfVxuXG4vKiBBZGRlZCBmb3IgbmcyLWRyYWd1bGEgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZzItZHJhZ3VsYSAqL1xuLyogaW4tZmxpZ2h0IGNsb25lICovXG4uZ3UtbWlycm9yIHtcbiAgLW1zLWZpbHRlcjogXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0xMDApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0xMDApO1xuICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgb3BhY2l0eTogMSAhaW1wb3J0YW50O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDk5OTkgIWltcG9ydGFudDsgfVxuXG4vKiBoaWdoLXBlcmZvcm1hbmNlIGRpc3BsYXk6bm9uZTsgaGVscGVyICovXG4uZ3UtaGlkZSB7XG4gIGxlZnQ6IC05OTk5cHggIWltcG9ydGFudDsgfVxuXG4vKiBhZGRlZCB0byBtaXJyb3JDb250YWluZXIgKGRlZmF1bHQgPSBib2R5KSB3aGlsZSBkcmFnZ2luZyAqL1xuLmd1LXVuc2VsZWN0YWJsZSB7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZSAhaW1wb3J0YW50O1xuICAtbW96LXVzZXItc2VsZWN0OiBub25lICFpbXBvcnRhbnQ7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgdXNlci1zZWxlY3Q6IG5vbmUgIWltcG9ydGFudDtcbiAgY3Vyc29yOiBncmFiYmluZyAhaW1wb3J0YW50O1xuICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7XG4gIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsgfVxuXG4vKiBhZGRlZCB0byB0aGUgc291cmNlIGVsZW1lbnQgd2hpbGUgaXRzIG1pcnJvciBpcyBkcmFnZ2VkICovXG4uZ3UtdHJhbnNpdCB7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MjApXCI7XG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT0yMCk7XG4gIG9wYWNpdHk6IDAuMjsgfVxuXG4ubWF0LWFwcC1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDtcbiAgLyogR3JleSA5MDAgKi8gfVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwcHg7IH1cbiJdfQ== */\", '', '']]","\nvar content = require(\"!!../../@angular-devkit/build-angular/src/angular-cli-files/plugins/raw-css-loader.js!../../postcss-loader/src/index.js??embedded!./dragula.css\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../@angular-devkit/build-angular/src/angular-cli-files/plugins/raw-css-loader.js!../../postcss-loader/src/index.js??embedded!./dragula.css\", function() {\n\t\tvar newContent = require(\"!!../../@angular-devkit/build-angular/src/angular-cli-files/plugins/raw-css-loader.js!../../postcss-loader/src/index.js??embedded!./dragula.css\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getTarget = function (target, parent) {\n if (parent){\n return parent.querySelector(target);\n }\n return document.querySelector(target);\n};\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(target, parent) {\n // If passing function in options, then use it for resolve \"head\" element.\n // Useful for Shadow Root style i.e\n // {\n // insertInto: function () { return document.querySelector(\"#foo\").shadowRoot }\n // }\n if (typeof target === 'function') {\n return target();\n }\n if (typeof memo[target] === \"undefined\") {\n\t\t\tvar styleTarget = getTarget.call(this, target, parent);\n\t\t\t// Special case to return head of iframe instead of iframe itself\n\t\t\tif (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n\t\t\t\ttry {\n\t\t\t\t\t// This will throw an exception if access to iframe is blocked\n\t\t\t\t\t// due to cross-origin restrictions\n\t\t\t\t\tstyleTarget = styleTarget.contentDocument.head;\n\t\t\t\t} catch(e) {\n\t\t\t\t\tstyleTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmemo[target] = styleTarget;\n\t\t}\n\t\treturn memo[target]\n\t};\n})();\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = require(\"./urls\");\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of